2012-08-05 76 views
2

我在SQL數據庫上存儲密碼,使用PHP並計劃使用bcrypt。使用bcrypt:我應該分配多少個字節?

我正在做一些研究,找出我應該用什麼類型和大小來存儲散列和鹽在我的數據庫。

基於對this question的很好回答,似乎bcrypt有時會輸出不同大小的散列,可能大到CHAR(76)BINARY(60)。但我不明白何時和爲什麼。

該問題提供了一個link,它說使用$2$方案產生59個字節,而$2a$產生60個字節。然而,今天的文檔爲php的crypt推薦使用$2y$而不是$2a$,由於某些原因,由於高位攻擊等原因。無論如何,我想使用$2y$,因爲它是建議的,但沒有跡象表明它會輸出的大小。

數據庫中我的字段大小應該是多少?

另外,在這類應用程序中CHARBINARY之間是否有實際區別?

+0

[在數據庫中存儲哈希密碼(Bcrypt)的可能的副本 - 列/長度?](http://stackoverflow.com/questions/5881169/storing-a-hashed-password-bcrypt-in-一個數據庫,類型 - 長度 - 的列) – 2013-10-04 23:55:28

回答

1
  1. 哈希:CHAR(60)
  2. 鹽: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來表示所有這些數字。

0

這將是相同的大小 - 60個字符。 ($2$$2a$之間唯一的區別是,前者是一個更小的字符的實際的哈希部分是相同的尺寸。)

相關問題