【问题标题】:Restricting rijndaelmanaged algorithm key size?限制 rijndaelmanaged 算法密钥大小?
【发布时间】:2013-08-07 14:46:18
【问题描述】:

我正在使用 rijndaelmanaged 算法进行密码加密

有没有办法限制加密文本密钥的大小?

例如:1,ABC - 加密密钥大小 10

  2, ABCDHGF - Encrypted key size 10

表示固定大小!!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    如果您不需要从加密数据中取回密码,您可以使用哈希算法。首先计算密码的哈希值,然后加密这个哈希值。由于哈希值具有固定长度,因此您的加密数据将具有固定长度。当您需要检查密码时,解密加密值并根据输入的密码重新计算哈希值,然后检查它们是否匹配。

    例如在注册页面上

    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
    

    【讨论】:

    • 意味着它在 Rijndael 算法中不可能?
    • 是的。随着您的纯数据大小发生变化,您的加密数据大小也会发生变化。
    • 感谢您的帮助,但我已经使用了 Rijndael 算法,并且我的数据库中已经有许多加密密码。所以不可能换成另一种算法
    • 我认为有误会。这些解决方案都不需要更改加密算法,都仍然使用 Rijndael。如果您的数据库中已经有加密密码,您可以获取并解密它们,然后在使用这些解决方案之一加密后重新插入。
    • 对不起,我没听懂你,你能解释一下吗?目前我正在使用以下代码 public static string Encrypt("Welcome", "LED2080p") { var algorithm = GetAlgorithm(encryptionPassword);字节[] 加密字节;使用 (ICryptoTransform 加密器 = algorithm.CreateEncryptor(algorithm.Key, algorithm.IV)) { byte[] bytesToEncrypt = Encoding.UTF8.GetBytes(textToEncrypt); encryptedBytes = InMemoryCrypt(bytesToEncrypt, 加密器); } 返回 Convert.ToBase64String(encryptedBytes); }
    【解决方案2】:

    建议使用密码强化算法,而不是使用简单的哈希,如 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2013-07-04
      相关资源
      最近更新 更多