我不确定这是否是正确的地方。
我使用AES加密++来加密/解密数据。基本上它就像加密的笔记。
我想要做的是拥有一个标识符字段。该字段将包含加密的用户密码:
User Password: smith
Identifier = AESEncrypt("smith")
这是唯一一次,因为标识符字段为空。 每次用户输入密码添加备注时,我都可以解密标识符字段并将其与用户输入的密码进行比较。
原因是为了避免因输入错误的密码而损坏笔记。
这是个好主意吗?我想如果有人打破了标识符并获得了密码,那么他们就已经知道了密码。对我的想法有什么看法?
答案 0 :(得分:0)
不,这不是个好主意。如果两个人拥有相同的密码,那么他们将具有相同的标识符。这使得破解密码变得更加简单。您还没有明确使用加密密码的密钥。 AESEncrypt()
需要两个参数,并且密钥需要与随机无法区分才是安全的。
在与AES一起使用之前,必须将密码转换为密钥。要将密码转换为密钥,请使用KDF(密钥派生函数)。最着名和最广泛的是PBKDF2。其他包括bcrypt和scrypt。从Crypto ++,您应该使用PKCS5_PBKDF2_HMAC。
实际验证密码比听起来更棘手。使用AES无法确保密码正确无误。使用PKCS#7填充(CBC模式的标准),您可以99.6%确定密码是正确的,但是您偶尔会失败并且在错误的密码而不是错误上返回乱码。 (那不是一个已经化妆的"数字接近100%;"我的意思是"略低于255/256。")你也可以' ; t在解密所有数据之前检查填充是否正确。
您可以使用几种更好的技术。首先,您应该在任何情况下使用HMAC。 HMAC就像加密的哈希。它确保未加密加密的笔记。 Crypto ++提供一个HMAC。如果使用错误的密码解密,HMAC将失败,您可以使用它来断言密码错误。这种方法的问题在于,如果数据非常大,它会很慢,并且您无法区分损坏的数据和错误的密码。 (这种方法是RNCryptor目前使用的方法。)
方法I'm currently investigating是使用HMAC创建验证器。取一些已知的字符串,然后使用您的密钥(由PBKDF2生成)进行HMAC。之后,您可以在该小而已知的字符串上验证HMAC,而不是整个正文。既然你知道字符串应该是什么,你就不必担心数据损坏。链接页面提供了我目前对确切布局的想法。