如何为一个密码实现sha 512,md5和salt加密[重复]

Posted

技术标签:

【中文标题】如何为一个密码实现sha 512,md5和salt加密[重复]【英文标题】:how to implement sha 512,md5 and salt encryption all for one password [duplicate] 【发布时间】:2014-03-09 19:57:27 【问题描述】:
$pass="test"

上面的变量包含一个名为 test 的密码。我想使用 sha512 md5 和 salt 对这个密码进行哈希处理,因为我只发现 salt 和 sha512 的好处,我已经知道 md5 加密。请我需要解决方案我的系统很脆弱

请用代码示例解释一下,因为我仍然附在 md5 上


根据我对您的 cmets 的理解和答案,我得到了以下代码

$pass="test";
$hashed_pass= openssl_digest($pass, 'sha512');

ok 看起来足够可靠,但是 [salt=''] 是什么? 它会生成一个随机的盐字符串吗?如果是的话如何实现它?

【问题讨论】:

为什么不使用现在内置于 php 本身的 password_* 函数,或者如果您还没有使用 PHP5.5 和这些函数的 userland implementation 并且代码示例在 PHP 中文档页面 另见 Openwall 的 PHP password hashing framework (PHPass)。它的便携性和强化了针对用户密码的一些常见攻击。编写框架 (SolarDesigner) 的人与编写 John The Ripper 并在 Password Hashing Competition 担任评委的人是同一个人。所以他对密码攻击略知一二。 一个简单的谷歌查询已经回答了所有这些问题 【参考方案1】:

如果您使用 PHP >= 5.3,函数 openssl_digest 应该可以解决问题:

echo openssl_digest($pass, 'sha512');
// result
ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff

echo md5($pass);
// result
098f6bcd4621d373cade4e832627b4f6

在 PHP 5.1 或 5.2 中,您拥有哈希函数:

echo hash('sha512', $pass);
// result
ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff

echo md5($pass);
098f6bcd4621d373cade4e832627b4f6

【讨论】:

我需要同时使用 sha512,salt,md5 散列 请解释一下生成随机盐和用它散列密码的过程 为了澄清这个答案中的“结果”......他使用了 OP 中的原始字符串:“test”来获取以 ee26b0 开头的哈希值。所以在顶部添加$pass = 'test';【参考方案2】:

编辑:由于这个答案似乎仍然引起了一些兴趣,让我引导大家转向password_hash(),它本质上是crypt() 的包装,但使用起来更简单。如果您使用的是 PHPpassword_compat 是由同一个人编写的,实际上与官方文档链接。

如果您已经在使用crypt(),值得注意的是password_verify()password_needs_rehash() 都可以使用所有crypt() 风格的密码,所以几乎没有理由更新!


使用crypt(),它提供了更强大的哈希方法。

散列一个新密码:

// generate a 16-character salt string
$salt = substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
// how many times the string will be hashed
$rounds = 10000;
// pass in the password, the number of rounds, and the salt
// $5$ specifies SHA256-CRYPT, use $6$ if you really want SHA512
echo crypt('password123', sprintf('$5$rounds=%d$%s$', $rounds, $salt));
// output: $5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8

比较现有密码:

// the hash stored for the user
$given_hash = '$5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8';
$test_pw = 'password123';

// extract the hashing method, number of rounds, and salt from the stored hash
// and hash the password string accordingly
$parts = explode('$', $given_hash);
$test_hash = crypt($test_pw, sprintf('$%s$%s$%s$', $parts[1], $parts[2], $parts[3]));

// compare
echo $given_hash . "\n" . $test_hash . "\n" . var_export($given_hash === $test_hash, true);
/* output:
$5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8
$5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8
true */

【讨论】:

请不要那么高级的编码少一点混乱 @Yasin 好吧,我可以给你一个简单的小 sn-p,它将 MD5、SHA 和盐串在一起,最后得到一个易于破解的哈希. 或者您可以参考 PHP 文档,查找您不了解的函数,了解它们如何协同工作以合理安全地散列密码,然后在游戏中脱颖而出。 嗨@Sammitch,我有一个关于PHP crypt() 函数的问题。如果我们使用这种方法来实现登录系统,$5$rounds=10000$ + salt 都存储在数据库中,这将如何使其安全?如果黑客破坏了数据库,他们现在知道密码被散列了多少次,散列的类型以及盐。他们的工作是为他们完成的吗?剩下要做的就是用蛮力攻击它,就像有人试图破解它时使用任何其他类型的哈希一样,不是吗? @Winter 盐和散列的轮数不是秘密值。加盐的目的是使使用预先计算的哈希表来确定原始密码变得不可行,而散列轮的目的是增加暴力破解密码所需的工作量。 @Sammitch 啊,好吧。那么在 mysql 中存储这个“原样”是完全安全的吗?

以上是关于如何为一个密码实现sha 512,md5和salt加密[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#:使用来自 /etc/shadow 的 linux 用户的 salt 验证密码哈希 (SHA512)

哈希密码,从破碎的方法到现在最安全

密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)

Openldap 支持 sha256 和 sha512 密码格式

什么是更好的? Password_hash vs. SHA256 vs. SHA1 vs. md5

500g文件怎么存储