我是否在python上使用了AES-128密码的计数器?

时间:2017-05-17 21:52:46

标签: python security cryptography aes

人。我有一个加密/解密密码的代码并将它们放入数据库。我发现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')

问题:

  1. 为什么AES-128会成功加密加密/解密文本?我错过了吗 代码中的东西?
  2. 使用一个密钥加密所有密钥是否安全 数据库中的密码,使用AES-128?

1 个答案:

答案 0 :(得分:1)

  

为什么AES-128会成功加密加密/解密文本?我在代码中遗漏了什么吗?

您创建了两次相同的计数器块,因为您没有设置任何初始值。请参阅Counter类的the documentation。 您必须永远不要使用同一个IV两次的CTR模式。否则,任何知道一段纯文本的人都可以解密所有其他密文。

  

使用AES-128,使用一个密钥加密数据库中的所有密码是否安全?

使用一个密钥加密数据库中的多个数据对象通常是安全的。 但正如评论中已经提到的那样。你永远不应该加密密码。密码将以散列形式存储,因此即使您无法以纯文本形式阅读密码。目前,散列密码的首选功能是 scrypt