【问题标题】:SHA-512 - salt my passwordSHA-512 - 加盐我的密码
【发布时间】:2014-05-12 22:11:03
【问题描述】:

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

3a81oZNherrMQXNJriBBMRLm.k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==

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

我有两个问题:

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

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

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

  2. 我应该使用 base64 中的什么编码来获取 /etc/shadow 文件中的精确哈希密码?

【问题讨论】:

    标签: c++ cryptography salt sha


    【解决方案1】:

    理论上,将盐(非机密数据)添加到密码(机密数据)是不好的。因为,由于散列函数按顺序处理其输入(以 1 到 64 字节和更多字节为单位),因此可以预先计算非秘密数据的初始块的散列函数状态,并将其用作所有未来排列的起点, — 有效去除盐可能引入的几乎所有额外保护。但是,实际上,盐 + 密码通常占用不到一个密码散列函数的输入块(通常为 512 位或更多),因此这不是问题。

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

    为了完成“密码加盐”的任务,可以采用基于哈希的消息验证码(HMAC)方案,也称为keyed hash:只需使用你的盐作为 message 和你的密码作为 key - 该函数将以适当的方式组合参数,减轻你记住“是否在前面加上或附加”。该函数实际上是常规散列函数的包装器,并且非常简单,因此如果您的加密框架缺少它,您可以自己轻松实现它,但请务必根据已知结果进行测试。

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

    PS。您确实了解必须在每种情况下随机选择盐,而不是保持静态(或者,更糟糕的是,字典中的单词),对吗?

    【讨论】:

    • 整个帖子非常专业且内容丰富,但它没有回答我的问题。对于 PS- 是的,我意识到这一点。我的目标是用已知的盐破解我自己的密码(因为 yolo),而不使用任何像 JackTheRipper 这样的软件。好吧,我想我得看看它的源代码才能找到答案......
    【解决方案2】:

    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 的登录尝试次数,但这并不是有害的限制(事实上,在某些情况下,系统无论如何都会限制登录尝试的速率,因此基本上没有区别)。

    【讨论】:

    • 查看 glibc 源代码中的crypt/sha512-crypt.c,链接的 SHA-512 crypt 算法似乎是正确的。
    • @rkjnsn:谢谢,这是我懒得去的调查级别,因为担心代码很难与描述进行比较:-)
    • 其实我主要只是比较了cmets。毕竟我也很懒。此外,为了测试,您可以比较 mkpasswd 的结果。例如,mkpasswd -m sha-512 -S ssssssss mysecretpassword 产生 $6$ssssssss$M.PuuhHI8/rHr7jHXG2D7YPfXjqHwgX/gRYepo84cIbUzbWayCDQGi.0/KtSqWmI1z52rNF87uLlt6mb9i9xO/
    • 好吧,其实我并没有检查这个算法是否提供了真实的答案,但它看起来相当不错。谢谢你,史蒂夫·杰索普。我会在接下来的几天里检查它,我会将结果与我的源代码的键盘链接发布。
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2015-07-13
    • 2014-11-11
    • 2019-02-25
    • 1970-01-01
    • 2014-08-15
    • 2014-03-09
    相关资源
    最近更新 更多