可以安全地在数据库触发器中创建哈希和salt吗?

时间:2014-02-05 04:20:53

标签: php mysql hash passwords sha1

我想知道哪个系统应该为安全的Web应用程序生成哈希和盐。

我的设置有三种可能性:

  • (Javascript)客户端
  • PHP服务器
  • MySQL服务器

此时我已经在触发器内的MySQL服务器中实现了它。 它的作用是在创建新用户时在名为“PasswordHash”的字段中使用未加密/未加密的密码,因此原始密码位于INSERT语句中。

但是在INSERT Before触发器中,此密码被散列(SHA1),其中随机盐(UUID)与散列连接成变量@hashandsalt。 (我已经发现将哈希和盐存储到不同的列中并不是一个好主意。)

然后我执行SET NEW.PasswordHash = @hashandsalt;所以原始密码永远不会写入数据库,而是替换为hash + salt。

这是个好主意吗?

我可以看到MySQL的日志记录问题,因为users-table的所有记录的 INSERT语句都包含原始密码。我目前不使用默认的MySQL日志记录,但我不确定MySQL如何在内部存储所有传入的语句。

在您看来,生成哈希和盐的最佳选择是什么?

1 个答案:

答案 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,那么有几个选项,其中包括:

  1. 先生使用compatibility libraryAnthony Ferrara
  2. 使用其他库(例如PHPass)。
  3. 使用crypt()功能(使用起来有点麻烦,但工作正常)
  4. 至于Javascript,没有。就是不行。密码哈希应该对客户端不可见,并且永远不会离开内部网络。

    在SQL中执行它可能有效,但我不认为这是一个好主意,尤其是如果您自己编写它。没有冒犯,但编写自己的哈希算法很少是一个好主意;你应该使用那些知道自己在做什么的人写的算法,以及哪些人已经过其他专家的同行评审。