2014-07-17 45 views
2

我正在使用下面的代碼在PHP中創建salt。在mysql數據庫中存儲值變化的鹽值

$length=100; 
$bool=true; 
$salt=openssl_random_pseudo_bytes ($length, $bool); 

當我回聲它顯示該值的值(一個實例)

×YOEú ßPŽžJZýr³€žYM½N±~ÄŽ¼D‚ÝÆFÕ`O$I$îÇF üKøäƒþ¥_5ûù„Ð… Ïq®ùä. ³æ¤ljî¬}Të‚´ù­B#3U96 

但在數據庫中存儲它被變更爲

Ñx€gþ‚΀³€Œ¯´N§Å·.:gºÈá•ïjÇÖ…áf6uIùYbx}û€·iÀ0èFšDö¼6¥qzMéÁi‡± 

的電場是利用latin1_swedish_ci編碼。

signup script

script containing hashing function, salt generator

table structure

+0

是字段類型varchar? –

+0

是的,我甚至添加了圖像顯示錶結構的鏈接。 – user3263192

+1

好吧,嘗試將類型更改爲blob –

回答

2

openssl_random_pseudo_bytes返回原始字節流,顧名思義。它不會返回旨在可讀的「字符」。如何將這些字節顯示爲字符,完全取決於口譯方;這裏很明顯,MySQL正在用不同的編碼解釋字節,而不是使用PHP顯示的瀏覽器/控制檯。

如果你在MySQL中存儲這些字節,你應該將它們存儲在一個BLOB類型的列中,因爲它們是一個無意義的blob。

如果您想將它們視爲字符,則需要對它們進行編碼。最好的可能是簡單的bin2hex($salt),它將二進制數據編碼爲十六進制。或者使用base64_encode

其次,openssl_random_pseudo_bytes的第二個參數不應該作爲布爾值傳遞。這是一個傳遞參考變量,它允許您檢查事實之後字節是否具有強安全性生成:

$salt = openssl_random_pseudo_bytes($length, $strong); 
if ($strong) { 
    // $salt is strong 
} else { 
    // $salt is weak 
} 
+0

感謝您的詳細解釋。 – user3263192