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中的密码安全性的主要内容,如果未能解决你的问题,请参考以下文章