在数据库中存储密码的最佳做法?

时间:2018-02-16 21:21:31

标签: hash coldfusion passwords salt coldfusion-2016

我正在为我的单页应用创建新的登录系统。该系统将要求管理员为用户创建帐户。一旦他们为用户设置帐户,我将向他们发送一封电子邮件,他们必须输入他们的信息,如安全问题和密码。所以我做了一些研究并查看了我们现有的系统。 hash函数与salt一起使用。我读了几篇文章,关于哈希容易受到攻击的争论很多。此外,我看到在这种情况下,存储了散列密码以及盐。它们位于不同的列中。这是在DB中存储盐的好习惯吗?还有更好的方法来存储数据库中的密码吗?以下是我发现的逻辑示例:

<cfset password = trim(FORM.password)>
<cfset salt = randomSalt()> //This is function that generates random salt.
<cfset totPW = password & salt>
<cfset hashedPW = hash(totPW,"SHA-256")>

我目前正在使用Cold Fusion 2016.我不确定是否有更好的方法来加密CF中的密码。如果有人可以提供一些有用的资源或示例,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:3)

一般来说,哈希这些天仍然很好。这里重要的是你使用的散列算法(以及迭代次数)。在数据库泄漏的情况下,您希望尽可能地使输入匹配(基于密码/字典的通用攻击)。 Salting确实有一点帮助,因此根据用户名等有不规则模式盐或隐藏的迭代次数等。只要攻击者不知道你的哈希是如何实现的,有不同的哈希策略会有所帮助。 (访问数据库服务器是一回事,访问另一个源代码。)这是为了给攻击者带来麻烦。

现在关于散列算法:由于可以通过GPU定位,SHA-2比例如bcrypt更容易攻击。散列上的迭代次数将使攻击者获得更多时间用于每个密码。 bcrypt不受hash()的支持,但至少是SHA-512。 hash()支持迭代(see docs)。经验法则是迭代计数需要至少一秒钟来处理您的服务器硬件。

旁注:不要修改密码输入,人们可能打算使用前导/尾随空格。