2010-08-16 439 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

您無法對其解碼。但是如果你太絕望了,蠻力吧!