我正在使用 AES 和内置的 RijndaelManaged 在我的 asp.net 网络表单中创建一些加密。我想知道我应该使用什么样的密钥系统。我希望 SSN 在数据库中加密,并且只能由 ssn 的所有者或授权管理员解密。
我想知道的是,如果在应用程序期间创建了加密密钥,那么一旦应用程序关闭,我就不能再使用它了吗?我必须将密钥存储在数据库中吗?这似乎破坏了加密的意义。有没有办法根据种子号每次都获得相同的密钥?可能不会,这似乎很容易破解。我该如何解决这个问题?
我正在使用 AES 和内置的 RijndaelManaged 在我的 asp.net 网络表单中创建一些加密。我想知道我应该使用什么样的密钥系统。我希望 SSN 在数据库中加密,并且只能由 ssn 的所有者或授权管理员解密。
我想知道的是,如果在应用程序期间创建了加密密钥,那么一旦应用程序关闭,我就不能再使用它了吗?我必须将密钥存储在数据库中吗?这似乎破坏了加密的意义。有没有办法根据种子号每次都获得相同的密钥?可能不会,这似乎很容易破解。我该如何解决这个问题?
最后,Web 应用程序必须能够读取数据并将其呈现给授权用户。如果您希望多个用户访问数据,那么您需要某种方法来使用特定用户不唯一的方法来获取数据。这意味着必须信任该应用程序才能将其提供给合适的人。
这意味着您可能应该只使用数据库级加密来加密数据库中的值,假设您使用的是提供此功能的数据库。然后,您的应用程序可以根据您拥有的任何授权机制来确定是否向某人显示数据。
好吧,使用加密,您总是会遇到这个问题 - 如何处理密钥?密钥存储和管理是它自己的领域。
一些供您评估的方法:
如果您使用一些秘密(密码)自己验证用户,则可以从密码和盐中派生密钥。如果用户更改密码,请记住重新加密数据!盐可以与用户信息一起以明文形式存储。您可以执行以下操作从密码中派生加密密钥:
public static KeyIV GetKeyBytesFromPassword(string password, byte[] salt) {
using (var aes = new AesCryptoServiceProvider()) {
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt)) {
var res = new KeyIV {
Key = deriveBytes.GetBytes(aes.KeySize / 8),
IV = deriveBytes.GetBytes(aes.BlockSize / 8)
};
return res;
}
}
}
这里讨论了很多:在 SQL Server 2008 中加密 SSN 的最佳方法是什么?.. 我使用 RinadaelManaged 加密了密码,并存储了密钥和 IV 以及加密密码以进行描述。每条记录的密钥和 IV 都不同。
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx