想象一个应用程序,其中任何用户提供一个用户名和密码。此密码用于使用PBDKF2密钥派生算法生成“强”加密密钥(用于AES加密)。此加密密钥用于加密数据库中的用户数据。
现在,为了识别用户并授予他访问加密数据的权限,我使用"SHA-512“算法散列其加密密钥,然后将其与存储的散列密钥进行比较。我想升级我的战略,更好地保护我的应用程序免受暴力攻击。
由于PBDKF2也是一种哈希算法,我的两个问题是:
发布于 2020-01-18 23:43:37
你在这里想达到什么目的?利用用户的密码(1)身份验证/登录以及(2)密钥加密他们的数据?如果是这样的话,那么考虑一下密码管理器通常会做什么--我认为它与您的建议有相似之处。下面是操作从对另一个问题的回答中被吃掉:
client_rounds = 5000 // iteration count may be user-defined
encryption_key = PBKDF2(HMAC-SHA256, password, salt, client_rounds) // unlocks your data
auth_hash = sha256(encryption_key) // sent to the server for authentication
server_rounds = 100000
server_key = PBKDF2(HMAC-SHA256, auth_hash, server_salt, server_rounds) // server can use this to do additional encryption
Full algorithm:
PBKDF2(HMAC-SHA256, sha256(PBKDF2(HMAC-SHA256, password, client_salt, client_rounds)), server_salt, server_rounds)使用PBDKF2散列(然后存储)同一个PBDKF2算法生成的加密密钥(PBDKF2.Hash(PBDKF2 2派生(密码)安全吗?
是的,它是安全的,但是使用PBKDF2进行散列并不是合适的算法,因为预期哈希函数将是快速的,而PBKDF2被有意设计为用于密钥派生的速度较慢。
因为您已经将PBKDF2应用于密码,这足以抵抗野蛮的攻击--根据需要增加迭代次数。
然后对派生密钥进行散列处理,该密钥也是存储的,而不是实际的密钥/密码。
存储由自己加密的加密密钥(按模式AES.encrypt(input = key,key = key)而不是密钥哈希)是否同样安全?
不,不安全。加密密钥是很难做正确的-你会想要研究密钥包装,从NIST的密钥包装建议开始。哈希是一种更好的方法。
https://security.stackexchange.com/questions/224428
复制相似问题