Ansible Vault 使用什么机制来检测错误的 Vault 密码?换句话说,如果用户输入错误的保管库密码,Ansible 将显示以下错误消息。如何?
Decryption failed (no vault secrets were found that could decrypt)
Ansible 使用Vault Payload中的任何部分来检测错误密码?
相关部分的代码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 数据,从而导致上述消息。