2016-06-11 59 views
-2

我目前正在进行一个学校项目,部分任务是启用用户登录。因此,我认为使用简单的base64编码并将其转换为小写字母将是非常好的加密方法,因为base64通常由高位字符和低位字符组成。这里是一个代表性的代码:Base64编码与小写字母转换密码的安全性如何?

set @passwd = 'Password'; 
set @salt = 'Salt'; 
set @email = '[email protected]'; 

INSERT INTO `db_scrumboardtable`.`tb_user` (`mail`, `password`, `nameToDisplay`) VALUES (@email, LOWER(to_base64(sha2(concat(@passwd,@salt),512))) , 'test'); 

select u.tb_User_id from `db_scrumboardtable`.`tb_user` u where u.mail = @email and u.password = LOWER(to_base64(sha2(concat(@passwd,@salt),512))); 
+0

你的问题是什么? – hagello

+0

Base64可以被任何人撤消。你也可以用纯文本存储它。 –

+1

除了下面指出的重要问题外,正确的用法是'TO_BASE64(UNHEX(SHA2(...)))'。 MySQL中的哈希函数返回它们的十六进制编码的值,这需要被撤消,否则你有很多浪费的位(实际上等于4:8),因为你提供的字节数是实际需要的两倍传达信息,因此只有每个字节(6个可能的,因为有64个符号)的3个比特的Base64结果是有意义的。这将进一步简化逆转你的“算法”,因为根据定义,240/256个可能的输入无效。 –

回答

7

它不安全,它不是加密。

如果您将所有base64编码的字符更改为小写,您将失去获取原始值(“解密”)的能力。由于密码不应该加密,但散列,这并不是很糟糕。

现在,考虑为什么要对密码进行哈希处理,通常的攻击场景是,攻击者成功地设法窃取散列密码列表,但为了获取这些密码,他们需要强制输入以找到比赛。在这种情况下,他们可以简单地解码“加密”密码并获得有效密码。当然,这个密码的用处有限,因为它可以用来登录到它被盗的服务器,但不一定是用户可能使用过相同密码的其他服务。


密码应与像PBKDF2,bcrypt,scrypt或Argon2高的成本因素或多次迭代方案进行适当散列。

2

这不是安全的。您的内射转换(混合大小写)使得密码更易于猜测,而不是更难。

在21世纪充斥着网络犯罪分子,请不要试图发明自己的安全软件。请阅读这个。 http://php.net/manual/en/faq.passwords.php