加密密码

时间:2008-08-03 11:50:33

标签: php encryption passwords

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

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

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

8 个答案:

答案 0 :(得分:31)

如果您为登录系统选择加密方法,那么速度不是您的朋友,Jeff与Thomas Ptacek谈论密码并且conclusion是您应该使用最慢的,大多数您可以承受的安全加密方法。

  

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

     

使用增量密码破解程序攻击现代密码方案。

     

增量破解程序不会预先计算所有可能的破解密码。他们分别考虑每个密码哈希,并且他们通过密码哈希函数提供他们的字典,就像你的PHP登录页面一样。像Ophcrack这样的彩虹表饼干使用空间来攻击密码; John the Ripper,Crack和LC5这样的增量破解程序可以与时间一起工作:统计和计算。

     

密码攻击游戏会在破解密码X时得分。对于彩虹表,该时间取决于您的桌子需要多大以及搜索速度有多快。对于增量破解程序,时间取决于您运行密码哈希函数的速度。

     

您可以更好地优化密码哈希函数,密码哈希函数获得的速度越快,您的方案就越弱。 MD5和SHA1,甚至像DES这样的传统分组密码都设计得很快。 MD5,SHA1和DES是弱密码哈希值。在现代CPU上,DES和MD5等原始加密构建块可以进行bitliced,矢量化和并行化,以便快速进行密码搜索。游戏结束FPGA实现仅花费数百美元。

答案 1 :(得分:15)

我和彼得在一起。开发人员似乎不懂密码。我们都选择(我也是犯了这个)MD5或SHA1,因为它们很快。想一想(因为有人最近向我指出了这一点)没有任何意义。我们应该选择一个愚蠢的哈希算法。我的意思是,就规模而言,一个繁忙的网站会将密码哈希么?每半分钟一次?谁关心服务器明智需要0.8秒vs 0.03秒?但是,这种额外的缓慢对于防止所有类型的常见野蛮攻击都是巨大的。

从我的阅读中,bcrypt专门用于安全密码散列。它基于河豚,有很多实现。

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

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

答案 2 :(得分:8)

应该指出你不想加密密码,你想要哈希

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


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

  • SHA-256

当您对用户的密码进行哈希处理时,请务必使用它在其他垃圾中进行哈希处理。 e.g:

  • 密码:password1
  • salt:PasswordSaltDesignedForThisQuestion

将salt附加到用户密码:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");

答案 3 :(得分:7)

无论您做什么,都不要编写自己的加密算法。这样做几乎可以保证(除非你是一个密码学家),算法中会有一个缺陷会使破解变得微不足道。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

我不一定要寻找最快但平衡良好的平衡,这个代码正在开发的服务器的一些相当慢,散列并存储密码的脚本需要5-6秒才能运行,并且我把它缩小到散列(如果我在1-2秒内评论散列它的运行)。

它不一定是最安全的,我不是为银行编码(现在),但我当然 不会 将密码存储为普通-text。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

在数据库中插入时使用此功能     Password_harsh($ password,PASSWORD_DEFAULT); 从数据库中进行选择时,您可以使用以下功能将要插入的密码与数据库中的密码进行比较     if(password_verify($ password,$ databasePassword)){

}else{
echo "password not correct";
}

这将以安全的格式破解密码