Php Mysql安全密码存储

Php Mysql安全密码存储,php,hash,Php,Hash,可能重复: 将密码存储到Mysql数据库的安全方式或哈希函数是什么?现在我使用这个sha1()函数将我的密码存储到DB中,代码如下。真的安全吗 <?php $pass = 123456789; $pass = sha1($pass); echo $pass; ?> 那么,我可以用任何数字/随机数/一些东西来表示$salt值吗?之后,现在是否安全?SHA*变体不应用于密码哈希。使用河豚算法和函数 是一个PHP密码哈希库,可以为您简化这一过程 您还可以对该主题进行更多的研究,编写一些

可能重复:

将密码存储到Mysql数据库的安全方式或哈希函数是什么?现在我使用这个sha1()函数将我的密码存储到DB中,代码如下。真的安全吗

<?php
$pass = 123456789;
$pass = sha1($pass);
echo $pass;
?>

那么,我可以用任何数字/随机数/一些东西来表示$salt值吗?之后,现在是否安全?

SHA*变体不应用于密码哈希。使用河豚算法和函数

是一个PHP密码哈希库,可以为您简化这一过程


您还可以对该主题进行更多的研究,编写一些代码来生成您自己的Bcrypt/Blowfish兼容的salt,并直接使用,而不是使用库。

您不能对salt使用随机值,因为您无法比较输入的密码和之后存储在数据库中的密码

你的加密基本上还可以,但如果你想的话,你可以变得非常疯狂

<?php
 $salt = "fF#$GGG$T@#4309g9jERGWrgrew@GH";
 $pepper = "vV@@#V90Ù39009gfjigwjorn)(";
 $pass = "123456789";
 $pass = $salt.$pass.$pepper;
 for ($i=0;$i<40;$i++){
    $pass = hash("sha256", $pass)
 }

 echo $pass;

在PHP中对密码进行哈希处理的最佳(也是推荐的)方法是使用

以下是PHP文档中的一个简单示例:

$hashed_password=crypt('mypassword');
//现在在数据库中存储$hash_密码
稍后,要检查输入的密码(假设
$user\u input
是输入的密码):

注意,在这个示例(上面)中,salt是在首次对密码进行哈希运算时自动生成的。这是危险的,应避免。应提供伪随机盐,并可按如下方式生成:

$salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);

要获得更好的解释,请参阅。

您可以使用任何要生成哈希的随机值,因为salt是附加在该哈希中的内容。最好使用随机字符串,这样密码就更安全了,在整个数据库中使用相同的密码与没有密码是一样的。@IgnacioBelhotColistro如果使用随机密码,你怎么能检查密码是否正确?@Alvin Wong,我想你是对的,但是为什么在我的数据库中,盐的形式是不同的呢。我相信您可以通过将生成的salt存储到数据库中来检查输入的密码是否正确。@IgnacioBelhotColistro,但至少不是MD5和SHA1。这样,您可以在数据库中存储随机salt。如果添加salt,使用
SHA*
(甚至MD5)不是很好吗?真的吗?我知道SHA1不再被认为是完全安全的,但据我所知,SHA256和SH512仍然可以使用吗?特别是有一个像样的盐,但我可能错了。SHA算法是专为SSL和TLS这样的东西设计的。在这种情况下,您希望能够非常快速地计算哈希,这样就不会影响性能。对于密码散列,您希望计算散列的速度非常慢(与SSL等使用的算法相比)。这不是加密,而是散列。好吧,问题是关于散列,而不是加密。这也是完全不正确的。您生成的每个密码散列都应该为其生成一个新的随机salt。crypt()的结果将包括以后比较密码所需的所有内容。好的,在阅读了上面评论中提到的帖子之后,我想你可以使用真正的安全性工具,并使用bcrypt。嗯@Xenon我正试图将我的密码存储到DB。那么实际上代码应该是什么样的呢?您可以更新它吗?如果未指定salt,则不应使用crypt-它可能会默认为MD5哈希,这对于密码来说是不安全的。下面@citricsquid的答案应被接受为正确答案。此答案不安全且危险。@Stephen我已更新了答案,以包含有关盐生成的信息。@Xenon:如果您认为链接答案更好地回答了问题,请将其作为问题下方的注释,并建议整个问题重复。非常感谢。
// retrieve $hashed_password from the database, then:

if (crypt($user_input, $hashed_password) == $hashed_password) {
   echo "Password verified!";
}
$salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);