Как Ansible Vault обнаруживает неправильный пароль? - PullRequest
3 голосов
/ 17 июня 2020

Какой механизм Ansible Vault использует для определения неправильных паролей хранилища? Другими словами, если пользователь вводит неправильный пароль хранилища, то Ansible показывает сообщение об ошибке ниже. Как?

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

Есть ли какой-нибудь раздел в Vault Payload , который Ansible использует для обнаружения неправильных паролей?

1 Ответ

3 голосов
/ 17 июня 2020

Код для 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, и это приведет к появлению сообщения выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...