人。我有一个加密/解密密码的代码并将它们放入数据库。我发现AES的最佳实践是为每个密码存储key和initial_vector。但我想摆脱initial_vector并使用默认值。据我所知,我们应该使用相同的计数器进行解密和加密。但我不使用相同的,它的工作原理。
key = os.urandom(16)
def test(str):
ctr = Counter.new(128)
obj = AES.new(key, AES.MODE_CTR, counter=ctr)
message = str.encode('utf-8')
ciphertext = obj.encrypt(message)
ctr2 = Counter.new(128)
obj2 = AES.new(key, AES.MODE_CTR, counter=ctr2)
ans = obj2.decrypt(ciphertext)
return ans.decode('utf-8')
问题:
答案 0 :(得分:1)
为什么AES-128会成功加密加密/解密文本?我在代码中遗漏了什么吗?
您创建了两次相同的计数器块,因为您没有设置任何初始值。请参阅Counter类的the documentation。 您必须永远不要使用同一个IV两次的CTR模式。否则,任何知道一段纯文本的人都可以解密所有其他密文。
使用AES-128,使用一个密钥加密数据库中的所有密码是否安全?
使用一个密钥加密数据库中的多个数据对象通常是安全的。 但正如评论中已经提到的那样。你永远不应该加密密码。密码将以散列形式存储,因此即使您无法以纯文本形式阅读密码。目前,散列密码的首选功能是 scrypt 。