REST 的盐值 API
Salt values for REST API
我正在创建一个基于 REST 的 Web 应用程序,该应用程序在成功验证用户凭据后生成授权令牌并使用此授权令牌对后续请求进行身份验证。
token 的内容(虽然还没有固定)是
AES_encrypt{用户名:SHA_256(用户名,user_specific_salt):时间戳:expiry_period}.
为了避免调用数据库,我试图根据用户名本身生成盐值。
另外,我不会向客户端发送盐值。
问题是,我对解决方案有点困惑,因为到目前为止我读过的文章建议不要动态生成盐值,而是存储在数据库级别。有人可以帮我找出上述情况的最佳解决方案吗?
这取决于用例和安全问题的级别。安全地存储密码散列当然比例如功能有限的网络服务的授权令牌更重要和敏感。
所以分析是基于特定解决方案的潜力risks/benefits。
首先,看看如果你根本不使用盐腌会发生什么。然后,如果有人捕获了您的令牌并知道其结构(用户名加时间戳),则可能会尝试恢复用于加密的密钥。这是一项具有挑战性的计算任务,但原则上是可行的。仅访问以相同方式生成的一个或多个令牌并不能使这项任务变得容易得多(我可能弄错了,它们可能是 AES 加密中的一些漏洞)。
目的是让您的密钥用于加密,以便攻击者以后可以为任意用户生成自己的有效令牌。
- 黑客需要破解密钥
你加盐,甚至是所有用户的固定盐。
黑客仍然需要破解你的加密密钥,和以前一样。一旦拥有它
他拿走旧令牌,更新时间戳,工作就完成了。他只是复制原始哈希。由于时间戳未使用盐进行哈希处理,因此不受影响。
因此,假设您对用户名+盐+时间戳进行哈希处理。否则如上所述,加盐是无关紧要的。
因此 hacerk 需要破解盐才能重现正确的哈希值。使用相同的盐对多个哈希进行编码可以更容易地恢复盐。如今,SHA 的速度足够快,可以进行粗暴的虚假攻击。
- 黑客需要破解密钥
- 黑客需要从所有哈希值中获取一种盐
通过加盐,您为黑客引入了一个额外的步骤来处理,但并不困难。
你添加动态生成的盐,
黑客破解加密。然后他需要破解多个哈希以恢复少量盐。他需要猜测盐生成模式来伪造令牌。
- 黑客需要破解密钥
- 黑客需要从哈希中恢复多个盐
- 黑客需要推断盐生成模式。
了解它可以为任何用户生成令牌的模式。在不知道模式的情况下,它可以为破解用户生成令牌,这对黑客来说可能就足够了。
随机生成的盐存储在数据库中,用户一个盐。
- 黑客需要破解密钥
- 黑客需要从哈希中恢复盐分
黑客无法为任何用户创建令牌,但一旦知道盐分,它就可以为被黑用户创建令牌。数据库存储的盐并没有改进太多,只是防止任意用户访问,但它仍然允许 'cracked' 用户访问。
随机生成的盐存储在数据库中并定期更改(每小时、每天)。
现在砍盐一次,对将来没有帮助,因为它与新的盐值不匹配。破解哈希需要一个多小时的时间。所以每小时更新一次就足够了。但是要正确实施它很棘手,这样有效的令牌就不会在盐更新时过期。
因此,根据您对安全偏执的程度以及您的服务的重要性,您可能会增加黑客的成本。
对于你的用例,我想说的是,动态加盐散列完全没问题,只需将时间戳添加到消息散列中,否则散列无效。
现在,为了防止您的秘密密钥被发现,您可以考虑对我们的加密密钥进行加盐处理。这样,如果仅针对一个用户而不是所有用户破解加密。但如果不是银行应用程序,可能不值得。
我正在创建一个基于 REST 的 Web 应用程序,该应用程序在成功验证用户凭据后生成授权令牌并使用此授权令牌对后续请求进行身份验证。
token 的内容(虽然还没有固定)是 AES_encrypt{用户名:SHA_256(用户名,user_specific_salt):时间戳:expiry_period}.
为了避免调用数据库,我试图根据用户名本身生成盐值。 另外,我不会向客户端发送盐值。
问题是,我对解决方案有点困惑,因为到目前为止我读过的文章建议不要动态生成盐值,而是存储在数据库级别。有人可以帮我找出上述情况的最佳解决方案吗?
这取决于用例和安全问题的级别。安全地存储密码散列当然比例如功能有限的网络服务的授权令牌更重要和敏感。
所以分析是基于特定解决方案的潜力risks/benefits。
首先,看看如果你根本不使用盐腌会发生什么。然后,如果有人捕获了您的令牌并知道其结构(用户名加时间戳),则可能会尝试恢复用于加密的密钥。这是一项具有挑战性的计算任务,但原则上是可行的。仅访问以相同方式生成的一个或多个令牌并不能使这项任务变得容易得多(我可能弄错了,它们可能是 AES 加密中的一些漏洞)。
目的是让您的密钥用于加密,以便攻击者以后可以为任意用户生成自己的有效令牌。
- 黑客需要破解密钥
你加盐,甚至是所有用户的固定盐。 黑客仍然需要破解你的加密密钥,和以前一样。一旦拥有它
他拿走旧令牌,更新时间戳,工作就完成了。他只是复制原始哈希。由于时间戳未使用盐进行哈希处理,因此不受影响。
因此,假设您对用户名+盐+时间戳进行哈希处理。否则如上所述,加盐是无关紧要的。
因此 hacerk 需要破解盐才能重现正确的哈希值。使用相同的盐对多个哈希进行编码可以更容易地恢复盐。如今,SHA 的速度足够快,可以进行粗暴的虚假攻击。
- 黑客需要破解密钥
- 黑客需要从所有哈希值中获取一种盐 通过加盐,您为黑客引入了一个额外的步骤来处理,但并不困难。
你添加动态生成的盐, 黑客破解加密。然后他需要破解多个哈希以恢复少量盐。他需要猜测盐生成模式来伪造令牌。
- 黑客需要破解密钥
- 黑客需要从哈希中恢复多个盐
- 黑客需要推断盐生成模式。
了解它可以为任何用户生成令牌的模式。在不知道模式的情况下,它可以为破解用户生成令牌,这对黑客来说可能就足够了。
随机生成的盐存储在数据库中,用户一个盐。
- 黑客需要破解密钥
- 黑客需要从哈希中恢复盐分
黑客无法为任何用户创建令牌,但一旦知道盐分,它就可以为被黑用户创建令牌。数据库存储的盐并没有改进太多,只是防止任意用户访问,但它仍然允许 'cracked' 用户访问。
随机生成的盐存储在数据库中并定期更改(每小时、每天)。 现在砍盐一次,对将来没有帮助,因为它与新的盐值不匹配。破解哈希需要一个多小时的时间。所以每小时更新一次就足够了。但是要正确实施它很棘手,这样有效的令牌就不会在盐更新时过期。
因此,根据您对安全偏执的程度以及您的服务的重要性,您可能会增加黑客的成本。
对于你的用例,我想说的是,动态加盐散列完全没问题,只需将时间戳添加到消息散列中,否则散列无效。
现在,为了防止您的秘密密钥被发现,您可以考虑对我们的加密密钥进行加盐处理。这样,如果仅针对一个用户而不是所有用户破解加密。但如果不是银行应用程序,可能不值得。