我想知道哪个系统应该为安全的Web应用程序生成哈希和盐。
我的设置有三种可能性:
此时我已经在触发器内的MySQL服务器中实现了它。
它的作用是在创建新用户时在名为“PasswordHash”的字段中使用未加密/未加密的密码,因此原始密码位于INSERT
语句中。
但是在INSERT Before触发器中,此密码被散列(SHA1),其中随机盐(UUID)与散列连接成变量@hashandsalt
。 (我已经发现将哈希和盐存储到不同的列中并不是一个好主意。)
然后我执行SET NEW.PasswordHash = @hashandsalt;
所以原始密码永远不会写入数据库,而是替换为hash + salt。
这是个好主意吗?
我可以看到MySQL的日志记录问题,因为users-table的所有记录的 INSERT语句都包含原始密码。我目前不使用默认的MySQL日志记录,但我不确定MySQL如何在内部存储所有传入的语句。
在您看来,生成哈希和盐的最佳选择是什么?
答案 0 :(得分:1)
最好的方法是使用一个为您隐藏密码的PHP函数。
如果你有PHP => 5.5.0,那么你可以使用Password extension。它为您处理一切,因此您不必考虑它。除非你是该领域的专家,否则过于坦率地说,这不是一个好主意。
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$hashed = password_hash($password, PASSWORD_BCRYPT);
// Done!
如果你有PHP <5.5.0,那么有几个选项,其中包括:
crypt()
功能(使用起来有点麻烦,但工作正常)至于Javascript,没有。就是不行。密码哈希应该对客户端不可见,并且永远不会离开内部网络。
在SQL中执行它可能有效,但我不认为这是一个好主意,尤其是如果您自己编写它。没有冒犯,但编写自己的哈希算法很少是一个好主意;你应该使用那些知道自己在做什么的人写的算法,以及哪些人已经过其他专家的同行评审。