如何在sql server中进行密码验证?

时间:2016-05-18 18:49:59

标签: sql sql-server validation encryption passwords

我在sql server中使用aes_256算法加密了我的密码字段。密码字段现在已加密。现在我想登录用户,验证过程应该在服务器上完成。 我为验证过程编写的代码是:

bash pipeCheat.bash 'echo "john doe"' 'java A'

但是回答总是0.请告诉我我在做什么错误?

2 个答案:

答案 0 :(得分:1)

可以/不应该将密码验证委托给数据库。密码应该是散列和慢速算法,如BCrypt,PBKDF2或SCrypt,这些算法通常不受数据库系统支持。 Salting是强制性的,将阻止您搜索特定的密码哈希。

所以不要加密密码,而是像这样实现:

// Get password-hash by user id
SELECT hashedpwd FROM userInfo WHERE username=@username

// Verify the password within your application, which supports a safe algorithm
// like BCrypt, PBKDF2 or SCrypt.
// Take the salt from $existingHashFromDb or from a separate db-field.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

答案 1 :(得分:0)

简短回答是因为ENCRYPTBYKEY每次输出不同的结果,并且存储在表格中的加密值是不变的。

尝试运行下面的脚本以查看它的实际效果。

DECLARE @passphrase VARCHAR(50);
SET @passphrase = 'UseYourHashLuke';

OPEN SYMMETRIC KEY KEY1
DECRYPTION BY CERTIFICATE namecert

SELECT ENCRYPTBYKEY(KEY_GUID('KEY1'), @passphrase);

CLOSE SYMMETRIC KEY1
GO 10

您应该看到10种不同的输出。但是如果针对encryptedpwd的表运行SELECT语句,则每次输出都相同。这就是为什么即使输入正确,您的脚本也无法正确验证用户输入的原因。

现在,基于此,您可能正在考虑更改此行

encryptedpwd=(ENCRYPTBYKEY(KEY_GUID('key1'),@pwd))) 

这样的事,对吧?

DECRYPTBYKEY(KEY_GUID('key1'),encryptedpwd)) = @pwd

没那么快。原因是DECRYPTBYKEYENCRYPTBYKEY都返回VARBINARY(8000),但用户输入@pwdVARCHAR(50)。因此,如果不转换输出以匹配输入的数据类型,它们将始终不同。

CONVERT(VARCHAR,DECRYPTBYKEY(KEY_GUID('key1'),encryptedpwd))) = @pwd

最后,CLOSE SYMMETRIC KEY上的BOL说

  

开放对称密钥绑定到会话而不是安全上下文。在明确关闭或会话终止之前,开放密钥将继续可用。

因此,使用。

显式关闭键是一个好习惯
CLOSE SYMMETRIC KEY KEY1