我有一个看起来像这样的数据库表(简化):
CREATE TABLE User
(
ID int,
UserName varchar(100),
password varchar(100),
primary key (ID)
)
我想加密password
列。我已经研究过TDS(透明数据加密),看起来你可以在文件级加密数据库和列。
如果我使用此方法,那么如果用户运行以下查询,他们会看到密码:
select password from [User]
数据库在SQL Server 2012 Enterprise Edition上运行。
答案 0 :(得分:5)
您可以查看此link,这可以帮助您开始正确的方向。
尽管如此,通常的做法是存储密码本身的哈希值而不是密码的加密版本。散列将允许您检查用户是否输入了正确的密码(通过将数据库中的哈希值与用户输入的哈希值进行比较),而无需知道实际密码是什么。
这样做的好处是它通常更简单,更安全,因为您不需要加密/解密任何值。使用散列的缺点是你永远不能向用户发送他们的密码(如果你打算提供某种'忘记我的密码'功能),而是你必须将它重置为一个新的随机密码。
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);
}
答案 1 :(得分:1)
您还可以查看此link,其中演示了对称密钥加密的使用。
答案 2 :(得分:0)
CREATE TABLE [Users] (
UserID int identity(1,1) primary key,
[Login] varchar(32) unique,
[Email] varchar(32) unique,
[Password] varbinary(256) not null,
[BackupCode] varbinary(256) not null,
ModifiedDate datetime default (getdate()));
DECLARE @EncryptionKey nvarchar(32) = '007London' ;
DECLARE @Password varchar(32) = 'LoveDanger&Romance' ;
DECLARE @Code varchar(32) = 'GoNawazGo' ;
插入查询(加密):
INSERT [Users] ([Login], [Email], [Password], [BackupCode])
SELECT 'JamesBond', 'test@test.com',
EncryptByPassPhrase(@EncryptionKey, @Password),
EncryptByPassPhrase(@EncryptionKey, @Code)
选择查询(解密):
SELECT *,
DecryptedPassword = Convert(varchar(32),
DecryptByPassPhrase(@EncryptionKey, [Password])),
[Password],
DecryptedCode = Convert(varchar(32),
DecryptByPassPhrase(@EncryptionKey, [BackupCode])),
[BackupCode]
FROM [Users]