2011-11-30 8 views
0

MD5を使用してUnixスタイルのパスワードハッシュを生成しようとしています。私はそれが$1$<salt>$<hash>のように見える必要があると思いますが、<hash>の部分は、私が何をしても同じに見えません。ここで私はハッシュを生成する方法である:C#でUnixスタイルのMD5パスワードハッシュを生成

  MD5 md5 = System.Security.Cryptography.MD5.Create(); 
      byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(pass); 
      byte[] hash = md5.ComputeHash(inputBytes); 

      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < hash.Length; i++) 
      { 
       sb.Append((char) hash[i]); 
      } 

      String calchash = sb.ToString(); 

私は今私がハッシュされたバイトから文字列を作るためにStringBuilderを使用していますされていることをかなり確信しています。しかし、私は正しい設定が何であるか分からない。

+0

Unixのパスワードハッシュは、プレーン、MD5を使用していません。 MD5暗号は、パスワードと塩をさまざまな組み合わせでハッシュし、評価速度を低下させます。アルゴリズムのいくつかのステップでは、暗号方式の観点からスキームが設計されていることが疑問視されています。パスワードの長さによっては、どのデータがハッシュされているかが決定されます。ゼロビットごとにパスワードの最初のバイト、すべてのセットビットに対して前のハッシュ計算の最初のバイトが決定されます。 – CodesInChaos

+0

ええ、私はちょうど私が適切に塩漬けしていないことに気づいた。私は動作するUNIXの 'crypt'の実装を見つけました。 [http://sourceforge.net/projects/cryptapi/](http://sourceforge.net/projects/cryptapi/) –

答えて

2

Unix md5 cryptは、プレーンなmd5を使用しません。これは安全ではないでしょう。単純なmd5は高速で、パスワードハッシュは遅くなければならないからです。

私は、関連するコード・プロジェクトの記事を見つけた:http://www.codeproject.com/KB/recipes/Unix_md5crypt.aspx

+0

このライブラリは、上記のライブラリよりもうまく機能します。ありがとう! –

0

フォーマットについてです。 Unixのパスワードハッシュは16進形式で、バイナリ形式で書いています。私はあなたがハッシュを使うべきだと思う

sb.Append(hash[i].ToString("x").PadLeft(2,'0')); 
+0

本当ですか?私のUNIXの '/ etc/passwd'ファイルを見ると、句読点やその他の非16進文字が含まれているので、ハッシュは異なって見えます。 –

0

[I] .ToString( "X")だけではなく、charに変換する:でループ本体を交換してください。ハッシュバイトは0から255までの任意の範囲にある可能性があるので、md5ハッシュとは異なります。