我在sql server中使用aes_256算法加密了我的密码字段。密码字段现在已加密。现在我想登录用户,验证过程应该在服务器上完成。 我为验证过程编写的代码是:
bash pipeCheat.bash 'echo "john doe"' 'java A'
但是回答总是0.请告诉我我在做什么错误?
答案 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
没那么快。原因是DECRYPTBYKEY
和ENCRYPTBYKEY
都返回VARBINARY(8000)
,但用户输入@pwd
为VARCHAR(50)
。因此,如果不转换输出以匹配输入的数据类型,它们将始终不同。
CONVERT(VARCHAR,DECRYPTBYKEY(KEY_GUID('key1'),encryptedpwd))) = @pwd
最后,CLOSE SYMMETRIC KEY
上的BOL说
开放对称密钥绑定到会话而不是安全上下文。在明确关闭或会话终止之前,开放密钥将继续可用。
因此,使用。
显式关闭键是一个好习惯CLOSE SYMMETRIC KEY KEY1