加密密码列

时间:2016-01-06 10:12:40

标签: sql sql-server sql-server-2012

我有一个看起来像这样的数据库表(简化):

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上运行。

3 个答案:

答案 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]