2011-01-08 1 views
6

私はここでPHPのパスワードストレージを安全にする方法についてはstackoverflowで尋ねました。 main answerは、以下のハッシュアルゴリズムを使用することを提案:HMAC + nonceを使用したPHPパスワードストレージ - ノンスランダム性が重要ですか?

function hash_password($password, $nonce) { 
    global $site_key; 
    return hash_hmac('sha512', $password . $nonce, $site_key); 
} 

答えはランダム nonceを使用することを提案しています。シンプルな一意的なナンスよりもランダムナンスを持つことに利点はありますか?

例えば、各ユーザーは、変更されない独自のIDを持つことができます。しかし、ユーザーIDがシーケンシャル(MySQLの自動インクリメント機能を使用して構築されている)で、ランダムではないと仮定しましょう。ユーザIDは良いノンスかランダム性が重要ですか?

ここで、各ユーザーはユーザー名を選択できます。各ユーザーには変更のない独自のユーザー名があり、2人のユーザーが同じユーザー名を持つことはできません。 ユーザー名はまだランダムではありませんが、順次ではありません。ユーザー名はノンスとして十分なのでしょうか?ユーザーIDを使用するよりも良いでしょうか?あなたは塩を意味ナンスによって場合

+0

あなたのナンスは塩でなければなりません。塩は定義上ランダムです。この答えは正しいですが、とは何の関係もありませんhttp://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190 – Jacco

答えて

2

これは、[はいそれがなされるべき多くの虹のテーブルを必要と... ALL NONCEが塩であることを前提に

です。通常は20文字以上の塩があれば十分ですが、極端なセキュリティ条件では、各パスワードに新しいランダムな塩が必要です。

また、遅いハッシュの良い選択http://www.php.net/manual/en/function.hash.php#89574、いいえ風刺。しかし、私はripemdが好きです。

回答の下半分は表示されませんでした。具体的には:Noncesは、虹のテーブルの使用を防ぐために使用されます。 IDが機能するかどうかは、単にIDの長さに依存します。ランダム性は技術的に重要ではありませんが、より多くのレインボーテーブルが必要になります。たとえば、文字「a」をナンスとして使用し、パスワードの長さが2文字の場合、a-aa、a-ab a-acなどの虹のテーブルを作成する必要があります。毎回ランダムなものを使用する場合は、 'a'のすべての順列と他のランダムな文字のすべてのパーミュテーションを行う必要があります。

しかし、一般的には、虹のテーブルを作成するにはかなりの時間がかかります。だから、もしあなたが長い間その塩を考え出すなら、そのための虹のテーブルは存在しないでしょう。使用するのに十分なパスワードを格納するために

+0

:私はここで塩漬けについて長い答えを書きました質問。 HMACはハッシュではなくMACアルゴリズムです。キー付きハッシュとも呼ばれます。したがって、ナンスは正しい用語ではないという問題にある。それは(プライベート)キーでなければなりません。その場合、1つの鍵は安全です(あなたが国の機関に勤務していない、または保護したい場合を除き)。 – Henri

+0

したがって、 "NoviceCoding"という名前...説明に感謝します。私はこれらのことについて私が持っている小さな知識を共有しようとしますが、今回のようにそれは無関係でした。再度、感謝します。 – NoviceCoding

+0

塩*はランダム*でなければなりません。ユーザーIDは間違いなく塩としての使用には適していません。ユーザーIDが1のシステムが数多くあります(管理者アカウントが低IDのどこかにある可能性も高くなります)。 – Jacco

0

sha512(salt + password) 

saltは、各ユーザーのランダムと一意である必要があります。ランダムな塩はあらかじめ計算されたハッシュテーブルの攻撃を不可能にします:各ユーザは自分自身で計算されたハッシュテーブルを必要とします。無作為の塩を使用しない場合は、事前計算テーブルが存在する可能性が高くなります。

パスワードの前に位置の塩は、一部のユーザーが同じパスワードを持つ場合にハッシュパターンを非表示にするのに役立ちます。

Nonceは、応答攻撃を防止するためのものではありません。この保護は、あなたのアーキテクチャでは不可能です。 A)我々はb)はSHA-512 you need to calculate約2^256値に対する衝突の確率を50%にするために、MACのハッシュを使用しないので、衝突を防ぐためにHMACを使用

は、無駄です。そして、2^256は本当に天文学的な数字です。

+0

これは悪いアドバイスです。 HMACは、無差別に大量のリソースを集中的に使用するため、パスワード保存の明白な標準です。 SHAを使用する場合は、HMAC + SHA512を使用してください。 – mattbasta

2

私はこのトピックについてのオンライン書かかなり素敵なチュートリアルがあったことがわかりました。私は非常に最初の関数、私はそれを見つけた場所をGoogleで覚えているけど、それは右の私の目の前にあるように私は十分に自分自身を機能を打破することができれば、私は見てみましょう...

していない、それがキーを作成することができます任意のサイズの長さ。私はかなり重く、それをコメントの自由を取った...それがない

function pbkdf2($password,$salt,$iter_count = 1500,$key_length = 32,$algorithm = 'sha512') 
{ 
    /* 
     @param string password -- password to be encrypted 
     @param string salt -- salt to encrypt with 
     @param int iter_count -- number of times to iterate blocks 
     @param key_length -- length of key to return 
     @param $algorithm -- algorithm to use in hashing 

     @return string key 
    */ 

    //determine the length of the hahs 
    $hash_length = strlen(hash($algorithm,NULL,TRUE)); 
    //determine the number of key blocks to compute 
    $key_blocks = ceil($key_length/$hash_length); 
    //initialize key 
    $key = ''; 

    //create the key itself 
    //create blocks 
    for($block_count = 1;$block_count <= $key_blocks;$block_count++) 
    { 
     //initalize hash for this block 
     $iterated_block = $block = hash_hmac($algorithm,$salt.pack('N',$block_count),$password,TRUE); 
     //iterate blocks 
     for($iterate = 1;$iterate <= $iter_count;$iterate++) 
     { 
      //xor each iterate 
      $iterated_block ^= ($block = hash_hmac($algorithm,$block,$password,TRUE)); 
     } 
     //append iterated block 
     $key .= $iterated_block; 
    } 
    //return the key 
    return substr($key,0,$key_length); 
} 
  1. まず最初は、ハッシュの長さを把握です。
  2. 次に、各ブロック
  3. を作成するためのループが初期ハッシュを取る
  4. を指定し、それは
  5. セットを返すためにハッシュ(キー)を初期化キーブロックは鍵長に必要とされるどのように多くの決定塩
  6. に付加されたバイナリのブロックカウンタとブロックのブロックの$ iter_count回反復するループ(それ自体のハッシュを作成する)
  7. XOR各反復を開始し、$ iterated_blockに(XOR前ハッシュに追加し電流)
  8. XORループは、各ブロック
  9. ブロックループのための$キーへ
  10. アペンド$のiterated_blockを終了
  11. リターン私はこれはおそらく、これを行うための最善の方法であると感じ、キー

終了します。多分私はあまりにも過敏症ですか?

関連する問題