Objective-C-Beispielcode für HMAC-SHA1 [closed]

Lesezeit: 8 Minuten

Benutzeravatar von Helena
Helena

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.

    – Beschatten Sie den Kinderzauberer

    11. Oktober 2011 um 9:37 Uhr

So generieren Sie einen HMAC mit SHA-256:

NSString *key;
NSString *data;

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                      length:sizeof(cHMAC)];

NSString *hash = [HMAC base64Encoding];

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

Benutzeravatar von Zsivics Sanel
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

return [[[self alloc] initWithBase64String:base64String] autorelease];

Was Sie brauchen, ist, den Autorelease-Abschnitt zu löschen. Das Endergebnis sollte wie folgt aussehen:

return [[self alloc] initWithBase64String:base64String];

Importieren Sie nun in Ihr allgemeines Projekt “Base64.h” und den folgenden Code

#import "Base64.h"
#include <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonHMAC.h>

- (NSString *)hmacsha1:(NSString *)data secret:(NSString *)key {

    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    NSString *hash = [HMAC base64String];

    return hash;
}

Mit

NSLog(@"Hash: %@", hash);  

Sie werden etwas Ähnliches erhalten:

ghVEjPvxwLN1lBi0Jh46VpIchOc=

  • Eigentlich ist dies die richtige Antwort speziell für erforderlich HMAC-SHA1 fraglich

    – Beryllium

    10. Dezember 2012 um 13:18 Uhr


  • Erstaunliche Zeitersparnis, danke!

    – Bedeutungsangelegenheiten

    26. August 2013 um 11:04 Uhr

  • iOS 7-Update – die Linie [HMAC base64String] wird einen Fehler geben. Sie müssen verwenden base64EncodedStringWithOptions: stattdessen.

    – mafiOSo

    9. Oktober 2013 um 2:55 Uhr


  • Als ich dies tat, musste ich Base 64 und die gängigen Kryptoklassen eigentlich nicht importieren. vielleicht eine Änderung in iOS 7?

    – Joris416

    8. Dezember 2013 um 15:55 Uhr

  • @Imaginedigital hat bei mir unter iOS 7 funktioniert. Ich musste nur den mafiOSo-Kommentar anwenden.

    – Klaas

    23. Februar 2014 um 0:29 Uhr


Benutzeravatar von codeplasma
Codeplasma

Dies ist die Komplettlösung, die ohne zusätzliche Bibliotheken oder Hacks funktioniert:

+(NSString *)hmac:(NSString *)plainText withKey:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [plainText cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMACData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];

    for (int i = 0; i < HMACData.length; ++i)
        HMAC = [HMAC stringByAppendingFormat:@"%02lx", (unsigned long)buffer[i]];

    return HMAC;
}

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?

    – Dollardime

    22. September 2020 um 18:20 Uhr

Benutzeravatar von primulaveris
primulaveris

Dies funktioniert ohne Verwendung benutzerdefinierter Protokolle, mit etwas Code von
http://cocoawithlove.com/2009/07/hashvalue-object-for-holding-md5-and.html

HashSHA256.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>

@interface HashSHA256 : NSObject {


}

 - (NSString *) hashedValue :(NSString *) key andData: (NSString *) data ; 

@end

HashSHA256.m

#import "HashSHA256.h"

#import <CommonCrypto/CommonHMAC.h>


@implementation HashSHA256


- (NSString *) hashedValue :(NSString *) key andData: (NSString *) data {


    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSString *hash;

    NSMutableString* output = [NSMutableString   stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", cHMAC[i]];
    hash = output;
    return hash;

}

@end

Verwendungszweck:

- (NSString *) encodePassword: (NSString *) myPassword {
    HashSHA256 * hashSHA256 = [[HashSHA256 alloc] init];   
    NSString * result = [hashSHA256 hashedValue:mySecretSalt andData:myPassword];       
    return result;       
}

So machen Sie es, ohne dass externe Dateien einen Hex-String zurückgeben:

-(NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
    for (int i = 0; i < HMACData.length; ++i){
        [HMAC appendFormat:@"%02x", buffer[i]];
     }
   return HMAC;
}

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

Benutzeravatar von Rafael Bugajewski
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

Benutzeravatar von Heider Sati
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:

-(NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];

uint8_t cHMAC[CC_SHA1_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSString *Hash1 = @"";
for (int i=0; i< CC_SHA1_DIGEST_LENGTH; i++)
{
    Hash1 = [Hash1 stringByAppendingString:[NSString stringWithFormat:@"%02X", cHMAC[i]]];
}
return Hash1;
}

Ich hoffe das hilft,

Grüße

Heider Sati

1414380cookie-checkObjective-C-Beispielcode für HMAC-SHA1 [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy