1. ホーム
  2. c#

[解決済み] C#でパスワードのハッシュ化とソルト化

2022-04-20 14:10:27

質問

DavidHaydenの記事の一つを読んでいたら ユーザーパスワードのハッシュ化 .

本当に彼が何を達成しようとしているのか、私には理解できません。

以下は彼のコードです。

private static string CreateSalt(int size)
{
    //Generate a cryptographic random number.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);

    // Return a Base64 string representation of the random number.
    return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
    string saltAndPwd = String.Concat(pwd, salt);
    string hashedPwd =
        FormsAuthentication.HashPasswordForStoringInConfigFile(
        saltAndPwd, "sha1");
    return hashedPwd;
}

パスワードのハッシュ化とソルトの付加を行うC#の方法は他にないのでしょうか?

どのように解決するのですか?

実は、これはちょっと不思議なことで、会員制プロバイダが設定ファイルに格納するために文字列を変換しているのです。ハッシュとソルトはバイナリ・ブロブなので、テキスト・ファイルに格納するのでなければ、文字列に変換する必要はないのです。

私の本では ASP.NETセキュリティ入門 私は次のようなことを行っています。

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
  HashAlgorithm algorithm = new SHA256Managed();

  byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length];

  for (int i = 0; i < plainText.Length; i++)
  {
    plainTextWithSaltBytes[i] = plainText[i];
  }
  for (int i = 0; i < salt.Length; i++)
  {
    plainTextWithSaltBytes[plainText.Length + i] = salt[i];
  }

  return algorithm.ComputeHash(plainTextWithSaltBytes);            
}

塩の生成は質問の例の通りです。テキストをバイト配列に変換するには Encoding.UTF8.GetBytes(string) . ハッシュを文字列表現に変換する必要がある場合は、次のようにします。 Convert.ToBase64StringConvert.FromBase64String に変換して戻します。

バイト配列には等号演算子は使えないので、単純に両方の配列をループして各バイトをチェックする必要があります。

public static bool CompareByteArrays(byte[] array1, byte[] array2)
{
  if (array1.Length != array2.Length)
  {
    return false;
  }

  for (int i = 0; i < array1.Length; i++)
  {
    if (array1[i] != array2[i])
    {
      return false;
    }
  }

  return true;
}

常に は、パスワードごとに新しいソルトを使用します。ソルトは秘密にする必要はなく、ハッシュそのものと一緒に保存することができます。