このセクションの関数は暗号化と復号化、そして圧縮と非圧縮を行います。
暗号化または圧縮 | 復号化または解凍 |
AES_ENCRYT() | AES_DECRYPT() |
COMPRESS() | UNCOMPRESS() |
ENCODE() | DECODE() |
DES_ENCRYPT() | DES_DECRYPT() |
ENCRYPT() | 使用不可 |
MD5() | 使用不可 |
OLD_PASSWORD() | 使用不可 |
PASSWORD() | 使用不可 |
SHA() or SHA1() | 使用不可 |
使用不可 | UNCOMPRESSED_LENGTH() |
注記
:暗号化および圧縮関数はバイナリ
ストリングを戻します。これらの関数の多くは、結果が任意のバイト値を含む場合があります。これらの結果を保存したい場合は、CHAR
や VARCHAR
カラムでなく、BLOB
を使用して、後続のスペースの削除でデータ値が変更される可能性を避けてください。
注記 :MD5 および SHA-1 アルゴリズムの利用についてはすでに知られています。開発者は、このセクションで紹介されている他の暗号化関数の使用も考慮してください。
AES_ENCRYPT(
,
str
,key_str
)AES_DECRYPT(
crypt_str
,key_str
)
これらの関数では、以前は 「Rijndael」 として知られていた公式の AES ( Advanced Encryption Standard ) アルゴリズムを使用した、データの暗号化と復号化が可能です。128 ビットのキーの長さを使用したエンコードを行いますが、ソースを改変することで 256 ビットまで延長することができます。当社では、より速く、ほとんどの使用では十分に安全なため、128 ビットを採用しています。
AES_ENCRYPT()
はストリングを暗号化し、バイナリ
ストリングを戻します。AES_DECRYPT()
はストリングを暗号化されたストリングを復号化し、本来のストリングを戻します。入力引数の長さは自由です。どちらかの引数が
NULL
の場合は、この関数の結果も
NULL
になります。
AES ブロックレベル アルゴリズムであるため、長さが不揃いなストリングのエンコードにはパッドを使用し、次の方式を使って結果ストリングの長さが計算されるようにします。
16 × (trunc(string_length
/ 16) + 1)
AES_DECRYPT()
が無効な日付または不正確なパッドを検出した場合は、NULL
が戻されます。しかし、入力データまたはキーが無効になっている場合は、AES_DECRYPT()
が非 NULL
値 (
不要データの可能性あり )
を戻すことも考えられます。
AES 関数を使用して、暗号化されたフォームのデータを、クエリを改変することによって格納することができます :
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT()
および
AES_DECRYPT()
は、現在 MySQL
で使用が可能なものの中で、暗号的に最も安全な暗号化関数だと考えられています。
ストリングを圧縮し、結果をバイナリ
ストリングとして戻します。この関数では、MySQL
が zlib
のような圧縮ライブラリとコンパイルされている必要があります。その条件が満たされない場合、その戻り値は常に
0
になります。圧縮されたストリングは、UNCOMPRESS()
によって非圧縮することができます。
mysql>SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
-> 21 mysql>SELECT LENGTH(COMPRESS(''));
-> 0 mysql>SELECT LENGTH(COMPRESS('a'));
-> 13 mysql>SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15
圧縮されたストリングの内容は次の方法で格納されます :
空のストリングは空のストリングとして格納。
空でないストリングは、圧縮されたストリングの後に、4
バイト長の非圧縮ストリングとして (
下位バイトから )
格納されます。ストリングの最後にスペースがある場合は、最後のスペースが除かれることがないよう、‘.
’
文字が追加されます。結果は
CHAR
または
VARCHAR
カラムに格納されます。(
CHAR
または
VARCHAR
を使用して、圧縮されたストリングを保存するのはお薦めできません。BLOB
カラムをご使用ください。 )
暗号化されたストリング
crypt_str
を、pass_str
を使用し、パスワードとして復号化します。crypt_str
は、ENCODE()
から戻されたストリングであるべきです。
pass_str
を使用し、str
をパスワードとして暗号化します。結果を復号化するには
DECODE()
を用います。
結果は、str
と同じ長さのバイナリ
ストリングになります。
暗号化の強度は、ランダム発生器の質によります。短いストリングでも十分です。
DES_DECRYPT(
crypt_str
[,key_str
])
DES_ENCRYPT()
によって暗号化されたストリングを復号化します。エラーが起きた場合、この関数は
NULL
を戻します。
この関数は、MySQL が SSL サポートで設定されている場合のみ作動しますのでご注意ください。詳細は 項4.8.7. 「接続安全」 を参照してください。
key_str
引数が与えられていない場合、DES_DECRYPT()
は暗号化されたストリングの最初のバイトを調査して、本来のストリングの暗号化に使用した
DES キー ナンバーを特定し、DES キー
ファイルからキーを読み取って、メッセージを復号化します。これを正しく行うには、ユーザは
SUPER
権限を持っている必要があります。キー
ファイルは --des-key-file
サーバ
オプションで特定できます。
この関数を key_str
引数に渡した場合、そのストリングはメッセージの復号化のキーとして使用されます。
crypt_str
引数が暗号化されたストリングでない場合は、MySQL
は与えられた crypt_str
を戻します。
DES_ENCRYPT(
str
[,{key_num
|key_str
}])
Triple-DES アルゴリズムを使用して、与えられたキーでストリングを暗号化します。
この関数は、MySQL が SSL サポートで設定されている場合のみ作動しますのでご注意ください。詳細は 項4.8.7. 「接続安全」 を参照してください。
使用する暗号化キーは、与えられていれば、DES_ENCRYPT()
への 2 番目の引数に基づいて選択されます :
引数 | 解説 |
引数なし | DES キー ファイルの最初のキーが使用される。 |
key_num |
DES キー ファイルからの与えられたキー番号 ( 0-9 ) が使用される。 |
key_str |
与えられたキー ストリングが str
の暗号化に使用される。 |
キー ファイルは --des-key-file
サーバ オプションで特定できます。
戻されるストリングは、最初の文字が
CHAR(128 |
であるバイナリ
ストリングです。エラーが起きた場合、key_num
)DES_ENCRYPT()
は NULL
を戻します。
暗号化されたキーが分かりやすいように、128
が加えられます。ストリング
キーを使用する場合は、key_num
は 127 です。
結果のストリングの長さは次の方式によって提示されます :
new_len
=orig_len
+ (8 - (orig_len
% 8)) + 1
DES キー ファイルの各ラインは次のフォーマットを含みます :
key_num
des_key_str
各 key_num
値は、0
から 9
の範囲の数字でなければなりません。ファイル内のラインの順は特定されていません。des_key_str
はメッセージの暗号化に使用されるストリングです。数字とキーの間には、少なくともひとつはスペースが入ります。最初のキーは、DES_ENCRYPT()
へのキー引数を指定しなかった場合に使用されるデフォルトのキーです。
MySQL に、キー
ファイルからの新しいキー値を、FLUSH
DES_KEY_FILE
文で読み込むよう指示することができます。これには
RELOAD
権限が必須です。
デフォルト キーのセットを持つことの利点のひとつは、エンドユーザにこれらの値を復号化する権利を与えることなく、既存の暗号化されたカラム値を確認する方法をアプリケーションに与えられることです。
mysql>SELECT customer_address FROM customer_table
>WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
Unix crypt()
システム呼び出しを使って
str
を暗号化し、バイナリ
ストリングを戻します。salt
引数は少なくとも 2
文字のストリングでなければいけません。salt
が与えられていない場合は、ランダム値が使用されます。
mysql> SELECT ENCRYPT('hello');
-> 'VxuFAJXVARROc'
ENCRYPT()
は、少なくともいくつかのシステムでは、str
の最初の 8
文字以外のすべてを無視します。この動作は、crypt()
システム呼び出しを基本とした実装によって定められています。
utf8
以外のマルチバイト文字セットとの
ENCYPT()
の使用は、システム呼び出しが、ストリングがゼロ
バイトによって終了させられると想定するため、お薦めできません。
crypt()
が使用しているシステムで利用できない場合
( Windows のケースなど )
、ENCRYPT()
は常に
NULL
を戻します。
MD5 128
ビットのチェックサムを、ストリング用に計算します。その値は
32 16進数のバイナリ
ストリングとして戻され、または引数が
NULL
の場合は NULL
が戻されます。例として、戻り値をハッシュ
キーとして使用することができます。
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
これは、「RSA Data Security, Inc. MD5 Message-Digest Algorithm.」 です。
値を大文字に変換したい場合は、項11.8. 「キャスト関数と演算子」
の BINARY
演算子のエントリで挙げられているバイナリ
ストリングの変換に関する説明をご覧ください。
このセクション始めの MD5 アルゴリズムに関する注記をご覧ください。
セキュリティ向上のため、PASSWORD()
の実装が変更された際に、OLD_PASSWORD()
が MySQL
に追加されました。OLD_PASSWORD()
は PASSWORD()
のバイナリ
ストリングの旧 ( 4.1 の前 )
実装の値を戻し、使用しているバージョンの
5.1 MySQL
サーバに接続する必要のある 4.1
より前のクライアントが、自らを締め出すことなく、パスワードをリセットすることを許可することが目的です。詳細は
項4.7.9. 「MySQL 4.1 のパスワードハッシュ」
を参照してください。
平文のパスワード str
からパスワード
ストリングを計算して戻し、バイナリ
ストリングか、引数が NULL
の場合は NULL
を戻します。この関数を使用して、user
権限テーブルの Password
カラムの格納の MySQL
パスワードを暗号化します。
mysql> SELECT PASSWORD('badpwd');
-> '*AAB3E285149C0135D51A520E1940DD3263DC008C'
PASSWORD()
の暗号化は一方的なものです ( 可逆性はない
) 。
PASSWORD()
の行うパスワードの暗号化は、Unix
パスワードの暗号化とは異なります。ENCRYPT()
を参照してください。
注記
:PASSWORD()
関数は、MySQL
サーバの認証システムによって使用されます。独自にアプリケーションでは使用しないで
ください。その代わりには、MD5()
または SHA1()
をお薦めします。また、RFC
2195, section 2 (Challenge-Response Authentication Mechanism
(CRAM))
で、パスワードの扱いとアプリケーションの認証セキュリティーについての詳細をご覧ください。
ストリングの SHA-1 160
ビットのチェックサムを、RFC 3174 ( Secure Hash
Algorithm )
で説明されているように計算します。その値は
40 16進数のバイナリ
ストリングとして戻され、または引数が
NULL
の場合は NULL
が戻されます。この関数の使用例のひとつとして、ハッシュ
キーとしての使用が考えられます。また、パスワードの保管のための暗号化関数としても使用できます。
SHA()
は SHA1()
と同義です。
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()
は、 MD5()
と同等に、暗号化に関してはさらに安全であると考えられています。ただし、このセクション始めの
MD5 と SHA-1
アルゴリズムに関する注記をご参照ください。
UNCOMPRESS(
string_to_uncompress
)
COMPRESS()
関数によって圧縮されたストリングを非圧縮します。引数が圧縮された値でない場合は、結果は
NULL
になります。この関数では、MySQL が
zlib
のような圧縮ライブラリとコンパイルされている必要があります。その条件が満たされない場合、その戻り値は常に
NULL
になります。
mysql>SELECT UNCOMPRESS(COMPRESS('any string'));
-> 'any string' mysql>SELECT UNCOMPRESS('any string');
-> NULL
UNCOMPRESSED_LENGTH(
compressed_string
)
圧縮されたストリングの、圧縮前の長さを戻します。
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30