4

私はasp.net MVC 4のデフォルトのメンバーシップシステムを使用しています。クライアントは、認証のためにハッシュ化されたパスワードを含む署名を送信する必要があります。

サーバーによってハッシュされたパスワードと同じように、パスワードをハッシュする必要があります。

    private static bool IsAuthenticated(string hashedPassword, string message, string signature)
    {
        if (string.IsNullOrEmpty(hashedPassword))
            return false;

        var verifiedHash = ComputeHash(hashedPassword, message);
        if (signature != null && signature.Equals(verifiedHash))
            return true;

        return false;
    }

では、データベースに保存されているパスワードのように、ハッシュ化されたパスワードを再現するにはどうすればよいでしょうか?

4

4 に答える 4

1

クラスSystem.Web.Helpers.Crypto メソッドHashPasswordメソッドを参照してください。SimpleMemberShipプロバイダーは、暗号サービスにこのクラスを使用します。

DBからエントリを読み取ることができます:-)

詳細については、http://msdn.microsoft.com/en-us/library/system.web.helpers.crypto%28v=vs.111%29.aspxを参照してください。

ところで、SALTを考慮することを忘れないでください。プロセスでは、ハッシュする前にパスとソルトを組み合わせる必要がありますか?

于 2012-12-30T06:25:30.377 に答える
1

あなたの質問を理解しているかどうかわかりませんが、ハッシュ化されたパスワードを比較する必要はありません。メンバーシップには、ユーザーを検証するためのメソッドが既にあります。使用する必要があります。

Membership.ValidateUser(username, password)

メンバーシップ プロバイダーとフォーム認証を使用している場合は、ユーザーが既にログインしているかどうかを確認できます。

 User.Identity.IsAuthenticated
于 2012-12-30T02:17:48.480 に答える
0

.net メンバーシップ プロバイダーは、base64 でエンコードされた HMACSHA1 ハッシュを使用します。クライアント側で JavaScript のみを使用して同じハッシュを再作成できます。秘訣は、パスワードとハッシュ キーが同じであることを確認し、utf-16le エンコーディングを使用することです。これがcrypto-jsを使用したソリューションです。crypto-js utf-16le 関数が同じ結果を生成しない理由がわからないため、別の utf 関数を使用しています。

//not sure why crypt-js's utf16LE function doesn't give the same result
//words = CryptoJS.enc.Utf16LE.parse("test");
//utf16 = CryptoJS.enc.Utf16LE.stringify("test");

function str2rstr_utf16le(input) {
  var output = [],
      i = 0,
      l = input.length;

  for (; l > i; ++i) {
    output[i] = String.fromCharCode(
      input.charCodeAt(i)        & 0xFF,
      (input.charCodeAt(i) >>> 8) & 0xFF
    );
  }

  return output.join('');
}

var pwd = str2rstr_utf16le("test");
var hash = CryptoJS.HmacSHA1(pwd, pwd);

var encodedPassword = CryptoJS.enc.Base64.stringify(hash);
于 2013-01-11T17:52:32.517 に答える
0

Crypto.cs @ System.Web.Helpers からの完全なメソッド:

/// <summary>Returns an RFC 2898 hash value for the specified password.</summary>
/// <returns>The hash value for <paramref name="password" /> as a base-64-encoded string.</returns>
/// <param name="password">The password to generate a hash value for.</param>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="password" /> is null.</exception>
public static string HashPassword(string password)
{
  if (password == null)
    throw new ArgumentNullException("password");
  byte[] salt;
  byte[] bytes;
  using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 16, 1000))
  {
    salt = rfc2898DeriveBytes.Salt;
    bytes = rfc2898DeriveBytes.GetBytes(32);
  }
  byte[] inArray = new byte[49];
  Buffer.BlockCopy((Array) salt, 0, (Array) inArray, 1, 16);
  Buffer.BlockCopy((Array) bytes, 0, (Array) inArray, 17, 32);
  return Convert.ToBase64String(inArray);
}
于 2017-06-21T07:42:42.243 に答える