宣言
AES_ENCRYPT(str,key_str[,init_vector])
説明
キーテキスト key_str を使用して文字列 str を暗号化し、暗号化されたバイナリ文字列を返します。str には長さの制限がなく、この関数は str を自動的に暗号化ブロックの整数倍にパディングします。暗号文の長さは以下の式で計算されます:
16 * (trunc(string_length / 16) + 1)
いずれかの関数パラメータが NULL の場合、この関数は NULL を返します。
AES_ENCRYPT() は、公式の AES(Advanced Encryption Standard)アルゴリズムを使用してデータの暗号化を実装します。AES 標準では様々な鍵長の使用が許可されており、デフォルトは 128 ビットです。196 ビットまたは 256 ビットの鍵長も使用できます。鍵長が長いほどセキュリティは高くなりますが、暗号化速度は低下します。 AES_ENCRYPT() と AES_DECRYPT() 関数は、初期化ベクトルを使用してブロック暗号化モードを制御できます:
block_encryption_modeシステム変数は、ブロックベースの暗号化アルゴリズムのモードを制御します。デフォルト値はaes-128-ecbで、128 ビットの鍵長と ECB モードを使用した暗号化を意味します。init_vectorパラメータは初期化ベクトルを表します:暗号化モードで
init_vectorパラメータの設定が必要な場合、その長さは 16 バイト以上である必要があります(16 バイトを超える部分は無視されます)。init_vectorが欠けている場合、エラーが発生します。暗号化モードで
init_vectorパラメータの設定が不要な場合、このパラメータは無視されます。
初期化ベクトルが必要な暗号化モードでは、暗号化と復号化に同じベクトルを使用する必要があります。
obclient> SET block_encryption_mode = 'aes-256-cbc'; obclient> SET @key_str ='My secret passphrase'; obclient> SET @init_vector = '1111111111111111'; obclient> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector); obclient> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector); +-----------------------------------------------+ | AES_DECRYPT(@crypt_str,@key_str,@init_vector) | +-----------------------------------------------+ | text | +-----------------------------------------------+ 1 row in set以下の表は、ブロック暗号化モード、対応する SSL ライブラリ、および初期化ベクトルパラメータが必要かどうかの詳細情報を示しています。
ブロック暗号モード対応SSLライブラリ初期化ベクトルの必要性ECB OpenSSL 不要です CBC OpenSSL 要です CFB1 OpenSSL 要です CFB8 OpenSSL 要です CFB128 OpenSSL 要です OFB OpenSSL 要です
例
'hello world'をキー'key'で暗号化し、暗号化後の文字列を@passに格納します。obclient> SET @pass=AES_ENCRYPT('hello world', 'key','1111111111111111'); Query OK, 0 rows affected暗号化後の文字列の長さを確認します(いずれも2のべき乗です)。
obclient> SELECT CHAR_LENGTH(@pass); +--------------------+ | CHAR_LENGTH(@pass) | +--------------------+ | 16 | +--------------------+ 1 row in setAES_DECRYPT()を使用して復号化します。obclient> SELECT AES_DECRYPT(@pass, 'key'); ERROR 1582 (42000): Incorrect parameter count obclient> SELECT AES_DECRYPT(@pass, 'key','1111111111111111'); +----------------------------------------------+ | AES_DECRYPT(@pass, 'key','1111111111111111') | +----------------------------------------------+ | hello world | +----------------------------------------------+ 1 row in set