在存储之前对密码进行两次哈希处理的安全性是否比仅仅哈希一次更安全?
我在说什么是这样做的:
$hashed_password = hash(hash($plaintext_password));
Run Code Online (Sandbox Code Playgroud)
而不仅仅是这个:
$hashed_password = hash($plaintext_password);
Run Code Online (Sandbox Code Playgroud)
如果它不太安全,你能提供一个很好的解释(或链接到一个)吗?
此外,使用的哈希函数是否有所作为?如果混合使用md5和sha1(例如)而不是重复相同的散列函数,它会有什么不同吗?
注1:当我说"双重哈希"时,我正在谈论两次哈希密码以试图使其更加模糊.我不是在谈论解决碰撞的技术.
注2:我知道我需要添加一个随机盐来真正使其安全.问题是使用相同算法进行两次散列是否有助于或损害散列.
这比普通MD5更安全吗?我刚刚开始研究密码安全性.我是PHP的新手.
$salt = 'csdnfgksdgojnmfnb';
$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
WHERE username = '".mysql_real_escape_string($_POST['username'])."'
AND password = '$password'");
if (mysql_num_rows($result) < 1) {
/* Access denied */
echo "The username or password you entered is incorrect.";
}
else {
$_SESSION['id'] = mysql_result($result, 0, 'id');
#header("Location: ./");
echo "Hello $_SESSION[id]!";
}
Run Code Online (Sandbox Code Playgroud) 我遇到了一个讨论,其中我了解到我一直在做的事情实际上并没有腌制密码而是给它们加油,而且我已经开始使用以下功能:
hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
Run Code Online (Sandbox Code Playgroud)
忽略所选的哈希算法(我希望这是对盐和辣椒的讨论,而不是特定的算法,但我使用的是安全算法),这是一个安全的选择还是我应该做一些不同的事情?对于那些不熟悉这些条款的人:
甲盐是通常存储与设计,使其不可能使用哈希表来破解密码的数据库中的字符串中的随机生成值.由于每个密码都有自己的盐,因此必须对它们进行单独的强制攻击才能破解它们; 但是,由于salt使用密码哈希存储在数据库中,因此数据库泄露意味着丢失两者.
甲胡椒是从中旨在是秘密的数据库(在应用程序的源代码通常硬编码)分开存储站点范围静态值.它的使用是为了破坏数据库不会导致整个应用程序的密码表变得暴力破解.
有什么我缺少的,并且正在腌制和密封我的密码是保护用户安全的最佳选择吗?这样做有没有潜在的安全漏洞?
注意:为了讨论的目的,假设应用程序和数据库存储在不同的机器上,不共享密码等,因此违反数据库服务器并不会自动意味着破坏应用程序服务器.
最近我一直试图在我在互联网上偶然发现的登录脚本中实现我自己的安全性.在努力学习如何制作我自己的脚本为每个用户生成一个盐之后,我偶然发现了password_hash.
根据我的理解(基于本页的阅读:http://php.net/manual/en/faq.passwords.php),当您使用password_hash时,已经在行中生成了salt.这是真的?
我的另一个问题是,含有2种盐是不是很聪明?一个直接在文件中,一个在DB中?这样,如果有人在数据库中泄露了你的盐,你仍然直接在文件中?我在这里读到,存储盐绝不是一个明智的想法,但它总是让我困惑的是人们的意思.
可能重复:
关于客户端的密码哈希系统
我必须保护我的网站用户的密码.我所做的是在服务器端使用MD5 加密哈希.但问题是密码保留为纯文本,直到它到达服务器,这意味着可以使用流量监控捕获密码.所以我想要的是使用客户端密码加密/散列机制并发送加密/散列密码.任何人都可以告诉你这样做的方法是什么?
众所周知,单向加密是加密数据库中用户密码的便捷方式.这样,即使数据库管理员也无法知道用户的密码,但必须输入密码,使用相同的算法对其进行加密,然后将结果与数据库中的加密密码进行比较.这意味着确定密码的过程需要大量的猜测和大量的处理能力.
看到计算机变得越来越快,数学家们仍然在开发这些算法,我想知道考虑到现代计算能力和加密技术哪一个是最安全的.
我几乎已经使用MD5几年了,我想知道是否还有更多我应该做的事情.我应该考虑不同的算法吗?
另一个相关问题:字段通常需要多长时间才能使用这样的加密密码?我必须承认我几乎一无所知加密,但我假设MD5哈希(作为一个例子)可能更长,并且可能需要更多的处理能力才能破解.或者字段的长度根本不重要,只要加密密码首先适合它?
我目前正在使用以下内容来加密密码:
var pass_shasum = crypto.createHash('sha256').update(req.body.password).digest('hex');
Run Code Online (Sandbox Code Playgroud)
您能否提出改进建议,使项目更安全?
我被要求对Intranet站点实施一些更改/更新; 让它成为'未来证明',因为他们称之为.
我们发现使用MD5算法对密码进行哈希处理.(该系统自2001年以来一直存在,因此它足够了).
我们现在想要将散列算法升级为更强的算法(BCrypt-hash或SHA-256).
我们显然不知道明文密码,为用户群创建新密码不是一个选项*).
所以,我的问题是:
在没有访问明文密码的情况下,更改散列算法的可接受方法是什么?
最好的解决方案是完全"幕后"的解决方案.
*) 我们尝试了; 试图说服他们,我们使用了"密码时代"的论点,试图用咖啡贿赂他们,试图用蛋糕贿赂他们等等.但这不是一种选择.
更新
我希望有一些解决问题的自动解决方案,但显然除了'等待用户登录,然后转换'之外没有其他选择.
好吧,至少现在我现在没有其他解决方案可用.
我想知道这个功能(部分取自~2岁的phpBB版本)是否足够好.
如果没有,为什么?
您将如何更改它(使现有用户无缝转换)?
hash_pwd()的结果将保存在DB中.
function hash_pwd($password)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$random_state = $this->unique_id();
$random = '';
$count = 6;
if (($fh = @fopen('/dev/urandom', 'rb')))
{
$random = fread($fh, $count);
fclose($fh);
}
if (strlen($random) < $count)
{
$random = '';
for ($i = 0; $i < $count; $i += 16)
{
$random_state = md5($this->unique_id() . $random_state);
$random .= pack('H*', md5($random_state));
}
$random = substr($random, 0, $count);
}
$hash = $this->_hash_crypt_private($password, $this->_hash_gensalt_private($random, $itoa64), $itoa64);
if (strlen($hash) == 34)
{
return $hash;
} …Run Code Online (Sandbox Code Playgroud) 我正在localhost上运行php版本5.4.16,而我正在开发我的网站.我想用password_hash(),但我一直收到这个错误:
致命错误:在第123行的/dir/to/file.php中调用未定义的函数password_hash()
为什么会这样?
谢谢!
php password-hash password-encryption undefined-function php-password-hash
password-hash ×10
passwords ×7
security ×7
php ×4
cryptography ×3
salt ×3
hash ×2
algorithm ×1
javascript ×1
jsp ×1
md5 ×1
node.js ×1
ssl ×1