Encryption 如何保护加密密码,即使是最脆弱的密码?

Encryption 如何保护加密密码,即使是最脆弱的密码?,encryption,passwords,md5,sha256,sha512,Encryption,Passwords,Md5,Sha256,Sha512,我一直在寻找保护用户密码的方法。我目前正在使用散列算法和随机盐的一些组合 这个问题的主要原因是我的用户设置了一个非常弱的密码。不管我的混合散列算法有多难,我的盐有多长,我认为它可以在不到一年的时间内破解 我一直在想一种新的方法。我制作了一个脚本,每次用户注销时都会对密码进行重新加密,方法是在旧的散列密码上添加一个随机盐,然后再次加密。因此,每次用户返回时,加密的密码都是不同的。明白了吗 但这个想法的主要问题是,每次用户注销时,我都必须存储新的盐。想象一下,如果用户每天都在登录和注销,我的代码会是

我一直在寻找保护用户密码的方法。我目前正在使用散列算法和随机盐的一些组合

这个问题的主要原因是我的用户设置了一个非常弱的密码。不管我的混合散列算法有多难,我的盐有多长,我认为它可以在不到一年的时间内破解

我一直在想一种新的方法。我制作了一个脚本,每次用户注销时都会对密码进行重新加密,方法是在旧的散列密码上添加一个随机盐,然后再次加密。因此,每次用户返回时,加密的密码都是不同的。明白了吗

但这个想法的主要问题是,每次用户注销时,我都必须存储新的盐。想象一下,如果用户每天都在登录和注销,我的代码会是什么样子

有什么想法吗


哦,我有个主意。每年重新生成新的加密密码怎么样?

您的主要假设有两个问题。第一个是关于盐的储存问题。您已经为salt密码解决方案做了很多工作。用你的新方法,盐会随着时间的推移而变化,就是这样。因此,您可以使用此方法,唯一的额外成本是在每次登录时重新计算哈希值,而实际上您拥有密码字符串本身


第二个问题更重要:重新散列不会改变任何东西。一旦攻击者获得一个salt散列值,就足以发起字典攻击。事实上,你改变了你的盐和你数据库中的散列不会使它变得更加困难。因此,在创建第一个散列后,无需重新计算散列

你的主要假设有两个问题。第一个是关于盐的储存问题。您已经为salt密码解决方案做了很多工作。用你的新方法,盐会随着时间的推移而变化,就是这样。因此,您可以使用此方法,唯一的额外成本是在每次登录时重新计算哈希值,而实际上您拥有密码字符串本身


第二个问题更重要:重新散列不会改变任何东西。一旦攻击者获得一个salt散列值,就足以发起字典攻击。事实上,你改变了你的盐和你数据库中的散列不会使它变得更加困难。因此,在创建第一个散列后,无需重新计算散列

重新加密无助于解决您的问题

你唯一能做的就是创建一个多部分散列,希望攻击者不要得到所有的散列。我通常使用两份盐:

其中一部分是存储在数据库中与密码一起的随机每个用户值

另一部分是每应用一次的盐。您可以将其存储在应用程序配置或操作系统提供的特殊密码存储中

这种分割的优点是,如果攻击者只获得对数据库的访问权限是不够的,但他需要访问存储应用程序的任何位置。因此,例如,一个简单的sql注入窃取您的数据库是不够的。如果攻击者能够执行代码,则可能毫无帮助

您应该使用一些方法来降低散列速度。典型的散列函数很快,所以蛮力也很快。但是,如果您对哈希函数进行一百万次迭代,它仍然不会大大降低有效登录的速度,但会大大降低暴力的速度


您可以使用PBKDF2之类的加密工具来实现这一点。

重新加密无助于解决您的问题

你唯一能做的就是创建一个多部分散列,希望攻击者不要得到所有的散列。我通常使用两份盐:

其中一部分是存储在数据库中与密码一起的随机每个用户值

另一部分是每应用一次的盐。您可以将其存储在应用程序配置或操作系统提供的特殊密码存储中

这种分割的优点是,如果攻击者只获得对数据库的访问权限是不够的,但他需要访问存储应用程序的任何位置。因此,例如,一个简单的sql注入窃取您的数据库是不够的。如果攻击者能够执行代码,则可能毫无帮助

您应该使用一些方法来降低散列速度。典型的散列函数很快,所以蛮力也很快。但是,如果您对哈希函数进行一百万次迭代,它仍然不会大大降低有效登录的速度,但会大大降低暴力的速度


您可以使用诸如PBKDF2之类的函数来实现这一点。

您可以使用键拉伸:在盐析之后迭代散列,比如说一百万次。 然后存储哈希值、salt和迭代计数。 这样,攻击者每秒检查密码的次数就比您散列一次密码的次数少一百万倍。但是一个很短的密码仍然会下降:请注意,您自己,要验证合法的密码,需要做同样的操作。假设你
接受1秒的时间供您自己检查,然后攻击者还可以在类似的机器上以1秒的时间检查每个密码,如果他使用更多或更快的机器,还可以以1秒的时间检查更多的密码!。每个密码1秒钟仍然足以检查弱密码和短密码、标准字典等。实际上没有任何防御措施,只会让它变得更难。

您可以使用密钥拉伸:在盐渍之后,重复哈希,比如说一百万次。 然后存储哈希值、salt和迭代计数。
这样,攻击者每秒检查密码的次数就比您散列一次密码的次数少一百万倍。但是一个很短的密码仍然会下降:请注意,您自己,要验证合法的密码,需要做同样的操作。假设您接受1秒的检查时间,那么攻击者还可以在类似机器上以1秒的时间检查每个密码,如果他使用更多或更快的机器,还可以检查更多!。每个密码1秒钟仍然足以检查弱密码、短密码、标准字典等。实际上,没有任何防御措施,只会让它变得更难。

是的。但我想这会更难,因为绳子更长。我不明白为什么会这样。密码相同,salt从S1更改为S2。最初的S1、H1值仍然有效,但现在将S2、H2存储在DB中。什么绳子变长了?我明白了。那么,你有什么想法吗?@dimasony对于弱密码你无能为力。无论您的底层机制是什么,它们都会受到字典攻击。CodeInChaos的回答中有一些增加攻击时间的好方法。是的。但我想这会更难,因为绳子更长。我不明白为什么会这样。密码相同,salt从S1更改为S2。最初的S1、H1值仍然有效,但现在将S2、H2存储在DB中。什么绳子变长了?我明白了。那么,你有什么想法吗?@dimasony对于弱密码你无能为力。无论您的底层机制是什么,它们都会受到字典攻击。CodeInChaos的答案有一些很好的方法来增加攻击时间。只要使用很长的salt,或者开始对人们的密码执行标准。只要使用很长的salt,或者开始对人们的密码执行标准。我明白了。所以我们的想法是尽可能地降低暴力的速度?我试试这个。这是第二部分的想法。当然,你也会因为同样的因素而降低合法登录的速度。因此,这是在计算登录成本和降低攻击者速度之间的折衷。根据用户数量,一个好的折衷方案可能是服务器应用程序大约10毫秒,磁盘加密大约1秒钟。我明白了。所以我们的想法是尽可能地降低暴力的速度?我试试这个。这是第二部分的想法。当然,你也会因为同样的因素而降低合法登录的速度。因此,这是在计算登录成本和降低攻击者速度之间的折衷。根据用户数量,一个好的折衷方案可能是服务器应用程序大约10毫秒,磁盘加密大约1秒钟。