Просто хотел бы дать полное решение для манекенов, основанное на очень дидактическом ответе @ Codo.
РЕДАКТИРОВАТЬ: Чтобы быть точным в общих случаях, я нашел это: - "Заполнение PKCS # 5 является подмножествомДополнение PKCS # 7 для блоков размером 8 байт ".Строго говоря, PKCS5 не может быть применен к AES;они означают PKCS7, но используют их имена взаимозаменяемо.
О PKCS5 и PKCS7
/ * MySQL использует нестандартное сворачивание ключа.* Чтобы достичь того же результата в MySQL и Oracle (или .NET или Java), используйте только ключи длиной 16 байт (32 шестнадцатеричных символа) = 128-битное шифрование AES, MySQL AES_encrypt по умолчанию.* * Это означает, что MySQL допускает любую длину ключа от 16 до 32 байтов для 128-битного шифрования AES, но стандартная AES не позволяет использовать ключ не из 16 байтов, поэтому не используйте его, так как вы не сможетеиспользовать стандартную AES-дешифровку на другой платформе для ключей длиной более 16 байт, и был бы вынужден программировать свертывание ключа MySQL на этой другой платформе с использованием XOR и т. д. (это уже есть, но зачем делать странные-стандартные вещи, которые могут измениться, когда MySQL решит, и т. д.).Более того, я думаю, они говорят, что алгоритм, выбранный MySQL для этих случаев, является действительно плохим выбором по уровню безопасности ... * /
- ### ORACLE:
- Первыйключ хешируется с помощью md5, чтобы сделать его 128-битным (16 байтов, 32 шестнадцатеричных символа):
raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('test_key', 'AL32UTF8'), DBMS_CRYPTO.HASH_MD5);
- MySQL использует AL32UTF8, по крайней мере по умолчанию
- Конфигурироватьпараметры шифрования:
encryption_type:= DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
- Строго говоря, это действительно PKCS7.
/ * И я выбираю ECB как более быстрый, если он применяется, и @Codo сказал, что он правильный, но в качестве стандартного (Oracle) AES128 будет принимать только 16-байтовые ключи, CBC также работает, так как я считаю, что это не такприменяется к 16-байтовому ключу.Может ли кто-нибудь это подтвердить?* /
- Затем данные шифруются с помощью AES:
encrypted_result := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('test-data', 'AL32UTF8'), encryption_type, raw_key);
- Результат является двоичным (varbinary, blob).
- Можно использовать RAWTOHEX (), если вы хотите представить его в шестнадцатеричных символах.
В случае, если вы используете непосредственно 16-байтовую хэш-фразу в представлении шестнадцатеричных символов или 32 шестнадцатеричных случайных символа:
raw_key := HEXTORAW(32_hex_key)
encryption_type := 6 + 768 + 4096 -- (same as above in numbers; see Oracle Docum.)
raw_data := UTL_I18N.STRING_TO_RAW('test-data', 'AL32UTF8')
encrypted_result := DBMS_CRYPTO.ENCRYPT( raw_data, encryption_type, raw_key )
- Расшифровка ORACLE:
decrypted_result := UTL_I18N.RAW_TO_CHAR( CRYPTO.DECRYPT( raw_data, encryption_type, raw_key ), 'AL32UTF8' )
- В SQL:
SELECT
UTL_I18N.RAW_TO_CHAR(
DBMS_CRYPTO.DECRYPT(
UTL_I18N.STRING_TO_RAW('test-data', 'AL32UTF8'),
6 + 768 + 4096,
HEXTORAW(32_hex_key)
) , 'AL32UTF8') as "decrypted"
FROM DUAL;
- ### Расшифровка MySQL:
- Функция MySQL MD5 возвращает строку из 32 шестнадцатеричных символов (= 16 байт = 128 бит).
- Она помечена как двоичная строка, но это не 16-байтовые двоичные данные, которые можно ожидать.
- ПРИМЕЧАНИЕ. Обратите внимание: в некоторых версиях вид возврата функций MD5, SHA1 и т. Д. Изменился с версии 5.3.x.См. Руководство по MySQL 5.7.
- чтобы исправить это, эту строку необходимо преобразовать обратно из шестнадцатеричных в двоичные данные с помощью unHex ():
SELECT hex(aes_encrypt('test-data', unhex(MD5('test_key')));
PS: я бы порекомендовал прочитатьулучшенное объяснение в MySQL 5.7 Manual, которое, кроме того, теперь позволяет гораздо больше настроек. Улучшено описание MySQL AES_ENCRYPT из руководства v5.7