Ich muss HMAC-SHA1 in Objective C generieren. Aber ich habe nichts gefunden, was funktioniert. Ich habe es mit CommonCrypto unter Verwendung von CCHMAC versucht, aber es hat nicht funktioniert. Ich muss einen hmac generieren und danach eine HOTP-Nummer generieren.
Hat jemand Beispielcode in Objective C oder C?
Ich verstehe nicht, warum Sie die base64Encoding verwenden, wenn wir nur eine Zeichenfolge des generierten Hashs haben möchten. Können Sie das erklären, denn am Ende erhalten wir ein base64-kodiertes hmac-sha256, statt eines hmac-sha256…
– Bruno
10. Oktober 2011 um 18:17 Uhr
@bruno falls du es nicht bemerkt hast, deine Antwort wurde gelöscht und in einen Kommentar umgewandelt. Wenn Sie mehr zu posten haben, posten Sie es als neue Antwort.
Mir ist keine HOTP-Bibliothek bekannt, aber der Algorithmus war ziemlich einfach, wenn ich mich richtig erinnere.
base64Encoding in Objekt c? Ich habe versucht, es zu kompilieren, aber ich erhalte eine Fehlermeldung in dieser Zeile. [HMAC base64Encoding];
– Helena
16. April 2009 um 18:59 Uhr
@Helena: Hoppla, base64Encoding stammt von einem benutzerdefinierten NSData-Protokoll. =) Ich bin froh, dass der Rest des Codes funktioniert hat.
– Kann Berk Güder
16. April 2009 um 23:20 Uhr
Beachten Sie, dass Sie auf NSData in GHKit eine Base-64-Codierungskategoriemethode finden können. Sehen: github.com/gabriel/gh-kit. Die Methode ist ‘-gh_base64’ und gibt einen NSString zurück. Verwenden Sie dies anstelle des Kategoriemethodenaufrufs „base64Encoding“ im obigen Beispiel, wenn Sie nicht dieselbe Kategorie wie der Autor haben.
– idStar
2. August 2012 um 15:33 Uhr
Ich mochte den Basis-64-“Zusatz”, weil ich diesen mit HMAC-SHA1 für OAuth verwenden kann.
– spstanley
12. Oktober 2012 um 14:20 Uhr
Beachten Sie, dass dies Sha256 ist, nicht Sha1, siehe Zivic Sanels Antwort
– Colin
6. März 2013 um 13:52 Uhr
Zsivic Sanel
So können Sie generieren HMAC-SHA1 base64.
Sie müssen Ihrem Projekt Base64.h und Base64.m hinzufügen. Sie können es von bekommen hier.
Wenn Sie ARC verwenden, werden einige Fehler in Base64.m angezeigt. Finden Sie die Zeilen, die ähnlich sind wie diese
Sie müssen keine base64-Bibliothek eines Drittanbieters einschließen, da sie bereits codiert ist.
Sind Sie sicher, dass dies bereits Base 64-codiert ist? Was macht es Base 64-codiert? Tut mir leid, Sie zu stören, aber ich behebe meine Schwierigkeiten beim Generieren einer OAuth-Signatur. Ich habe versucht, Ihren Algorithmus zu verwenden, aber mir ist klar, dass ich nicht weiß / sehe, wo er Base 64-codiert ist.
– Hallo b
4. Februar 2016 um 17:13 Uhr
⚠️ Warnung an die Copy-Paster: Seien Sie vorsichtig mit dem Kodierungstyp!! Ich habe Emoji-Zeichen codiert und gewechselt NSASCIIStringEncoding zu NSUTF16StringEncoding die nach jedem Zeichen Nullterminatoren in das zurückgegebene c-Array einführte, führend strlen zu denken, dass die Länge des Arrays 1 war, was dazu führte, dass der HMAC nur auf dem ersten Zeichen basierte.
– Warplen
24. März 2017 um 3:09 Uhr
Was ist CCHmac?
– Harish Pathak
29. September 2017 um 9:28 Uhr
Diese Antwort verwendet sha256, wobei die Frage nach sha1 fragt. Überraschenderweise hat in den letzten 6 Jahren niemand darauf hingewiesen?
Es wurde in xCode 5 mit iOS 7 getestet und funktioniert einwandfrei!
Das funktioniert gut für mich … Danke …
– Urkman
28. Juli 2014 um 8:56 Uhr
Danke, es funktioniert für mich..
– Vivek Yadav
28. Oktober 2014 um 6:21 Uhr
VERWENDE NICHT NSASCIIStringEncoding. Verwenden NSUTF8StringEncoding wenn Sie Zeichen in nicht englischen Sprachen unterstützen möchten.
– Alex Zavatone
7. Februar 2020 um 16:35 Uhr
Dies sollte die akzeptierte Antwort sein. Die anderen beliebten Antworten geben entweder einen base64-codierten Wert zurück oder verwenden sha256, nach dem die Frage nicht fragt.
– Dollardime
22. September 2020 um 18:22 Uhr
Rafael Bugajewski
Ich verbringe einen ganzen Tag damit, den generierten Hash (Bytes) in lesbare Daten umzuwandeln. Ich habe die base64-codierte Lösung aus der obigen Antwort verwendet und sie hat bei mir überhaupt nicht funktioniert (übrigens benötigen Sie eine externe .h, um die base64-Codierung verwenden zu können, die ich hatte).
Also, was ich getan habe, war das (was perfekt ohne eine externe .h funktioniert):
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
// Now convert to NSData structure to make it usable again
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];
// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);
Das funktioniert gut für mich … Danke …
– Urkmann
28. Juli 2014 um 8:56 Uhr
Danke, es funktioniert für mich..
– Vivek Yadav
28. Oktober 2014 um 6:21 Uhr
VERWENDE NICHT NSASCIIStringEncoding. Verwenden NSUTF8StringEncoding wenn Sie Zeichen in nicht englischen Sprachen unterstützen möchten.
– Alex Zavatone
7. Februar 2020 um 16:35 Uhr
Dies sollte die akzeptierte Antwort sein. Die anderen beliebten Antworten geben entweder einen base64-codierten Wert zurück oder verwenden sha256, nach dem die Frage nicht fragt.
– Dollardime
22. September 2020 um 18:22 Uhr
Heider Sati
Aus Interesse, warum erstellen Sie (unsigned char cHMAC) und konvertieren es dann in (NSData) und konvertieren es dann in (NSMutableString) und konvertieren es dann schließlich in (HexString)?
Sie könnten dies schneller tun, indem Sie den Mittelsmann abschneiden (dh ohne NSData und NSMutableString insgesamt, schneller und bessere Leistung) und auch (unsigned char) in (uint8_t []), schließlich sind sie sowieso alles Hex-Arrays!, unten:
Ich verstehe nicht, warum Sie die base64Encoding verwenden, wenn wir nur eine Zeichenfolge des generierten Hashs haben möchten. Können Sie das erklären, denn am Ende erhalten wir ein base64-kodiertes hmac-sha256, statt eines hmac-sha256…
– Bruno
10. Oktober 2011 um 18:17 Uhr
@bruno falls du es nicht bemerkt hast, deine Antwort wurde gelöscht und in einen Kommentar umgewandelt. Wenn Sie mehr zu posten haben, posten Sie es als neue Antwort.
– Beschatten Sie den Kinderzauberer
11. Oktober 2011 um 9:37 Uhr