我正在使用PHP和CodeIgniter框架连接到MySQL数据库。 我希望在数据库中加密存储密码,想知道最佳方法。
从高层次的概述来看,不要加密,而是使用哈希。如果可以的话,请使用BCrypt。这篇长文章解释了为什么要使用BCrypt和哈希。
最好的方法,既易于操作又安全可靠,就是使用phpass。如果您的PHP安装支持Blowfish,则它会使用bcrypt;如果不支持,则会使用多次md5加密。无论哪种方式,都比直接使用md5或sha1更加安全。
$hasher = new PasswordHash(8, false);
// Before storing a password
$hash = $hasher->HashPassword($password);
// To check a password against a hash
if ($hasher->CheckPassword($password, $hash))
// $password and $hash match
我在将密码存入数据库之前总是先对其进行md5sum加密,然后再对登录尝试的密码进行md5sum加密以与数据库中的密码进行比对。为了安全起见,我使用带有userID(用户名)和md5sum加密后的密码的where子句进行选择查询,只有当两者都匹配时才会返回任何行。
此外,如果您需要对密码进行混淆,mysql内部也会使用md5sum加密。
使用哈希函数;MD5 可以胜任。不要存储密码,而是存储哈希值。然后,要登录用户,请对其输入的密码进行哈希处理,并将其与数据库中的哈希值进行比较;如果哈希值匹配,则它们是合法的。
此外,在对密码进行哈希处理之前,添加一个盐。这可以很容易地实现,只需将一个字符串附加到密码上,例如您的域名或某些其他应用程序唯一的数据。这可以防止黑客使用彩虹表攻击您的哈希值。
嗯,我会根据写入密码存储和验证时想到的任何数学方法进行多次哈希。
从现在开始,我可能会尽可能地选择OpenID,无论我是否有实际选择,这样我就不必进行任何密码存储。这样我就可以把密码留给专家,而用户已经信任了第三方。
我同意使用哈希和盐值。但我不同意选择一个全站通用的哈希值。为每个用户使用不同的盐值,以防止一次性字典攻击所有密码。