Hash 在数据库中存储密码的最佳实践?

Hash 在数据库中存储密码的最佳实践?,hash,coldfusion,passwords,salt,coldfusion-2016,Hash,Coldfusion,Passwords,Salt,Coldfusion 2016,我正在为我的单页应用程序创建新的登录系统。此系统将要求管理员为用户创建帐户。一旦他们为用户设置了帐户,我会给他们发送一封电子邮件,他们必须在那里输入他们的信息,如安全问题和密码。因此,我做了一些研究,并检查了我们现有的系统。有一个与salt一起使用的hash函数。我读了几篇文章,关于散列易受攻击的问题有很多争论。我还看到,在这种情况下,散列密码和salt一样被存储。它们在不同的列中。将盐储存在DB中是否是良好的做法?还有没有更好的方法在数据库中存储密码?下面是我发现的逻辑示例: <cfse

我正在为我的单页应用程序创建新的登录系统。此系统将要求管理员为用户创建帐户。一旦他们为用户设置了帐户,我会给他们发送一封电子邮件,他们必须在那里输入他们的信息,如安全问题和密码。因此,我做了一些研究,并检查了我们现有的系统。有一个与salt一起使用的
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中加密密码。如果有人能提供一些有用的资源或示例,请让我知道。谢谢

总的来说,散列现在仍然很好。这里重要的是使用什么散列算法(以及迭代次数)。在数据库泄漏的情况下,您希望尽可能难以匹配输入(commmon密码/基于字典的攻击)。salt确实有一点帮助,不规则的salt模式或基于用户名等的隐藏迭代次数也会有所帮助。只要攻击者不知道您的哈希是如何实现的,使用不同的哈希策略就会有所帮助。(访问数据库服务器是一回事,访问源代码是另一回事。)这是关于引起攻击者的努力

关于散列算法:SHA-2比bcrypt更容易攻击,因为它是GPU的目标。哈希上的迭代次数将使攻击者为每个密码花费更多的时间。
hash()
不支持bcrypt,但至少SHA-512支持<代码>哈希()支持迭代()。经验法则是,在服务器硬件上进行迭代计数至少需要一秒钟的时间


另一方面:不要删减密码输入,人们可能打算使用前导/尾随空格。

一般来说,散列现在仍然可以。这里重要的是使用什么散列算法(以及迭代次数)。在数据库泄漏的情况下,您希望尽可能难以匹配输入(commmon密码/基于字典的攻击)。salt确实有一点帮助,不规则的salt模式或基于用户名等的隐藏迭代次数也会有所帮助。只要攻击者不知道您的哈希是如何实现的,使用不同的哈希策略就会有所帮助。(访问数据库服务器是一回事,访问源代码是另一回事。)这是关于引起攻击者的努力

关于散列算法:SHA-2比bcrypt更容易攻击,因为它是GPU的目标。哈希上的迭代次数将使攻击者为每个密码花费更多的时间。
hash()
不支持bcrypt,但至少SHA-512支持<代码>哈希()支持迭代()。经验法则是,在服务器硬件上进行迭代计数至少需要一秒钟的时间


另请注意:不要修剪密码输入,人们可能会使用前导/尾随空格。

请参阅保存密码验证器时,仅使用哈希函数是不够的,仅添加salt对提高安全性几乎没有作用。相反,使用随机盐在HMAC上迭代大约100ms,并使用散列保存盐。最好使用函数,如
PBKDF2
Rfc2898DeriveBytes
Argon2
password\u hash
Bcrypt
或类似函数。问题的关键是让攻击者花费大量时间通过暴力手段查找密码。这类问题更像是一个信息安全问题。以下内容涵盖了其中的很多内容:。如果您对如何在ColdFusion中实现这一点有疑问,那么这个问题可能无法解决。请参阅仅使用哈希函数保存密码验证器是不够的,仅添加salt对提高安全性几乎没有什么作用。相反,使用随机盐在HMAC上迭代大约100ms,并使用散列保存盐。最好使用函数,如
PBKDF2
Rfc2898DeriveBytes
Argon2
password\u hash
Bcrypt
或类似函数。问题的关键是让攻击者花费大量时间通过暴力手段查找密码。这类问题更像是一个信息安全问题。以下内容涵盖了其中的很多内容:。如果您对如何在ColdFusion中实现这一点有疑问,那么这个问题可能无法解决。通常情况下~100ms是一个合理的CPU利用率值,远高于此值,这会变得很烦人,仅加密哈希就可以获得~1us的巨大收益,这是一个巨大的胜利:1到100000,额外的10x通常对用户体验来说是一个很糟糕的折衷。2.秘密散列方法和/或迭代计数或salt不安全,是迭代时间和随机salt提供了安全性。如回答中所述,修剪用户提供的密码是一个糟糕的主意,但根据NIST删除空格字符是可以接受的,而且可能是一个好主意,因为它们是不可见的。有一个选项可以在输入密码时显示密码,并允许使用unicode字符,这也是一个加号。@zaph甚至可以用每个密码的大量尝试乘以记录数乘以几µs,这是一个胜利。一秒钟都不是UX问题。如果用户忘记了他的密码,并通过了他的10个变种,他有这些额外的10秒,不要担心。不规则盐极有助于减缓攻击(例如使用hashcat)。这不是关于安全,而是关于存储通行证