【问题标题】:Keeping user's API secret of SHA secured in db将用户的 SHA API 机密保存在数据库中
【发布时间】:2014-11-01 00:47:09
【问题描述】:

我有一个移动应用程序通过 HTTPS 与服务器通信。成功注册后,我会向应用程序返回一个唯一的 API 机密,以本地保存在设备上。此 API 密钥用于在此用户成功注册后对服务器进行的所有私有方法调用。

在我向服务器发出的每个请求的标头中:

"key":  username
"sign": (SHA256 of post_parameters using API secret)

服务器使用在 db 中找到的用户名的唯一 API 机密获取 post_parameters 和 SHA256。如果结果与“sign”匹配,则授予访问权限。

我的问题是这样的:

如何在服务器 db 上确保每个用户的唯一 API 机密安全?如果有人可以访问用户名及其 API 机密,则他可以完全控制用户的帐户。

【问题讨论】:

    标签: security hash client-server sha


    【解决方案1】:

    您需要将秘密的哈希值存储在数据库中,但要求用户提供秘密。这样,如果数据库泄漏,那么攻击者拥有哈希值,但本身没有秘密。当用户登录时,对用户提供的secret进行hash,并检查它是否与存储的hash匹配。

    为了让它更安全,你可以考虑使用 salt:在数据库中为每个用户存储一个随机值(明文),然后在计算哈希时,你哈希盐加上秘密。所以你存储

    salt_value  H(salt_value . secret)
    

    其中. 表示串联。这更安全,因为如果攻击者有一个散列字典(即,已经计算出数百万个可能密码的散列),那么他仍然无法破坏散列:他的字典不会将所有可能的盐值都考虑在内。

    对于超现代的安全性,您还可以重复哈希。而不是存储

    H(salt_value . secret)
    

    你存储

    H(H(H(H(...H(salt_value . secret) ...))))
    

    即,您对其进行大量哈希处理(例如,10,000 次)。当用户登录时,反复对salt和secret进行hash,然后将最终结果与存储的值进行比较。这更加安全,因为发起蛮力攻击需要更长的时间:攻击者必须计算 10,000 个哈希来尝试对某个秘密进行一次猜测。

    【讨论】:

    • 谢谢。正是我想要的。
    • @Ami 不客气!如果您觉得有帮助,请单击勾号以选择已选择的答案。
    • 我会的。顺便说一句,假设我的密钥是大约 50 个字符长的无意义文本,我应该使用盐吗?我知道它在存储散列密码时使用,因为密码不是那种变体。
    • 如果秘密是随机生成的并且很长,是的,你可以不存储盐而侥幸。如果它们是由用户生成的,则需要加盐,因为众所周知,用户不擅长生成随机性。
    • 我感到困惑并仍然如此的原因是,我使用了许多 API,但从未见过他们要求用户提供秘密。
    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多