web-dev-qa-db-ja.com

ASP.NETメンバーシップが使用するデフォルトのハッシュアルゴリズムとは何ですか?

ASP.NETメンバーシップが使用するデフォルトのハッシュアルゴリズムとは何ですか?そして、どうすれば変更できますか?

53
iburlakov

Ryan Christensenによる上記の回答 は完全ではありません。 saltをbyte []に​​変換する部分は正しくありません。

これは、クライアント向けのソリューションで実装した実用的な例です。

public string Hash(string value, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(value);
        byte[] src = Convert.FromBase64String(salt);
        byte[] dst = new byte[src.Length + bytes.Length];
        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
        HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
        byte[] inArray = algorithm.ComputeHash(dst);
        return Convert.ToBase64String(inArray);
    }
31
Rawbert

デフォルトのハッシュアルゴリズムタイプはSHA1です。これを変更するには2つの方法があります。

1)IIS 7を使用している場合、「マシンキー」構成(以下を参照)を使用してこれを更新できます。これにより、利用可能なオプションのリストから暗号化方法を選択し、キーまたはキー生成オプション。

Machine Key configuration page from IIS 7 administration tool

2)IIS 6を使用している場合、web.configファイルのメンバーシップ要素を使用してハッシュアルゴリズムタイプを変更できます。

<membership
    defaultProvider="provider name"
    userIsOnlineTimeWindow="number of minutes"
    hashAlgorithmType="SHA1">
    <providers>...</providers>
</membership>

ドキュメントによると、 hashAlgorithmType 属性の文字列値は、提供されている.Netハッシュアルゴリズムタイプのいずれかです。少し掘り下げると、ASP.Net 2、3、および3.5の有効な値はMD5RIPEMD160SHA1SHA256SHA384SHA512。ここで重要な部分は、これらすべてのクラスがHashAlgorithmを継承することです。

hashAlgorithmType 属性の値は、machine.configファイルの cryptoNameMapping 要素からのエントリにすることもできます。サードパーティのハッシュアルゴリズムが必要な場合は、これを使用できます。 machine.configファイルは通常、C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG ASP.Net 2以降を使用している場合。これらの値の設定の詳細については、こちらをご覧ください こちら

27
MikeD

.NET 4.0 Frameworkでは、デフォルトのハッシュアルゴリズムがHMACSHA256に変更されました。

SHA-1とは異なり、HMAC SHA-256はキー付きハッシュであることに注意してください。ハッシュが非決定的に動作している場合、おそらくキーを設定しておらず、ランダムなキーを使用するように強制しています。次のようなものが犯人になります(これは私が1時間かけて考え出したものです:p)。

HashAlgorithm.Create(Membership.HashAlgorithmType)

既存のプロバイダーで動作させる場合は、 このガイド を使用して以前のデフォルトに戻すことができます。

26
phloopy

ハッシュアルゴリズムには1つの修正があります。使用する必要があります。

byte[] src = Convert.FromBase64String(salt);

の代わりに

byte[] src = Encoding.Unicode.GetBytes(salt);

記事を読む http://svakodnevnica.com.ba/index.php?option=com_kunena&func=view&catid=4&id=4&Itemid=5&lang=en#6

2
Fox

上記のF#のRawbertの答えのようにコードを示すスニペットを添付します

open System
open System.Security.Cryptography
open System.Text

module PasswordHelper =
    let EncodePassword(pass : string, salt : string) =
        let bytes = Encoding.Unicode.GetBytes(pass)
        let src = Convert.FromBase64String(salt)
        let dst : byte array = Array.zeroCreate (src.Length + bytes.Length)
        Buffer.BlockCopy(src, 0, dst, 0, src.Length)
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length)
        let algorithm = HashAlgorithm.Create("SHA1")
        let inArray = algorithm.ComputeHash(dst)
        Convert.ToBase64String(inArray)

これはアクティブなアプリケーションからの作業コードです

0
Quintus Marais