2016-05-09 11 views
1

Согласно this site MySQL использует:Objective C: Генерация хэш путь MySQL пароль() делает

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

Чтобы сгенерировать свой пароль() хэш.

...

Я скопировал эту функцию, с другой 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 хэшей. Но, как говорится в первой ссылке:

второй SHA1() применяется к двоичным данным, возвращаемым первым SHA1(), а не к его шестнадцатеричному представлению. Поэтому в SQL я должен использовать UNHEX() перед применением второго SHA1.

Так что я должен сделать что-то вроде:

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

Но все, что я стараюсь, я не могу заставить его работать.

Каков самый простой способ сделать это?

Спасибо!

+0

unhex в основном шестнадцатеричной в двоичном виде. – StefanS

+0

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

ответ

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

Я использовал ваш код и добавил 'NSString * b = [self sha1: [NSString stringWithFormat: @"% @ ", commandToSend] ]; 'до конца. Я получаю хэш '25EE266DD57C5647042A1F73AE7149194D3C0842' Но когда я запускаю' select password ('abc'); 'на mysql я получаю:' * 0D3CED9BEC10A777AEC23CCC353A8C08A633045E' –

+0

вам нужно применить функцию sha1 из приведенного выше github url на nsdata, чтобы получить правильный хеш. – StefanS

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^