2014-01-23 40 views
1

我目前遇到此問題,其中數據API提供者在通過iOS應用進行通信時請求SHA-1散列密碼。它大約95%的時間工作,但一些特殊字符造成很多頭痛。SHA-1在Objective-C和PHP中產生不同的結果......想法?

下面是產生不同的結果ABjnxQ^Lx2的%f8vb

http://www.sha1.cz/密碼 - >48518a5be263c7a222f4863b66889019aa272191

http://www.tools4noobs.com/online_php_functions/sha1/ - >b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68

第二個是我的ObjC函數也返回了什麼。然而API提供者使用的PHP SHA1()獲取第一個。我已經縮小到這個樣本中有%符號的事實。任何人都有與此有關的任何智慧?

這裏是我的Objective-C的功能:

- (NSString *)hashPassword:(NSString *)pass { 
    const char *cstr = [pass cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:pass.length]; 

    uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 

    CC_SHA1(data.bytes, data.length, digest); 

    NSMutableString *output = [[NSMutableString alloc] initWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; 

    for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) 
     [output appendFormat:@"%02x", digest[i]]; 

    return output; 
} 

之前你建議編碼,請注意,我試圖改變編碼類型爲ASCII,UTF8,16,32,和大多數其他的編碼類型在NSStringEncoding enum中NSString.h

有人可以提供關於如何解決這個問題的解釋或建議嗎?先謝謝你!

+0

當我使用php sha1函數時,我得到了'b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68',我相信這是正確的,因爲我搜索的所有sha1哈希站點都給了這個,SQL服務器和mysql也給了這個 – elitechief21

回答

1

看來http://www.sha1.cz%nn解釋爲百分比轉義,而不是http://www.tools4noobs.com/online_php_functions/sha1/。例如:

所以第一個站點將「%30」解釋爲「0」,這很有意義,因爲「0」的ASCII碼是0x30

但是,這樣的「百分比轉義解碼」對於任意的密碼字符串沒有多大意義。而對於「%f8」,目前還不清楚哪一種編碼被用來刪除 轉義百分比。

所以我的結論是:b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68正確的答案。若要從http://www.sha1.cz, 你必須用 「%25」 代替每個 「%」 字符,瞧得到相同的答案:

  • http://www.sha1.cz計算 「ABjnxQ^Lx2上%25f8vb」 的哈希值作爲b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68

這是第二個服務和你的Objective-C代碼計算出來的。

由 「%25」(對於http://www.sha1.cz)更換 「%」 可以與NSString 方法stringByAddingPercentEscapesUsingEncoding:來完成。

1

在我看來,這似乎是越野車PHP哈希函數。我同意 - 百分號%符號是PHP SHA1函數的麻煩來源。 只是爲了我的好奇心 - 我試過其他非PHP在線工具(http://www.sha1-online.com/)找出SHA1哈希給定的密碼:

ABjnxQ^Lx2上%f8vb

,它是:

b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68

我不想抱怨糟糕的PHP語言,但嘗試閱讀這article: PHP: a fractal of bad design。玩得開心!

相關問題