2015-06-28 36 views
2

我正在做一些在php上的工作嘗試通過SHA1加密字符串。但是,我需要將結果與在Xcode中完成的其他人的結果相匹配。 他寫在Xcode是什麼如下:SHA1在Xcode和PHP中的結果不同

NSString *saltedPassword = [NSString stringWithFormat:@"%@%@",_myTextField.text,saltKey]; 
NSString *hashedPassword = nil; 
unsigned char hashedPasswordData[CC_SHA1_DIGEST_LENGTH]; 
NSData *saltedData = [saltedPassword dataUsingEncoding:NSUTF8StringEncoding]; 
if (CC_SHA1([saltedData bytes], [saltedData length], hashedPasswordData)) { 
    hashedPassword = [[NSString alloc] initWithBytes:hashedPasswordData length:sizeof(hashedPasswordData) encoding:NSASCIIStringEncoding]; 
} else { 
    NSLog(@"ERROR: registerAction, should not be here"); 
    abort(); 
} 

我不知道的Xcode很好。我瞭解他所做的是:

  1. 將字符串與鍵串聯以獲得一個新字符串,我們稱之爲「string1」。
  2. 編碼的字符串1爲UTF-8,讓我們稱之爲的編碼字符串「字符串2」
  3. 使用SHA1來加密字符串2,長度爲20(CC_SHA1_DIGEST_LENGTH是20,是嗎?),讓我們稱之爲加密的字符串「STRING3」
  4. 將「string3」編碼爲ASCII以獲得最終結果。

因此,基於以上我的理解,我寫的代碼在PHP如下:

$password.=$configs['key']; 
$password=mb_convert_encoding($password, "UTF-8"); 
$codedPassword=sha1($password, $raw_output = TRUE); 
$codedPassword=mb_convert_encoding($codedPassword, "ASCII"); 
echo($codedPassword); 

$密碼是我要加密的字符串。 但是我得到的結果與Xcode的結果不同。我們使用相同的密鑰。

例如:

如果輸入是 「123456」 時,Xcode的輸出爲 「OY:>/ ○×NVÛ²¿+(A7」,PHP的輸出爲「|百靈7b中? (我不確定這些是確切的字符串還是字符串本身包含一些無法顯示的字符)

有沒有人知道如何更改php代碼以獲得相同的結果?(這將是完美的,您的解決方案是關於如何更改PHP代碼。因爲我暫時不能更改Xcode,我的工作是編寫PHP代碼以匹配Xcode的結果。)

+0

'$ CONFIGS [「關鍵」];'是在PHP中鹽? – meda

+0

1.「CC_SHA1」的輸出是數據,通常不可能將數據轉換爲字符串,這樣操作通常會失敗。這是因爲很多數據字節都不是有效的ASCII,例如值0x00 - 0x1f。這是一個散列,而不是加密,加密意味着它可以被解密。 – zaph

+0

提供樣本輸入和輸出數據。 – zaph

回答

0

你似乎描述:

NSData *saltedData = [saltedPassword dataUsingEncoding:NSUTF8StringEncoding]; 

爲「編碼字符串1爲UTF-8,我們稱之爲編碼字符串‘字符串2’」,做:

$password=mb_convert_encoding($password, "UTF-8"); 

但是這一步是轉換字符串成字節數組,看看例如在回答這個問題String to byte array in php,看來你應該做這樣的事情在這一步:

$bytes = unpack("H*",$password); 
+0

這似乎沒有回答這個問題,也許更完整的解決方案。 – zaph

+0

爲什麼使用「H *」?我需要在開箱後將$字節轉換爲UTF-8嗎? –

相關問題