当前位置: 首页 > 知识库问答 >
问题:

SHA-512-salt我的密码

姚麒
2023-03-14

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

3a81oZNherrMQXNJriBBMRLm.k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==

在Base64中。就像在测试现场一样。

我有两个问题:

>

  • 如何加密我的密码?如果我有:

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

    我应该创建字符串以输入盐通过="ssssssssmy密钥密码"吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案——我找不到真正合适的东西。

    在base64中,我应该使用什么编码来获得像/etc/shadow文件中那样的精确哈希密码?

  • 共有2个答案

    赵兴朝
    2023-03-14

    从理论上讲,在密码(秘密数据)之前添加盐(非秘密数据)是不好的。因为,由于散列函数按顺序处理它们的输入(以1到64字节及更多的块为单位),因此可以预先计算非秘密数据的初始块的散列函数状态,并将其用作所有未来排列的起点,-有效地消除了盐可能引入的几乎任何额外保护。然而,实际上,盐密码通常占用少于加密散列函数的单个输入块(通常为512位或更多),因此这不被认为是一个问题。

    更重要的是,当涉及到密码学时,您永远不应该发明自己的轮子,而应该尽可能使用现有的安全方案。当你问自己:“我应该这样做,还是应该那样做?”(比如“我应该预加盐还是加盐?”)-你很有可能发明了一个轮子,这会给你一种虚假的安全感。

    对于“加盐密码”的任务,要走的一条路是基于哈希的消息验证码(HMAC)方案,也称为键散列:只需将您的盐用作消息,将您的密码用作密钥——该函数将以适当的方式组合参数,免除您记住“是添加还是附加”的责任。这个函数实际上是常规散列函数的包装器,非常简单,因此如果您的加密框架缺少一个,您可以轻松地自己实现它,但请务必针对已知结果进行测试

    另一种可能的替代方法是基于密码的密钥派生函数,如PBKDF2,它是HMAC或类似函数的另一个包装器。PBKDF2的一个重要优点是,它可以执行数[千]轮哈希运算,而不仅仅是一轮,这可能会随着处理能力的发展而增加。

    附言:你确实明白,盐在每一个场合都必须随机选择,不能保持不变(或者更糟的是,一个字典单词),是吗?

    鲜于煜祺
    2023-03-14

    1)如果散列方案是好的,那么出于安全目的,是添加还是附加盐没有区别。只有当您想匹配其他定义的密码散列过程的结果时。

    2) /etc/shadow/不包含任何像salt密码的SHA-512哈希这样简单的内容。哈希函数的一个应用程序通常不足以进行密码哈希,这是一种需要过度杀戮的情况。

    我相信任何基于GNU的系统都将使用crypt(3)和glibc支持的其他算法之一。维基百科说,默认情况下使用5000发SHA-512,但没有提及盐的使用位置。最后一个字符串是所有这些回合之后哈希的base-64编码。您需要深入了解crypt所做的事情的细节,而不是手册页中介绍的内容。您还需要在开始时检查数字,以查看算法是SHA-512还是其他选项之一。

    [编辑:我找到了一个SHA-512加密算法的描述,但我不知道这是他们实际实现的形式还是一个建议。]

    其他*nix系统将有自己的等价物,不一定使用相同的散列函数或相同的整体算法。

    散列5000次的基本原因是,这意味着访问散列密码的攻击者只能使用给定的处理能力测试5000个候选密码中的1/5000。同时,您的系统只能验证5000次登录尝试中的1/5000次,但这并不是一个有害的限制(事实上,在某些情况下,系统无论如何都会限制登录尝试的速度,因此基本上不会有什么不同)。

     类似资料:
    • 我正在研究一个已经用MD5(没有salt)散列用户密码的系统。我想使用SHA-512和SALT更安全地存储密码。 虽然这对于将来的密码来说很容易实现,但我也想修改现有的MD5散列密码,最好不强迫所有用户更改他们的密码。我的想法是只使用SHA-512和一个适当的salt来散列现有的MD5散列。然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本散列出来的,哪些密码是从MD5散列出来的。或者我可

    • 我对密码学是个新手,但是学习。我从网上的研究中收集了许多不同的建议,并制作了自己的类,用于处理哈希、salt、键拉伸以及关联数据的比较/转换。 在研究了内置的。NET密码学库,我发现我拥有的仍然只有SHA-1。但我得出的结论是,这并不坏,因为我使用了哈希过程的多次迭代。对吗? 但如果我想从更健壮的SHA-512开始,我如何在下面的代码中实现它呢?提前谢谢。 注意:我已经参考了很多来自https:/

    • 我想找到一个解决方案或方法,使我能够添加盐和控制迭代次数。本机Rfc2898DeriveBytes基于HMACSHA1。理想情况下,使用SHA-256或SHA-512将使系统经得起未来的考验。 这是迄今为止我发现的最好的例子:http://jmedved.com/2012/04/pbkdf2-with-sha-256-and-others/但是当我用SHA-256运行它时,它实际上比用SHA-51

    • 我一直在使用PHP为Dovecot创建一个可用的盐渍SHA-512哈希。当创建一个非salt十六进制格式的哈希时,一切都很好。向哈希中添加一个盐,我无法再使用“doveadm pw”验证哈希。 这是我的代码: var\u dumps()的输出如下: 现在,当我尝试根据doveadm验证哈希时,只有第一个哈希(十六进制格式的非salt)有效。第二个错误是关于字符串长度的错误(输入长度无效(128而不

    • 问题内容: 我一直在研究一些有关Java字符串加密技术的信息,但不幸的是,我还没有找到如何在Java中使用SHA-512对String进行哈希处理的很好的教程。我读了一些有关MD5和Base64的博客,但是它们并不像我想要的那样安全(实际上,Base64不是一种加密技术),所以我更喜欢SHA-512。 问题答案: 您可以将其用于SHA-512

    • 尽管我有点困惑,我是否应该将salt输入到我的PBKDF2函数中,并将salt存储在一列中,而将PBKDF2的密码存储在另一列中。 我也在使用CodeIgniter,并找到了一个用于PBKDF2的库(https://github.com/hashemqolami/codeigniter-pbkdf2-library),它声称我不需要单独存储salt。 使用作为推荐的用户密码注册用户;无需单独存储用