- 哈希:
CHAR(60)
- 鹽:
CHAR(22)
這可以可通過實驗找到:
<?php
$salt1 = "FotZoGZruCl8ugk0Tvl4g";
$salt2 = "FotZoGZruCl8ugk0Tvl4g9";
$salt3 = "FotZoGZruCl8ugk0Tvl4g9a";
print 'Salt 1 (stlen = ' . strlen($salt1) . '): ' . $salt1 . '<br />';
print 'Salt 2 (stlen = ' . strlen($salt2) . '): ' . $salt2 . '<br />';
print 'Salt 3 (stlen = ' . strlen($salt3) . '): ' . $salt3 . '<br />';
$hash1 = crypt('password1', '$2y$07$' . $salt1);
$hash2 = crypt('password1', '$2y$07$' . $salt2);
$hash3 = crypt('password1', '$2y$07$' . $salt3);
print 'Hash 1 (strlen = ' . strlen($hash1) . '): ' . $hash1 . '<br />';
print 'Hash 2 (strlen = ' . strlen($hash2) . '): ' . $hash2 . '<br />';
print 'Hash 3 (strlen = ' . strlen($hash3) . '): ' . $hash3 . '<br />';
?>
輸出結果爲:
Salt 1 (stlen = 21): FotZoGZruCl8ugk0Tvl4g
Salt 2 (stlen = 22): FotZoGZruCl8ugk0Tvl4g9
Salt 3 (stlen = 23): FotZoGZruCl8ugk0Tvl4g9a
Hash 1 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4g.pXg.UBUUwuj14Ur1d.z/tMLqGPxQLBW
Hash 2 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe
Hash 3 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe
這裏你會發現,如果你添加超過22個字符的鹽,哈希將保持不變。也就是說,在執行哈希之前,crypt會將鹽截斷爲22個字符。
FYI,隨機鹽代:
$salt = substr(strtr(base64_encode(mcrypt_create_iv(17, MCRYPT_DEV_URANDOM)), "=+", "./"), 0, 22);
編輯: 此外,鹽/散列的格式是底部64即是使用A-Z,A-Z,數字0-9, ''和'/'作爲數字,每個數字代表0到63之間的一個值......所以在數據庫中使用CHAR
相對於BINARY
沒有問題,因爲您可以使用CHAR
來表示所有這些數字。
[在數據庫中存儲哈希密碼(Bcrypt)的可能的副本 - 列/長度?](http://stackoverflow.com/questions/5881169/storing-a-hashed-password-bcrypt-in-一個數據庫,類型 - 長度 - 的列) – 2013-10-04 23:55:28