【发布时间】:2010-09-05 06:22:39
【问题描述】:
加密密码的最快且安全的方法是什么(最好使用 PHP),无论您选择哪种方法,它是否可移植?
换句话说,如果我以后将我的网站迁移到不同的服务器,我的密码会继续有效吗?
据我所知,我现在使用的方法取决于服务器上安装的库的确切版本。
【问题讨论】:
标签: php encryption passwords
加密密码的最快且安全的方法是什么(最好使用 PHP),无论您选择哪种方法,它是否可移植?
换句话说,如果我以后将我的网站迁移到不同的服务器,我的密码会继续有效吗?
据我所知,我现在使用的方法取决于服务器上安装的库的确切版本。
【问题讨论】:
标签: php encryption passwords
如果您为您的登录系统选择加密方法,那么速度不是您的朋友,Jeff 与 Thomas Ptacek 就密码问题争论不休,conclusion 是您应该使用最慢、最安全的加密你负担得起的方法。
来自 Thomas Ptacek 的博客:
速度正是您在密码哈希函数中不想要的。现代密码方案受到增量密码破解程序的攻击。
增量破解者不会预先计算所有可能的破解密码。他们单独考虑每个密码散列,并通过密码散列函数提供字典,就像您的 PHP 登录页面一样。像 Ophcrack 这样的彩虹表破解器使用空间来攻击密码;像 John the Ripper、Crack 和 LC5 这样的增量破解者使用时间:统计和计算。
密码攻击游戏以破解密码 X 的时间计分。对于彩虹桌,该时间取决于您的桌需要多大以及搜索速度有多快。使用增量破解器,时间取决于您可以使密码哈希函数运行多快。
你可以更好地优化你的密码哈希函数,你的密码哈希函数得到的越快,你的方案就越弱。 MD5 和 SHA1,甚至像 DES 这样的传统分组密码,都被设计成速度很快。 MD5、SHA1 和 DES 是弱密码哈希。在现代 CPU 上,原始加密构建块(如 DES 和 MD5)可以进行位切片、矢量化和并行化,以使密码搜索速度快如闪电。 Game-over FPGA 实施仅需数百美元。
【讨论】:
我和彼得在一起。开发人员似乎不理解密码。我们都选择(我也对此感到内疚)MD5 或 SHA1,因为它们速度很快。想一想(因为最近有人向我指出)这没有任何意义。我们应该选择一个愚蠢缓慢的散列算法。我的意思是,在事情的规模上,一个繁忙的网站会散列密码什么?每 1/2 分钟?谁在乎它是否需要 0.8 秒与服务器明智的 0.03 秒?但是这种额外的缓慢对于防止所有类型的常见暴力攻击来说是巨大的。
根据我的阅读,bcrypt 专为安全密码散列而设计。它基于河豚,有很多实现。
对于 PHP,请查看PHP Pass
对于任何使用 .NET 的人,请查看BCrypt.NET
【讨论】:
需要指出的是,你不想加密密码,你想散列它。
加密的密码可以被解密,让别人看到密码。散列是一种单向操作,因此用户的原始密码(以加密方式)消失了。
至于你应该选择哪种算法 - 使用当前公认的标准:
当您对用户密码进行哈希处理时,请务必在其他一些垃圾中使用它进行哈希处理。例如:
password1
PasswordSaltDesignedForThisQuestion
将盐添加到用户密码中:
String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
【讨论】:
无论做什么,都不要编写自己的加密算法。这样做几乎可以保证(除非您是密码学家)算法中存在缺陷,因此很容易破解。
【讨论】:
我不一定要寻找最快但很好的平衡,正在开发此代码的某些服务器相当慢,散列和存储密码的脚本需要 5-6 秒才能运行,并且我已将其范围缩小到散列(如果我评论散列,它会在 1-2 秒内运行)。
它不一定是最安全的,我不是为银行编码(现在),但我当然 不会 将密码存储为普通密码-文本。
【讨论】:
考虑使用bcrypt,它用于许多现代框架,如 laravel。
【讨论】:
插入数据库时使用该函数 Password_harsh($password,PASSWORD_DEFAULT); 从数据库中选择时,您使用该功能将您插入的密码与数据库中的密码进行比较 if(password_verify($password,$databasePassword)){
}else{
echo "password not correct";
}
这将以安全的格式对密码进行严苛
【讨论】:
password_hash ( string $password , int $algo [, array $options ] )。 (PHP 5 >= 5.5.0,PHP 7)
password_hash() 使用强大的单向散列算法创建新的密码散列。 password_hash() 与 crypt() 兼容。因此,crypt() 创建的密码哈希可以与password_hash() 一起使用。
【讨论】: