我为我的 REST API 实现了这种身份验证,这安全吗?我的逻辑是否合理?
我主要对SHA-256 哈希和迭代 = 1方面感到好奇。我省略了一些关于其他方面的细节和解释,以使这个问题更简单、更集中。
- 身份验证基于 API 密钥
- API 密钥是使用 Java UUID.randomUUID() 生成的 128 位随机数。例如
9885e3dd-b584-45d1-a0f0-3295b0ea4324
- API 密钥本身不会被持久化。API 密钥哈希存储在数据库中
- 我存储密钥的 SHA-256 哈希。我做了一次迭代:
private static final int ITERATIONS = 1;
private static final String ALGORITHM = "SHA-256";
private byte[] digest(byte[] value) {
MessageDigest messageDigest = createDigest(ALGORITHM);
for (int i = 0; i < ITERATIONS; i++) {
value = messageDigest.digest(value);
}
return value;
}
不涉及盐渍。最佳实践建议使用 salting - 和 bcrypt - 来存储密码哈希。据我了解,这是为了使彩虹攻击和字典攻击不可行,并减缓暴力攻击。我决定使用 SHA-256,因为它更快,而且我找不到在我们的用例中使用较慢 bcrypt 的真正理由。
由于我不是对密码进行哈希处理,而是对 128 位随机数进行哈希处理,因此彩虹攻击和字典攻击不相关。正确的?只有暴力破解。
我目前的理解是暴力破解 128 位密钥是不可能的。我不是核心加密专家,我是基于这样的帖子(实际上将散列减少到单个逻辑门的翻转来进行计算) https://crypto.stackexchange.com/a/1148因此有无需为等式增加额外的缓慢性,它已经“足够慢”了。
有了这个,我得出结论,使用 bcrypt 的任何原因都不适用于我的特定用例。
这些推论是否正确,并且使用 SHA-256 的单次迭代作为 api 密钥散列来保持密钥散列安全(足够)?