2

現在、従来のASP.NET1.1アプリケーションを.NET4MVC3アプリケーションに変換しています。

パスワードの暗号化を調べていますが、MD5CryptoServiceProviderを使用するためのルーチンが古いコードで記述されています。

        private string EncryptText(string szText)
        {
            try
            {
                UTF8Encoding objEncoder = new UTF8Encoding();                
                MD5CryptoServiceProvider objMD5Hasher = new MD5CryptoServiceProvider();
                Byte[] btHashedDataBytes = objMD5Hasher.ComputeHash(objEncoder.GetBytes(szText));
                string szReturn = objEncoder.GetString(btHashedDataBytes);
                objEncoder = null;
                objMD5Hasher = null;

                return szReturn;
            }
            catch
            {               
                return "";
            }
        }

簡単な.NET4コンソールアプリケーションを作成し、この関数をコピーして、データベース内の現在のパスワードと比較できるようにしました(MD5関数でも同じ出力が得られることを確認するため)

            string encTxt = encryptor.EncryptText("fbloggsPass12345");

            using (SqlConnection conn = new SqlConnection("Server=server;Database=db;User Id=sa;Password=1111;"))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandType = System.Data.CommandType.Text;                   

                    cmd.CommandText = "UPDATE SiteUsers SET Token = '" + encTxt + "' WHERE PKey = 10";
                    if (cmd.ExecuteNonQuery() > 0)
                        Console.WriteLine("Updated");
                    else
                        Console.WriteLine("Failed");

                }
                conn.Close();
            }

            Console.ReadLine();

ただし、データベースのパスワードは現在!?MGF +&>であり、取得する出力は����!?��MGF�+&��>であり、データベースに保存すると???!??に変換されます。 ?MGF?+&??>

私が見ることができるものはほとんど同じですが、なぜ私は?文字

4

2 に答える 2

5

少なくとも、これが最初の問題です。

string szReturn = objEncoder.GetString(btHashedDataBytes);

UTF-8 でエンコードされたテキストであるかのようにハッシュを使用しようとしています。そうではなく、単なる任意のバイナリ データです。

任意のバイナリ データをテキストに変換する必要がある場合は、Base64 (例: Convert.ToBase64String) または hex などを使用する必要があります。

(さらに、現時点で行っている方法で例外を「処理」しないことを強くお勧めします。なぜそのような問題を隠したいのでしょうか?また、変数nullが範囲外になる直前に変数を設定するのはなぜですか?とりあえず?)

ああ、そのような SQL に値を直接含めないでください。代わりにパラメータ化された SQL を使用してください

最後に、最近では、特にパスワードに対して、別のハッシュ アルゴリズムを使用しています。実際にセキュリティの専門家が開発した既製の認証システムを使用できないでしょうか。セキュリティは難しいものです。正しく行う方法を知っている比較的少数の人々に任せたほうがよいでしょう :) その他の提案については、コメントを参照してください。

于 2012-11-30T10:22:45.833 に答える
1

影響の少ないアップグレードの標準的な手法は、古いハッシュを新しいハッシュ スキームの入力として使用することです。これは、通常の MD5 ハッシュでうまく機能します。

残念ながら、バイナリ ハッシュを非バイナリ セーフ エンコーディング (UTF8) で送信していました。これにより、1 文字おきに 0xFFFD に置き換えられ、出力サイズが実質的に半分の 64 ビットになりました。これにより、アップグレードされたスキームが大幅に弱体化されますが、致命的ではありません。

既存のハッシュを にアップグレードし、ユーザーのログイン時にハッシュを従来のスキームに依存しないPBKDF2(legacyHash, salt)新しいハッシュに置き換えます。PBKDF2(password, salt)数か月後、まだログインしていないすべてのユーザーのパスワード リセットがトリガーされ、従来のハッシュ ベースのパスワードが削除されます。

新しいスキームでは、 Rfc2898DeriveBytes Classに実装されている PBKDF2-SHA-1 を使用します。少なくとも 10000 回、十分な反復を使用してください。

于 2012-11-30T10:58:15.807 に答える