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

我的设置中有3种可能性:


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


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

但是在INSERT Before触发器中,此密码使用随机盐(UUID)进行散列(SHA1),该随机盐与该散列串联在一起成为变量@hashandsalt。 (我已经发现将哈希和盐存储在单独的列中并不是一个好主意)。

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

这是一个好主意吗?

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

您认为生成哈希和盐的最佳选择是什么?

最佳答案

最好的方法是使用为您哈希密码的PHP函数。

如果您的PHP => 5.5.0,则可以使用Password extension。它可以为您处理所有事情,因此您无需考虑。坦率地说,除非您是该领域的专家,否则要想得太多。

$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$hashed = password_hash($password, PASSWORD_BCRYPT);
// Done!


如果您的PHP

使用先生的compatibility libraryAnthony Ferrara
使用另一个库(例如,PHPass)。
使用crypt()函数(使用起来有点麻烦,但是效果很好)


至于Javascript,不。就是不行。密码哈希对客户端应该是不可见的,并且永远不要离开内部网络。

在SQL中执行此操作可能有效,但我认为这不是一个好主意,尤其是如果您自己编写的话。没有冒犯,但是编写自己的哈希算法很少是个好主意;您应该使用由知道自己在做什么并且已被其他专家进行同行评审的人编写的算法。

关于php - 在数据库触发器内创建哈希和盐是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21568578/

10-15 02:00
查看更多