2011-01-13 11 views
10

crypt() documentationによれば、塩はアルファベット「./0-9A-Za-z」から22塩基64桁である必要があります。Crypt()関数のブロッフィッシュ塩の長さ?

これは、彼らが与えるコードの例です:

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'); 

最初の混乱の部分は、その塩が25個の文字を持っている、いない22

質問#1:それは塩が想定している意味していますより長くてより22文字ですか?

次に、私はこの機能を自分でテストして何かに気付きました。私は20文字のsaltを使用したとき、私は20文字のsaltを使用する場合、私はこの

// using 20 char salt: 00000000001111111111 
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$'); 
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2 

を取得し、全体の塩が出力です。私は塩を別の場所に保管する必要がないので便利です。 (私はランダムな塩を使用したい)。私は、生成されたハッシュから塩を読み戻すことができます。

しかし、ドキュメントに書かれているように22文字の塩を使用するか、長いものを使用すると、最後に塩が途切れます。

// using 22 char salt: 0000000000111111111122 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// 22nd character of the salt is gone 

// using 25 char salt: 0000000000111111111122222 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122222$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// Same hash was generated as before, 21 chars of the salt are in the hash 

質問#2:ので、塩の適切な長さは正確には何ですか? 20? 22?より長いです?

質問#3:また、パスワードをチェックするときにハッシュから塩分を読み取ることをお勧めしますか?別のフィールドに塩を保管し、それをそこから読み取るのではなく、 (これは、塩がハッシュに含まれているように見えるため、冗長に見えます)。

答えて

8

ブローフィッシュの塩は22文字(後に続く$を含む21)でなければなりません。var_dump(CRYPT_SALT_LENGTH)で再確認することはできますが、これを確認することはできませんが、文字数が少ないと文字数が少なくなります。切り捨てられます。

3つ目の質問について:はい、ハッシュ自体の埋め込みソルト(およびコスト)パラメータを使用して、ハッシュを読み取りチェックしてください。

+1

CRYPT_SALT_LENGTHは私のWin7マシンでは60、Ubuntuでは123を返しています。 –

+1

@Burak Guzel:マニュアルによると** PHPは利用可能なハッシュで許される最長の有効な塩を示す 'CRYPT_SALT_LENGTH'という名前の定数を設定します**。 –

+2

@Burak Guzel:CRYPT_SALT_LENGTHは、PHP 5.3.1までは60を返しますが、5.3.2からは123を返します。これは、SHA-256(64文字長の塩)とSHA-512(123文字の長い塩)がPHP 5.3.2で導入されたためです。 – Sliq