web-dev-qa-db-ja.com

C#のDBにパスワードを保持するためのソルト付きMD5ハッシュ

MD5でユーザーパスワードをハッシュするための簡単なアルゴリズムを教えてください。ただし、信頼性を高めるためにsaltを使用します。

今私はこれを持っています:

private static string GenerateHash(string value)
{
    var data = System.Text.Encoding.ASCII.GetBytes(value);
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
    return Convert.ToBase64String(data);
}
18
abatishchev

HMACMD5 クラスを使用できます:

var hmacMD5 = new HMACMD5(salt);
var saltedHash = hmacMD5.ComputeHash(password);

SHA-1、SHA256、SHA384、SHA512、およびRIPEMD160でも動作します。

var hmacSHA1 = new HMACSHA1(salt);
var saltedHash = hmacSHA1.ComputeHash(password);

saltpasswordの両方がバイト配列として予期されます。

文字列がある場合は、最初にそれらをバイトに変換する必要があります。

var salt = System.Text.Encoding.UTF8.GetBytes("my salt");
var password = System.Text.Encoding.UTF8.GetBytes("my password");
40
dtb

これが サンプル です。 MD5、SHA1、SHA256、SHA384、およびSHA512を処理します。

12
Darin Dimitrov

上記のHMACSHA1クラスに加えて、簡単なソルトハッシュが必要な場合は、すでに95%の距離にあります。

private static string GenerateHash(string value, string salt)
{
    byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value);
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
    return Convert.ToBase64String(data);
}

本当の秘訣は、machine.configなどの安全な場所にソルトを保存することです。

3
Juliet

Microsoftがこの作業を行ってくれましたが、少し掘り下げる必要があります。 Web Service Extensions 3.0をインストールし、ReflectorでMicrosoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest関数を確認します。

ここでその関数にソースコードを投稿したいのですが、それが合法かどうかはわかりません。誰かが私を安心させることができるなら、私はそうします。

1