PHP中的密码安全性

时间:2011-03-08 16:09:08

标签: php md5 salt

您认为最安全,最安全的方法是什么?我把这些片段从php.net上删除了。我只是想知道,因为人们发布了他们自己,我只是无法理解为什么有些人是他们的方式......有人可以帮助我,并告诉我更多关于这些?哪个最安全,为什么?

1

<?php
$hash = md5($salt1.$password.$salt2);
?>

2

<?php
function eliteEncrypt($string) {
    // Create a salt
    $salt = md5($string."%*4!#$;\.k~'(_@");

    // Hash the string
    $string = md5("$salt$string$salt");

    return $string;
}
?>

3

<?php
define ('SALT_ONE', 'some_random_123_collection_&$^%_of_stuff');
define ('SALT_TWO', 'another_random_%*!_collection_ANbu_of_stuff');

$password = 'dragon';

function generate_encrypted_password($str) {
$new_pword = '';

if( defined('SALT_ONE') ):
   $new_pword .= md5(SALT_ONE);
endif;

$new_pword .= md5($str);

if( defined('SALT_TWO') ):
   $new_pword .= md5(SALT_TWO);
endif;

return substr($new_pword, strlen($str), 40);
}

echo generate_encrypted_password($password);
?>

4

<?
function enchsetenev($toencode,$times)
{
    $salt = 's+(_a*';
    for($zo=0;$zo<$times;$zo=$zo+1)
    {
        $toencode = hash('sha512',salt.$toencode);
        $toencode = md5($toencode.$salt);
    }
    return $toencode;
}

?>

5

<?php
$hash = $password . $salt;

for ( $i = 0; $i < 10000; $i++ ) {
  $hash = md5( $hash );
}

echo $hash;
?>

5 个答案:

答案 0 :(得分:5)

  1. 这是我们想要的基本示例,添加到密码中的盐
  2. 这是与盐生成部分相同的例子。
  3. 一种不同的腌制方法,但仍然非常等效
  4. 这个过于复杂的例子绝对没有意义,用两种不同的哈希方法进行多次散列绝对不会提高安全性。
  5. 就像已经说过的那样,执行10000次散列绝对没有意义。
  6. 如果您将第一个示例更改为:

    <?php
      $hash = hash('sha256', $salt1.$password.$salt2);
    ?>
    

    这对99%的应用程序来说足够安全。

    唯一的问题是如何生成盐。我建议使用固定盐($ salt2)和为每个用户生成的盐($ salt1),它将沿着密码存储在数据库中。

    这样即使有人检索到您的数据库内容,您也可以非常安全地抵御彩虹表攻击。

答案 1 :(得分:0)

更好的选择是使用md5以外的其他内容,请检查here以获取与之相关的问题。

答案 2 :(得分:0)

对此没有标准的好答案。我所知道的是安全性和速度必须平衡。您可以AES加密每个信息,但这是否可行?要回答你的问题MD5(这是单向加密)加上SALT(一个非常随机的字符串)被认为是一个很好的安全标准。它碰巧是最快和最安全的。

如果你试图实现自己的加密,那么它不会像你那样缠绕电线太多次的魔法技巧,但它会因手腕拍打而松开。因此,除非你想要理论化和论证这个想法,否则请选择SALT + MD5。

答案 3 :(得分:0)

<?php
$hash = md5($salt1.$password.$salt2);
?>

这个我认为适合大多数目的,所以我会解释它。有两个盐的原因是因为假设$ salt1对每个用户名都是唯一的,因此它是用户表中的一列(用户注册时生成的随机字符串),$ salt2存储在config.ini文件中某处的文件系统中应用程序已安装,并且对所有用户都相同。现在猜测密码黑客需要$ salt1和$ salt1,他可以通过sql注入访问salt1,但是无法访问salt2在config.ini中被sotred的文件系统,因此需要双重保护。

答案 4 :(得分:-1)

只有5种不同的方法可以做到差不多吗?我认为这里的学习目标是了解腌制密码的重要性。盐的最佳方法是尽可能多地使用盐,盐串包含尽可能多的疯狂字符。