PHP中的密码安全性

Posted

技术标签:

【中文标题】PHP中的密码安全性【英文标题】:password security in PHP 【发布时间】:2011-07-11 05:46:44 【问题描述】:

您认为哪种方法最安全?我从 php.net 中删除了这些 sn-ps。我只是想知道,因为人们发布了他们自己的帖子,而我只是无法理解为什么有些人是这样的……有人可以帮助我并告诉我更多关于这些的信息吗?哪个最安全?为什么?

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

【问题讨论】:

一切都是安全的,取决于你喜欢哪一个 for 循环怎么样,加密散列不是很糟糕吗? 您可能想查看已经问过的问题:-***.com/q/401656/158014-***.com/q/4388908/158014-***.com/q/2283937/158014-***.com/q/5089841/158014希望对您有所帮助。 就个人而言,我更喜欢我的 salt 对于每个用户帐户都是唯一的,而不是为每个帐户使用相同的 salt。 for ( $i = 0; $i 【参考方案1】:
    这是我们想要的一个基本示例,在密码中添加了盐 这是相同的示例,但具有盐生成部分。 另一种腌制方法,但仍然相当 在这个过于复杂的例子中绝对没有意义,多次使用两种不同的哈希方法进行哈希绝对不会提高安全性。 如前所述,执行 10000 次哈希绝对没有意义。

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

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

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

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

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

【讨论】:

不要直接使用SHA256;它太容易破解了。使用为此目的设计的适当密码散列算法(例如 bcrypt、PBKDF2)。并且没有“对 99% 的应用程序足够安全”这样的东西——许多用户将在您的网站和他们的银行使用相同的密码,因此您需要适当的密码散列来保护该密码。并且有可用的库,所以做对并不比做错更难。【参考方案2】:
<?php
$hash = md5($salt1.$password.$salt2);
?>

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

【讨论】:

md5 不再安全,在任何现代计算机上都可以在不到一天的时间内发现冲突。当然不是每个人都能做到这一点,但你应该建议至少使用sha1【参考方案3】:

对此没有标准的好答案。我所知道的是必须平衡安全性和速度。您可以使用 AES 加密所有信息,但这可行吗?要回答您的问题,MD5(这是一种加密方式)加上 SALT(一个真正随机的字符串)被认为是一个很好的安全标准。它恰好是最快和足够安全的。

如果您尝试实施自己的加密,那会像魔术一样,您将电线缠绕太多次,但手腕一巴掌就解除了。因此,除非您想对这个想法进行理论化和论文化,否则请选择 SALT+MD5。

【讨论】:

【参考方案4】:

是否只有 5 种不同的方法可以做几乎相同的事情?我认为这里的学习目标是了解加盐密码的重要性。加盐的最好方法是尽可能多地使用盐,并且盐字符串包含尽可能多的疯狂字符。

【讨论】:

因为您无论如何都要对密码和盐进行散列,所以盐的长度和“疯狂”因素并不那么相关。唯一重要的是为每个密码设置不同的盐。【参考方案5】:

更好的选择是使用 md5 以外的其他东西,请查看 here 以获取先前已回答的与此相关的问题。

【讨论】:

没错,但是如果你不加盐,SHA1 并不比 md5 好,是你的用户使用了字典中的单词吗? @DNRN sha1 比 md5 好得多,实际上很容易找到任何 md5 哈希的冲突。 请注意,示例问题已通过指向和关于盐的解释性链接得到回答...

以上是关于PHP中的密码安全性的主要内容,如果未能解决你的问题,请参考以下文章

php中密码的加密处理及安全措施

PHP 密码存储/检查类。保持密码安全。

为啥在php中硬编码用户名密码安全威胁?

PHP - 安全地存储外部服务的密码?

MySQL中的密码加密[重复]

在 php.ini 文件中保存 MySQL 用户名/密码是不是安全? [复制]