我正在尝试找到在mysql数据库中保护用户密码的最佳方法(哈希/加密方式)。我哪种方法最安全,最难破解。我在加密/散列等领域的经验不是很多。目前我正在使用一种非常不安全的方法来进行这种加密:
$encrypted_password = strrev(base64_encode($password));
我知道这不是最好的方法,但就像我说的那样,我是新人。有人能指出我正确的方向吗?
感谢。
答案 0 :(得分:5)
使用bcrypt:
Bcrypt是一种自适应密码散列算法,它使用Blowfish密钥时间表,而不是对称加密算法。
答案 1 :(得分:2)
编辑:你应该看看hash_hmac()。我认为这比腌制更好。
您可以使用sha1
和盐:
$salt = "some random string";
$encrypted_password = sha1($salt.$password);
如果有人设法获取加密密码列表,您添加盐会使rainbow tables更难使用。
你可以使用任何单向散列方法(我只喜欢sha1
),但最好在散列之前将其加盐。
答案 2 :(得分:0)
使用 hash_hmac 存储加密密码
如果您需要明文密码,请使用 des / aes / 3des
答案 3 :(得分:0)
以下是an article from Php.net,其中谈到了“安全密码哈希”。
当散列密码时,两个最重要的考虑因素是计算费用和盐。散列算法的计算成本越高,暴力输出的时间就越长。
有两个与PHP捆绑的函数可以使用指定的算法执行散列。
第一个散列函数是crypt(),它本身支持几种散列算法。使用此功能时,可以保证您选择的算法可用,因为PHP包含每个支持算法的本机实现,以防系统不支持一个或多个。
第二个散列函数是hash(),它支持比crypt()更多的算法和变体,但不支持crypt()所做的一些算法。 Hash扩展与PHP捆绑在一起,但可以在编译时禁用,因此不保证可用,而crypt()在PHP核心中。
散列密码时使用的建议算法是Blowfish,因为它在计算上比MD5或SHA1贵得多,同时仍然可扩展。
答案 4 :(得分:0)
你应该看一下php的hash()函数:http://se2.php.net/manual/en/function.hash.php
有了这个,你可以使用许多不同的哈希算法,我通常使用sha256,并在哈希之前添加一个盐。
答案 5 :(得分:0)
密码应该经过哈希处理,而不是加密。也就是说,您不应该删除密码。相反,你应该比较哈希。
您获得密码哈希并存储到DB:
$pw = hash_hmac('sha512', 'salt' . $password, $_SERVER['site_key']);
mysql_query('INSERT INTO passwords (pw) VALUES ('$pw');
客户稍后回来。他们输入了密码,然后对它进行比较:
mysql_query('SELECT pw FROM passwords WHERE user_id = ?'); //$pw = fetch
if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) {
echo "Logged in";
if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) {
我建议使用带盐的SHA2来存储密码。
要创建SHA2哈希,请使用:
echo "Logged in";
一个salt包含一些额外的字符,可以在散列之前添加到您的密码中以防止彩虹表(密码数据库及其哈希值)。您可以使用唯一的用户信息(如user_id)创建一个,或者只创建一个随机的用户信息并将其存储在某个地方。只要确保盐足够长。
答案 6 :(得分:0)
通常最好不加密密码,而是加密密码。
不同之处在于加密是对字符串进行编码,从而有可能对其进行解码。 散列是“单向的” - 一旦你“散列”某些东西,你就无法对其进行解散。一些字符串可以被散列到相同的结果中,但良好的散列可以减少碰撞的可能性。
最好避免存储实际密码,因为人们倾向于使用单个通用密码来访问多个网站。这意味着您可以访问其他网站上的帐户(或者如果您被泄露,黑客可以)。
将密码字符串与“salt”一起散列是很常见的。这是一些难以猜测的随机字符串,例如&%P)#@ M @#)+!@〜!@ 4320`2#@!$ 0或类似的东西。常见的哈希方法是md5 / sha1(或其他sha方法)。
所以你会:
$password = '....';
$enc_pass = sha1( '%^$sd%MDdF)@I#)3asd3223#@4*^&(*&@#' . $password );
$ enc_pass将存储在数据库中,在登录表单后,将对结果进行哈希处理(如上所述)并与数据库中的值进行比较。
PS:不要忘记让您的数据库列的大小包含整个密码;)
答案 7 :(得分:0)
我想补充一点,存储密码的哈希不会自动使身份验证过程安全。您还应该采用的是一个不错的密码策略。原因是,即使您拥有有史以来最复杂的哈希算法,并且用户使用密码“password”或“1234”,那么该算法也是无用的,因为密码可以简单猜到。
答案 8 :(得分:0)
不要忘记限制密码强度 因为密码强度是整个事情中最薄弱的部分。
只要您的用户使用弱密码,没有盐或额外安全的哈希例程会有任何帮助。
答案 9 :(得分:-2)
您可以使用的最佳散列算法是盐渍MD5散列,您可以在该特定对象的MD5散列字符串中插入一些随机字符。但是你必须记住插入随机字符的位置。这是必需的,以便您可以解密散列以获取原始对象或字符串。
$random="abcd";
$hashed=md5(your_string);
$salted_hash=$hashed.$random;
这是最简单的例子,我刚刚连接了散列和盐。但是你可以在中间的某处插入盐串。