php -加密密码 Encrypting

Translate

什么是最快且安全的加密密码方式(首选PHP),对于您选择的哪种方法,它都是可移植的?

换句话说,如果我以后将网站迁移到其他服务器,我的密码将继续有效吗?

我被告知,我现在使用的方法取决于服务器上安装的库的确切版本。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

如果您为登录系统选择一种加密方法,那么速度不是您的朋友,杰夫和托马斯·帕塔塞克(Thomas Ptacek)密不可分。结论您应该使用负担得起的最慢,最安全的加密方法。

从Thomas Ptacek的博客中:
速度正是您在密码哈希函数中所不想要的。

现代密码方案受到增量密码破解程序的攻击。

增量破解者不会预先计算所有可能的破解密码。他们分别考虑每个密码哈希,并以与PHP登录页面相同的方式通过密码哈希函数提供其字典。诸如Ophcrack之类的彩虹表饼干使用空间来攻击密码。开膛手John,Crack和LC5等增量破解者会随着时间而工作:统计和计算。

密码攻击游戏的时间是破解密码X所花费的时间。对于Rainbow表,该时间取决于您的表需要多大以及可以快速搜索它。对于增量式破解程序,时间取决于使密码哈希函数运行的速度。

您可以更好地优化密码哈希函数,密码哈希函数获得的速度越快,您的方案就越弱。 MD5和SHA1,甚至是像DES这样的常规分组密码,都被设计为快速的。 MD5,SHA1和DES是弱密码哈希。在现代CPU上,可以对DES和MD5之类的原始密码构建块进行位片化,矢量化和并行化,以使密码搜索快速实现。 FPGA游戏实现成本仅为数百美元。

来源
Translate

我和彼得在一起。开发人员似乎不了解密码。我们都选择(而且我也对此感到内))MD5或SHA1,因为它们速度很快。考虑一下(因为有人最近向我指出了这一点)没有任何意义。我们应该选择一个很慢的哈希算法。我的意思是,从规模上看,繁忙的网站会散列密码吗?每1/2分钟?谁在乎0.8秒与0.03秒服务器是否明智?但是,这种额外的速度非常慢,可以阻止所有类型的常见蛮力攻击。

根据我的阅读,bcrypt是专门为安全密码散列而设计的。它基于河豚,并且有很多实现。

对于PHP,请查看PHPPasshttp://www.openwall.com/phpass/

对于任何使用.NET的人,请查看BCrypt.NEThttp://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

来源
Translate

应该指出的是,您不想加密您想要的密码杂凑它。

加密的密码可以解密,让别人看到密码。散列是一种单向操作,因此用户的原始密码(通过密码)消失了。


至于应该选择哪种算法-请使用当前接受的标准算法:

  • SHA-256

而且,当您对用户密码进行哈希处理时,请确保也对它进行哈希处理。例如:

  • 密码:password1
  • 盐:PasswordSaltDesignedForThisQuestion

将盐添加到用户密码:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
来源
Translate

无论您做什么,都不要编写自己的加密算法。这样做几乎可以保证(除非您是密码学家)该算法中存在一个缺陷,使其难以破解。

来源
Translate

考虑使用bcrypt它在laravel等许多现代框架中使用。

来源
Translate

我并不一定要寻求最快的速度,而是要找到一个不错的平衡,为此代码开发的某些服务器运行速度相当慢,散列和存储密码的脚本需要5到6秒钟才能运行,而我已经将其范围缩小到哈希(如果我评论了哈希运行,则在1-2秒内)。

不一定必须是最安全的,我不是在竞购银行(现在),但我当然可以将不会将密码存储为纯文本格式。

来源
Translate

password_hash ( string $password , int $algo [, array $options ] )。 (PHP 5> = 5.5.0,PHP 7)

password_hash()使用强大的单向哈希算法创建新的密码哈希。 password_hash()与crypt()兼容。因此,由crypt()创建的密码哈希可以与password_hash()一起使用。

来源