Ansible Vault 如何检测错误的密码?

PMo*_*bed 5 ansible

Ansible Vault 使用什么机制来检测错误的 Vault 密码?换句话说,如果用户输入错误的保管库密码,Ansible 将显示以下错误消息。如何?

Decryption failed (no vault secrets were found that could decrypt)

Ansible 使用Vault Payload中的任何部分来检测错误密码?

Sim*_* K. 3

相关部分的代码ansible-vault可以在这里找到:https://github.com/ansible/ansible/blob/devel/lib/ansible/parsing/vault/ init .py#L736

总之,它使用指定的密码和保管库 ID 来解密文件。因此,它将在保管库文件中查找保管库 ID,然后尝试解密密码。当解密成功并返回预期格式(PKCS7)时,crypto 部分只会返回一个字节字符串

  • 首先,解析保管库的内容(十六进制格式转换为实际字节):
b_ciphertext, b_salt, b_crypted_hmac = parse_vaulttext(b_vaulttext)
Run Code Online (Sandbox Code Playgroud)
  • 然后,根据盐和密码生成相关密钥:
b_password = secret.bytes
b_key1, b_key2, b_iv = cls._gen_key_initctr(b_password, b_salt)
Run Code Online (Sandbox Code Playgroud)
  • 正如您所注意到的,该函数所做的第一件事_decrypt_cryptography是使用从上述密码派生的密钥之一来检查 HMAC 是否正确:
hmac = HMAC(b_key2, hashes.SHA256(), CRYPTOGRAPHY_BACKEND)
hmac.update(b_ciphertext)
try:
  hmac.verify(_unhexlify(b_crypted_hmac))
except InvalidSignature as e:
  raise AnsibleVaultError('HMAC verification failed: %s' % e)
Run Code Online (Sandbox Code Playgroud)
  • 然后,实际的解密发生:
cipher = C_Cipher(algorithms.AES(b_key1), modes.CTR(b_iv), CRYPTOGRAPHY_BACKEND)
decryptor = cipher.decryptor()
unpadder = padding.PKCS7(128).unpadder()
b_plaintext = unpadder.update(
  decryptor.update(b_ciphertext) + decryptor.finalize()
) + unpadder.finalize()
Run Code Online (Sandbox Code Playgroud)
  • b_plaintext然后返回。

因此,当您使用错误的密码时,加密函数将返回非 PKCS7 数据,从而导致上述消息。