w00*_*977 0 sql sql-server sql-server-2012
我有一个看起来像这样的数据库表(简化):
CREATE TABLE User
(
ID int,
UserName varchar(100),
password varchar(100),
primary key (ID)
)
Run Code Online (Sandbox Code Playgroud)
我想加密password列.我已经研究过TDS(透明数据加密),看起来你可以在文件级加密数据库和列.
如果我使用这种方法,那么如果人们运行以下查询,他们会看到密码:
select password from [User]
Run Code Online (Sandbox Code Playgroud)
该数据库在SQL Server 2012 Enterprise Edition上运行.
您可以查看此链接,它可以帮助您开始正确的方向.
尽管如此,通常的做法是存储密码本身的哈希值,而不是密码的加密版本.散列将允许您检查用户是否输入了正确的密码(通过将数据库中的哈希值与用户输入的哈希值进行比较),而无需知道实际密码是什么.
这样做的好处是它通常更简单,更安全,因为您不需要加密/解密任何值.使用散列的缺点是你永远不能向用户发送他们的密码(如果你打算提供某种'忘记我的密码'功能),而是你必须将它重置为一个新的随机密码.
public string Encrypt(string plainText)
{
if (plainText == null) throw new ArgumentNullException("plainText");
//encrypt data
var data = Encoding.Unicode.GetBytes(plainText);
byte[] encrypted = ProtectedData.Protect(data, null, Scope);
//return as base64 string
return Convert.ToBase64String(encrypted);
}
public string Decrypt(string cipher)
{
if (cipher == null) throw new ArgumentNullException("cipher");
//parse base64 string
byte[] data = Convert.FromBase64String(cipher);
//decrypt data
byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);
return Encoding.Unicode.GetString(decrypted);
}
Run Code Online (Sandbox Code Playgroud)