安全なパスワードを安全なハッシュコードに変換したい。最善の方法?.NETによる安全なパスワードプログラミング
:SHA1、MD5および任意の組み合わせ?
string str ="Krishna";
Output:"!#[email protected]#$%@";
安全なパスワードを安全なハッシュコードに変換したい。最善の方法?.NETによる安全なパスワードプログラミング
:SHA1、MD5および任意の組み合わせ?
string str ="Krishna";
Output:"!#[email protected]#$%@";
ソルトに使用できるランダムなデータを作成する方法はいくつかあります。最も一般的なものは以下のとおりです。
RNGCryptoServiceProvider
クラスを使用して、桁のランダムな文字列を作成するGuid
タイプする新しいランダムなGUIDを作成するために、我々は呼び出しますGuid
タイプのNewGuid
メソッド。生成されたら、暗号化する文字列に単純に塩を追加します。
string saltAsString = Guid.NewGuid().ToString();
はRNGCryptoServiceProvider
クラスを使用して、数字のランダムな文字列を作成するために、我々は最初のプロバイダとbyte
配列を初期化した後、私たちのプロバイダインスタンス上GetBytes
メソッドを呼び出します。
byte[] saltInBytes = new byte[8];
RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider();
saltGenerator.GetBytes(saltInBytes);
string saltAsString = Convert.ToBase64String(saltInBytes);
次のコードは、塩分を示すための前のスニペットの修正版です。
public void HashText()
{
string textToHash = "password";
string saltAsString = Guid.NewGuid().ToString();
byte[] byteRepresentation
= UnicodeEncoding.UTF8.GetBytes(textToHash + saltAsString);
byte[] hashedTextInBytes = null;
MD5CryptoServiceProvider myMD5 = new MD5CryptoServiceProvider();
hashedTextInBytes = myMD5.ComputeHash(byteRepresentation);
string hashedText = Convert.ToBase64String(hashedTextInBytes);
// will display X03MO1qnZdYdgyfeuILPmQ==
MessageBox.Show(hashedText);
}
これはデフォルトのメンバシッププロバイダが何をされています
internal string EncodePassword(string pass)
{
string salt = GenerateSalt();
byte[] bytes = Encoding.Unicode.GetBytes(pass);
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);
}
internal string GenerateSalt()
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[32];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);
}
public static string Cipher(object obj)
{
string j = JSON(obj);
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = System.Text.Encoding.UTF8.GetBytes("salt");
aesAlg.IV = System.Text.Encoding.UTF8.GetBytes("salt");
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(j);
}
byte[] encrypted = msEncrypt.ToArray();
return Convert.ToBase64String(encrypted).Replace('/', '-').Replace('+', '_').Replace("=", "");
}
}
}
}
私は強くBCryptの代わりにSHA1のようなものを使用することをお勧めします。 SHA1を使用すると、たとえ塩分であっても、辞書攻撃に対して非常に脆弱であるため、パスワードを保存するのに最適な方法ではありません。 SHA1は高速アルゴリズムであり、大量のデータに対して高速に処理するように設計されています。古いコンピュータでもmillions of hashes per secondを計算することは可能です。
BCryptは修正された暗号化アルゴリズムを塩と一緒に使用し、作業係数と呼ばれるものを使用して1つのハッシュを計算するのに費用がかかります。攻撃者は多くのハッシュを計算する必要があるという事実を利用しますが、正当な検証のためには計算する必要があります。
詳細な説明については、優秀な記事How to Safely Store a Passwordも読んでください。
あなた自身の発明ではなく、PBKDF2のような組み込みキー派生プリミティブを使用する方がずっと良い考えがあります。 –
@NickJohnson私はちょうどあまりにも見ています..私は現在このプロセスを使用しています.. – Madhu