2010-08-16 89 views
1

我正在使用下面的代码将字符串转换为sha1字符串,但我无法找到任何解决方案,即从sha1字符串中返回正常字符串。将sha1字符串解码为普通字符串

+(NSString *)stringToSha1:(NSString *)str{ 
    const char *s = [str cStringUsingEncoding:NSASCIIStringEncoding]; 
    NSData *keyData = [NSData dataWithBytes:s length:strlen(s)]; 

    // This is the destination 
    uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; 
    // This one function does an unkeyed SHA1 hash of your hash data 
    CC_SHA1(keyData.bytes, keyData.length, digest); 

    // Now convert to NSData structure to make it usable again 
    NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_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:@""]; 

    NSLog(@"Hash is %@ for string %@", hash, str); 

    NSData *dtt = [hash dataUsingEncoding:NSUTF8StringEncoding]; 
    //dtt = [nsda] 
    NSString *unhash = [dtt description]; 

    return hash; 
} 

plz帮我解决了这个问题。

在此先感谢

回答

6

SHA-1是一种单向散列算法,因此没有从SHA-1字符串转换为普通字符串的算法。

8

SHA1是单向散列:它不能被“解码”。

散列用于将值转换为另一个可能唯一的值。例如,您可以通过计算散列来指纹文件。然后,例如,您可以通过计算其哈希值并将其与希望的哈希值进行比较,从而知道您已成功下载了正确的千兆字节数据。

密码经常被散列:我可以检查您是否输入了正确的密码,而没有密码副本:当您设置密码并存储该密码时,我会散列密码。然后当你输入你的密码时,如果它的值相同,它就是正确的密码。

+0

+1 - 散列无法解码的原因是“可能唯一”位 - 如果结果散列的宇宙小于可能值的宇宙,散列必然是多对一的过程。多对一算法只能在“这*可能*是原始值”的可信度下反转, – 2010-08-16 10:41:51

1

SHA1摘要是单向摘要,原始字符串不能从摘要中取回。

0

您无法对其解码。但是如果你太绝望了,蛮力吧!

相关问题