2012-01-26 5 views

答えて

4

ソルトに使用できるランダムなデータを作成する方法はいくつかあります。最も一般的なものは以下のとおりです。

  • RNGCryptoServiceProviderクラスを使用して、桁のランダムな文字列を作成するGuidタイプ
  • を使用してランダムな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); 
} 
+0

あなた自身の発明ではなく、PBKDF2のような組み込みキー派生プリミティブを使用する方がずっと良い考えがあります。 –

+0

@NickJohnson私はちょうどあまりにも見ています..私は現在このプロセスを使用しています.. – Madhu

1

これはデフォルトのメンバシッププロバイダが何をされています

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); 
    } 
1
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("=", ""); 
      } 
     } 
    } 
} 
1

私は強くBCryptの代わりにSHA1のようなものを使用することをお勧めします。 SHA1を使用すると、たとえ塩分であっても、辞書攻撃に対して非常に脆弱であるため、パスワードを保存するのに最適な方法ではありません。 SHA1は高速アルゴリズムであり、大量のデータに対して高速に処理するように設計されています。古いコンピュータでもmillions of hashes per secondを計算することは可能です。

BCryptは修正された暗号化アルゴリズムを塩と一緒に使用し、作業係数と呼ばれるものを使用して1つのハッシュを計算するのに費用がかかります。攻撃者は多くのハッシュを計算する必要があるという事実を利用しますが、正当な検証のためには計算する必要があります。

詳細な説明については、優秀な記事How to Safely Store a Passwordも読んでください。

関連する問題