【发布时间】:2017-10-04 04:08:29
【问题描述】:
我对使用盐对密码进行哈希处理以及使用 HMAC 密码或用作签名等方式感到有些困惑。我已经阅读了很多关于它的文章,但似乎我没有使用这个或那个的意义。
我得到了使用这种方式的这个例子(用数字标记的问题):
散列密码
来自用户的密码使用 SHA-256 和存储在数据库中的每个用户的唯一盐进行哈希处理。密码和盐只是像这样hash(key + password) 连接并运行多轮散列。
- 这可能容易受到长度扩展攻击,对吧?
- 更改值的顺序是否会阻止长度
扩展攻击?那么将
hash(key + password)更改为hash(password + key)?
哈希用户密码的更好方法似乎是 HMAC。在这种情况下使用hmac-sha256(password, salt)。
- 但是在这里使用 HMAC 真的更好更安全吗?
有人说使用盐作为 HMAC 的密码是没有意义的 但是盐对用户来说是不可见的,因为它只是被存储了 在数据库中。对我来说,它只不过是一个密码。
API 认证/验证
对于 API,所有用户都会获得一个唯一且随机的 api_key 和一个 api_secret。
api_key 由标头在所有请求中发送以识别用户。那应该是一种“无状态认证”。
api_secret 将在后端使用hmac-sha256((api_key + nonce), api_secret) 生成signature。
nonce 是一个随机值,它以纯文本形式在另一个标头中发送,同时也是一个散列值,用于验证 nonce 本身不会被操纵(实际上并不需要,因为它会改变整个signature)...所以一种随机签名:
rand = random();
hash = hmac-sha256(rand, api_secret);
nonce = rand + "-" + hash;
- 但这真的比只制作
hash(api_key + nonce + api_secret)之类的东西并留下nonce没有任何随机数签名更安全吗? - 同时提供多个使用相同
api_secret散列的 HMAC 散列是否存在任何安全问题? - 在安全方面还有什么其他的问题吗?
我很难理解创建安全哈希的或多或少安全的方法是什么。有些人说“好吧,这是安全的......你应该这样做”,然后其他人说“哦,你忘记了这个或那个攻击或易受攻击”。所以我试着用一种简单的“我是傻瓜”来理解如何以及为什么。
【问题讨论】:
标签: security hash restful-authentication sha256 hmac