Код для ansible-vault
с соответствующим разделом можно найти здесь: https://github.com/ansible/ansible/blob/devel/lib/ansible/parsing/vault/ init .py # L736
Вкратце, он использует указанный пароль и идентификатор хранилища для расшифровки файла. Поэтому он будет искать идентификатор хранилища в файле хранилища, а затем попытается расшифровать пароль. Часть crytpo будет возвращать байтовую строку только в том случае, если дешифрование было успешным и был возвращен ожидаемый формат (PKCS7):
- Итак, сначала выполняется анализ содержимого хранилища ( шестнадцатеричный формат преобразуется в фактические байты):
b_ciphertext, b_salt, b_crypted_hmac = parse_vaulttext(b_vaulttext)
- Затем соответствующие ключи генерируются из соли и пароля:
b_password = secret.bytes
b_key1, b_key2, b_iv = cls._gen_key_initctr(b_password, b_salt)
- Как вы правильно заметили, первое, что делает функция
_decrypt_cryptography
, это проверяет правильность HMA C, используя один из ключей, полученных из пароля, указанного выше:
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)
- Затем происходит фактическое дешифрование:
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()
- Затем возвращается
b_plaintext
.
Итак, когда вы используете неправильный пароль, криптографическая функция вернет данные, отличные от PKCS7, и это приведет к появлению сообщения выше.