作为练习,我用 C++ 编写了自己的 SHA-512 哈希函数实现。我知道它有效,因为从 abc
我得到
3a81oZNherrMQXNJriBBMRLm.k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==
在 Base64 中。就像在测试站点中一样。
我有两个问题:
如何加盐我的密码?如果我有:
string salt = "ssssssss"; string pass = "mysecretpassword";
我应该创建字符串作为 salt+pass="ssssssssmysecretpassword"输入吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案 - 我找不到真正合适的东西。
我应该使用哪种 base64 编码来获取/etc/shadow 文件中的精确哈希密码?
最佳答案
1) 如果散列方案是好的,那么出于安全目的是否预先添加盐或附加盐并没有什么区别。仅当您想要匹配某些其他定义的密码散列过程的结果时。
2) /etc/shadow/
不包含像盐+密码的 SHA-512 哈希这样简单的内容。哈希函数的一种应用通常不足以密码哈希处理,这是一种需要矫枉过正的情况。
我相信任何基于 GNU 的系统都会使用 crypt(3)
使用 glibc 支持的附加算法之一。 Wikipedia表示默认情况下使用 5000 轮 SHA-512,但没有提及应用盐的位置。最终的字符串是所有这些轮次后哈希的 base-64 编码。您需要深入了解 crypt
功能的详细信息,而不是手册页中所涵盖的内容。您还需要检查开头的数字,以查看算法是否是 SHA-512 或其他选项之一。
[编辑:我找到了 a description of an SHA-512 crypt algorithm但我不知道这是他们实际实现的形式还是只是一个提议。]
其他 *nix 系统将有自己的等价物,不一定使用相同的哈希函数或相同的整体算法。
散列 5000 次的基本原因是,这意味着可以访问散列密码的攻击者只能使用给定的处理能力测试 1/5000 的候选密码。同时,您的系统只能验证 1/5000 的登录尝试次数,但这并不是一个有害的限制(事实上,在某些情况下,系统无论如何都会限制登录尝试的速度,因此基本上没有区别)。
关于c++ - SHA-512 - 加盐我的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22797697/