Php 我的Bcrypt加密足够安全吗?
我正在从事一个项目,在保存密码等方面需要一个非常先进的安全系统。所以我的问题是,这种保存密码的方法足够安全吗 这是我编程的方式:Php 我的Bcrypt加密足够安全吗?,php,encryption,bcrypt,Php,Encryption,Bcrypt,我正在从事一个项目,在保存密码等方面需要一个非常先进的安全系统。所以我的问题是,这种保存密码的方法足够安全吗 这是我编程的方式: 当用户注册时,将根据以下详细信息创建salt: 唯一的用户ID(mySQL中的主键) 用户的电子邮件地址 当前(微)时间戳 网站配置中定义的一些随机键 这盐正被杂凑成一把钥匙 创建salt后,将使用Bcrypt对以下字符串进行散列:password+sha512 salt(工作级别10,($2a$10…) 然后跳过Bcrypt输出的前5个字符($2a$10),并将
- 唯一的用户ID(mySQL中的主键)
- 用户的电子邮件地址
- 当前(微)时间戳
- 网站配置中定义的一些随机键
$2a$10
)。如果你做得很好,这个散列实际上是不可能暴力的。省略该信息只会使您的工作更加困难,但对潜在的攻击者来说,这并不会使工作更加困难
存储该值可以让您查看创建哈希的算法,并随着时间的推移对其进行升级。随着硬件速度的提高,您应该增加算法的工作系数,并且随着更好的算法变得可用(hello scrypt!),您应该升级所使用的算法。其工作方式是在用户登录时检查哈希是否是使用最新和最大值创建的。此时,您就有机会重新设置明文密码并对其进行升级使用PHP的新版本或旧版本的垫片,这些版本经过了良好的测试,非常“高级”。首先,不要使用
bcrypt
。改用。这将增加离线暴力攻击的难度。[并不是说bcrypt不会,它们本质上是相同的,但PBKDF2支持任何哈希函数,而不仅仅是河豚]
第二,这里是你应该如何做到这一点
PBKDF2
函数的一部分的内容现在我想指出你们系统中的一个定时攻击。如果您告诉攻击者用户名不存在,或者返回错误所需的时间与返回成功所需的时间不同(且更短),则可能发生旁道攻击。附加信息可以使攻击者更容易枚举系统上的用户帐户(如果用户名基于电子邮件,那么他们现在可以直接对用户进行网络钓鱼攻击)。首先,我要感谢你们的快速响应,让系统尽可能不易被黑客攻击对我来说非常重要 根据你的建议,我制定了以下制度:
<?php
const COUNT = 8192;
const KEY_LENGTH = 254;
const ALGORITHM = 'sha512';
public static function encrypt($password, $salt, $algorithm = PBKDF2::ALGORITHM, $count = PBKDF2::COUNT, $key_length = PBKDF2::KEY_LENGTH, $raw_output = false) {
$algorithm = strtolower($algorithm);
if(!in_array($algorithm, hash_algos(), true))
die('PBKDF2 ERROR: Invalid hash algorithm.');
if($count <= 0 || $key_length <= 0)
die('PBKDF2 ERROR: Invalid parameters.');
$hash_length = strlen(hash($algorithm, "", true));
$block_count = ceil($key_length / $hash_length);
$output = "";
for($i = 1; $i <= $block_count; $i++)
{
$last = $salt . pack("N", $i);
$last = $xorsum = hash_hmac($algorithm, $last, $password, true);
for ($j = 1; $j < $count; $j++)
$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
$output .= $xorsum;
}
if($raw_output)
return substr($output, 0, $key_length);
else
return bin2hex(substr($output, 0, $key_length));
}
?>