为什么 Google Cloud KMS 为相同的输入文本生成不同的加密密文?

问题描述

我正在尝试使用 Google Cloud Key Management Service (KMS) python API 加密机密和敏感数据。我注意到在加密后的每次迭代中,精确输入文本的相同密钥会生成不同的加密密文。我的意思是,对于相同的输入文本,我得到不同的加密密文。

我的问题是,

  1. 为什么加密的密文被改变了?如何为相同的输入获取相同的加密密文/值?
  2. 如何控制加密密文的长度?

这是我使用的python代码

from google.cloud import kms
client = kms.KeyManagementServiceClient()
name = 'projects/sandBox/locations/global/keyRings/encryptdecrypt-keyring/cryptoKeys/encryptdecrypt-key_v01/cryptokeyversions/1' #CryptoKey info 
plaintext = b'hello123' # The data to encrypt

enc1=client.encrypt(request={'name': name,'plaintext': plaintext})

参考:

解决方法

是的,系统在加密相同的输入时会生成不同的密文。这是大多数加密系统的重要安全控制;它可以防止攻击者让您加密特定消息 M 的攻击,以便他们可以确定他们手中的密文 C 是否也是同一消息 M 的加密副本。

有些系统提供一致的加密输出;该属性称为 Deterministic Encryption。但是,我建议在选择机制之前咨询密码学专家;这些工具很棘手。

我们对加密密文的确切长度不作任何承诺;如果您需要可预测,我想更多地了解我们为何以及如何提供帮助。

感谢您使用 GCP 和 Cloud KMS!