c++ - SHA-512 - 加盐我的密码

标签 c++ cryptography salt sha

作为练习,我用 C++ 编写了自己的 SHA-512 哈希函数实现。我知道它有效,因为从 abc 我得到

3a81oZNherrMQXNJriBBMRLm.k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==

在 Base64 中。就像在测试站点中一样。

我有两个问题:

  1. 如何加盐我的密码?如果我有:

    string salt = "ssssssss";
    string pass = "mysecretpassword";
    

    我应该创建字符串作为 salt+pass="ssssssssmysecretpassword"输入吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案 - 我找不到真正合适的东西。

  2. 我应该使用哪种 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/

相关文章:

Salt:我可以在命令行中使用参数作为Jinja变量吗?

c++ - 打印空心直角三角形

c++ - 如何在 C++ 中解释带有集合类型的方法

c# - 如何在 Windows 上的 .net 框架中使用来自 ECC X509 证书的公钥加密数据?

c# - 使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串

java - 如何使用 Shiro 的 Salted AuthenticationInfo?

php - 在 php 中散列(用盐)用户名和密码

c++ - 如何禁止Qt Creator自动使用特定的包含路径?

c++ - 将十进制 (SQL) 转换为 double C++

c - 将 256 位 key 打入 32 位轮 key 的问题