在db中保护用户的API秘密

时间:2014-09-07 18:26:50

标签: security hash client-server sha

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

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

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

服务器使用db中找到的用户名的唯一API密钥获取post_parameters和SHA256。如果结果匹配"签署"然后授予访问权限。

我的问题是:

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

1 个答案:

答案 0 :(得分:1)

您需要将秘密的哈希值存储在数据库中,但需要用户提供密码。这样,如果数据库泄漏,则攻击者具有哈希值,但本身没有秘密。当用户登录时,散列用户提供的秘密,并检查它是否与存储的散列匹配。

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

salt_value  H(salt_value . secret)

其中.表示连接。这更安全,因为如果攻击者有一个哈希字典(即已经计算出数百万个可能的密码的哈希值),那么他仍然无法打破哈希:他的字典不会将每个可能的盐值计入其中。

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

H(salt_value . secret)

你存储

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

即你散列很多次(比方说,10,000次)。当用户登录时,重复散列salt和secret,然后将最终结果与存储值进行比较。这更加安全,因为安装暴力攻击需要更长的时间:攻击者必须计算10,000个哈希才能尝试单一猜测。