2016-05-09 20 views
1

Nach this site mysql verwendet:Objective C: Generieren Hash den Weg mysql Passwort() macht

SHA1(UNHEX(SHA1("this_is_a_random_string"))) 

Um das Passwort() Hash zu generieren.

...

ich diese Funktion kopiert haben, von einem anderen StackOverflow post:

- (NSString *)sha1:(NSString *)str { 
    const char *cStr = [str UTF8String]; 
    unsigned char result[CC_SHA1_DIGEST_LENGTH]; 
    CC_SHA1(cStr, strlen(cStr), result); 
    NSString *s = [NSString stringWithFormat: 
        @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
        result[0], result[1], result[2], result[3], result[4], 
        result[5], result[6], result[7], 
        result[8], result[9], result[10], result[11], result[12], 
        result[13], result[14], result[15], 
        result[16], result[17], result[18], result[19] 
        ]; 

    return s; 
} 

SH1 Hashes zu generieren. Aber wie der erste Link sagt:

die zweite SHA1() wird auf die Binärdaten angewendet, die von der ersten SHA1() zurückgegeben werden und nicht zu seiner hexadezimalen Darstellung. Daher muss ich in SQL UNHEX() vor dem zweiten SHA1 anwenden.

Also muss ich etwas tun:

NSString * a = [self sha1:@"abc"]; 
// convert a into binary data. 
NSString * b = [self:sha1:a]; 

Aber was auch immer ich versuche ich es nicht zur Arbeit bekommen.

Was ist der einfachste Weg, dies zu tun?

Danke!

+0

unhex ist im Grunde hex binär. – StefanS

+0

http://stackoverflow.com/questions/7317860/converting-hex-nsstring-to-nsdata – StefanS

Antwort

1
- (NSString *)mysqlHashFromString:(NSString *)password{ 
    NSString *sha1String = [self sha1:password]; 
    NSData *sha1StringBinaryRepresentation = [self dataWithString:sha1String]; 
    NSString *finalHash = [self hexStringValue:[self SHA1Digest:sha1StringBinaryRepresentation ]]; 
    return finalHash; 
} 

- (NSData *)dataWithString:(NSString *)string { 
    NSString *command = [command stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    NSMutableData *commandToSend = [NSMutableData new]; 
    unsigned char whole_byte; 
    char byte_chars[3] = {'\0','\0','\0'}; 
    int i; 
    for (i=0; i < [command length]/2; i++) { 
     byte_chars[0] = [command characterAtIndex:i*2]; 
     byte_chars[1] = [command characterAtIndex:i*2+1]; 
     whole_byte = strtol(byte_chars, NULL, 16); 
     [commandToSend appendBytes:&whole_byte length:1]; 
    } 
    return commandToSend; 
} 

- (NSString *)sha1:(NSString *)plainTextPasssword{ 
    NSData *data = [plainTextPasssword dataUsingEncoding:NSUTF8StringEncoding]; 
    uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 
    CC_SHA1(data.bytes, data.length, digest); 
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; 
    for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) { 
     [output appendFormat:@"%02x", digest[i]]; 
    } 
    return output; 
} 

- (NSData *)SHA1Digest:(NSData *)data { 
    unsigned char result[CC_SHA1_DIGEST_LENGTH]; 
    CC_SHA1([data bytes], [data length], result); 
    return [NSData dataWithBytes:result length:CC_SHA1_DIGEST_LENGTH]; 
} 

- (NSString *)hexStringValue:(NSData *)data { 
    NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([data length] * 2)]; 
    const unsigned char *dataBuffer = [data bytes]; 
    for (int i = 0; i < [data length]; ++i) { 
     [stringBuffer appendFormat:@"%02x", (unsigned long)dataBuffer[i]]; 
    } 

    return [stringBuffer copy]; 
} 

Creating SHA1 Hash from NSString
Converting HEX NSString To NSData
https://github.com/ali-rantakari/Tagger/blob/master/NSData%2BSHA1.m

+0

Ich verwendete Ihren Code und fügte hinzu 'NSString * b = [selbst sha1: [NSString stringWithFormat: @"% @ ", commandToSend] ]; 'bis zum Ende. Ich bekomme den Hash '25EE266DD57C5647042A1F73AE7149194D3C0842' Aber wenn ich' select password ('abc'); 'auf mysql ich bekomme:' * 0D3CED9BEC10A777AEC23CCC353A8C08A633045E' –

+0

Sie müssen die Funktion sha1 von der oben genannten github URL auf nsdata anwenden, um Erhalte den richtigen Hash. – StefanS

+0

NSString * finalHash = [self sha1_nsdata: Befehl] ;? – StefanS