不同应用程序域上的加密字符串更改

时间:2012-05-04 11:15:06

标签: .net sharepoint encryption powershell aes

以下加密和解密算法通过powershell和sharepoint应用程序页面调用:

    public static string Encrypt(string dataToEncrypt, string password, string salt)
    {
        AesManaged aes = null;
        MemoryStream memoryStream = null;
        CryptoStream cryptoStream = null;

        try
        {
            Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt), 10000);

            aes = new AesManaged();
            aes.Key = rfc2898.GetBytes(32);
            aes.IV = rfc2898.GetBytes(16);

            memoryStream = new MemoryStream();
            cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write);

            byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt);
            cryptoStream.Write(data, 0, data.Length);
            cryptoStream.FlushFinalBlock();

            return Convert.ToBase64String(memoryStream.ToArray());
        }
        finally
        {
            if (cryptoStream != null)
                cryptoStream.Close();

            if (memoryStream != null)
                memoryStream.Close();

            if (aes != null)
                aes.Clear();
        }
    }

为什么加密字符串会发生变化?它是关于应用程序域的吗?

2 个答案:

答案 0 :(得分:1)

当我运行问题代码时,使用相同的数据,密码和盐,每次都会产生相同的结果。如果甚至一个字节改变其余的更改,您应该确保dataToEncrypt和Salt每次都相同。

然而,对于语义安全而言,这并不是您想要的。你想要一个随机的盐来强制破解密码,以及一个随机的非秘密IV集,这样两个相同的明文就不会有相同的密文。

以下是使用加密算法安全功能设计的encrypting and decrypting string最佳做法示例。 SimpleEncryptWithPassword类似于您正在做的事情,尽管在示例中,派生键的迭代是可变的,出于性能原因,您可能想要对其进行硬编码。

答案 1 :(得分:1)

由于$字符,加密字符串不同。在通过powershell调用函数时,应该转义$