PHP中的密码安全性

Kyl*_*yle 7 php md5 salt

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

1.

<?php
$hash = md5($salt1.$password.$salt2);
?>
Run Code Online (Sandbox Code Playgroud)

2.

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

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

    return $string;
}
?>
Run Code Online (Sandbox Code Playgroud)

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);
?>
Run Code Online (Sandbox Code Playgroud)

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;
}

?>
Run Code Online (Sandbox Code Playgroud)

5.

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

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

echo $hash;
?>
Run Code Online (Sandbox Code Playgroud)

krt*_*tek 5

  1. 这是我们想要的基本示例,添加到密码中的盐
  2. 它是相同的例子,但有盐生成部分.
  3. 一种不同的腌制方法,但仍然相当
  4. 在这个过于复杂的例子中绝对没有意义,用两种不同的哈希方法散列多次绝对不会提高安全性.
  5. 就像已经说过的那样,执行10000次散列绝对没有意义.

如果您将第一个示例更改为:

<?php
  $hash = hash('sha256', $salt1.$password.$salt2);
?>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 不要直接使用SHA256; 它太容易破解了.使用为此目的设计的正确密码哈希算法(例如bcrypt,PBKDF2).并且没有"99%的应用程序足够安全" - 许多用户将在您的网站和他们的银行使用相同的密码,因此您需要适当的密码散列来保护该密码.并且有可用的库,因此正确地执行它并不比执行它更难. (4认同)