3

パスワードの暗号化にrijndaelマネージドアルゴリズムを使用しています

暗号化されたテキスト キーのサイズを制限する方法はありますか?

例: 1、ABC - 暗号化された鍵のサイズ 10

  2, ABCDHGF - Encrypted key size 10

固定サイズを意味します!!

4

2 に答える 2

2

暗号化されたデータからパスワードを取得する必要がない場合は、ハッシュ アルゴリズムを使用できます。最初にパスワードのハッシュ値を計算し、次にこのハッシュ値を暗号化します。ハッシュ値は固定長であるため、暗号化されたデータは固定長になります。パスワードを確認する必要がある場合は、暗号化された値を復号化し、入力したパスワードからハッシュ値を再計算して一致するかどうかを確認します。

たとえば、サインアップページで

var encryptedPwd = Encrypt(ComputeHash(txtPassword.Text));
Save(txtUsername.Text, encryptedPwd);

そしてログインページで

var encryptedPwd = SelectPwd(txtUsername.Text);
var pwdHash1 = Decrypt(encryptedPwd);
var pwdHash2 = ComputeHash(txtPassword.Text);

if (AreEqual(pwdHash1, pwdHash2))
   // Login OK!
else
   // Login fail

別のオプションとして、カスタム パディングを作成することもできます。パスワードの最大長は 16 文字だとします。次に、すべてのパスワードを固定文字で 16 文字にパディングできます。次に、このパディングされたパスワードを暗号化します。検証は簡単ですが、ハッシュを使用する方が少し安全です。

サインアップ

var encryptedPwd = Encrypt(txtPassword.Text.PadRight(16, 'X'));
Save(txtUsername.Text, encryptedPwd);

ログイン

var encryptedPwd = SelectPwd(txtUsername.Text);
var pwd1 = Decrypt(encryptedPwd);
var pwd2 = txtPassword.Text.PadRight(16, 'X');

if (AreEqual(pwd1, pwd2))
   // Login OK!
else
   // Login fail
于 2013-08-07T06:26:46.857 に答える
1

単純なハッシュを使用する代わりに、Rfc2898 で指定されているようなパスワード強化アルゴリズムを使用することをお勧めします

string password = "P@$$w0rd";
byte[] salt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; // this is fixed... It would be better you used something different for each user

// You can raise 1000 to greater numbers... more cycles = more security. Try
// balancing speed with security.
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes(password, salt, 1000);

// generate key and iv
byte[] key = pwdGen.GetBytes(16);
byte[] iv = pwdGen.GetBytes(16);


byte[] encrypted;

{
    RijndaelManaged rijndaelCipher = new RijndaelManaged();
    rijndaelCipher.Key = key;
    rijndaelCipher.IV = iv;

    // Or your data
    byte[] data = System.Text.Encoding.UTF8.GetBytes("hello world");
    var encryptor = rijndaelCipher.CreateEncryptor();

    encrypted = encryptor.TransformFinalBlock(data, 0, data.Length);
}

{
    RijndaelManaged rijndaelCipher = new RijndaelManaged();
    rijndaelCipher.Key = key;
    rijndaelCipher.IV = iv;

    var decryptor = rijndaelCipher.CreateDecryptor();

    byte[] decrypted = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length);

    // this if you are encrypting text, otherwise decrypted is already your data
    string text = System.Text.Encoding.UTF8.GetString(decrypted);
}
于 2013-08-07T06:36:49.907 に答える