名前 | 説明 |
---|---|
AES_DECRYPT() |
AES を使って復号化します |
AES_ENCRYPT() |
AES を使って暗号化します |
COMPRESS() (v4.1.1) |
結果をバイナリ列として返します |
DECODE() |
ENCODE() を使って暗号化された文字列を復号化します |
DES_DECRYPT() |
文字列を復号化します |
DES_ENCRYPT() |
文字列を暗号化します |
ENCODE() |
文字列を符号化します |
ENCRYPT() |
文字列を暗号化します |
MD5() |
MD5 チェックサムを計算します |
OLD_PASSWORD() (v4.1) |
PASSWORD の古い実装 (4.1 より前の実装) の値を返します |
PASSWORD() |
パスワード文字列を計算して返します |
SHA1() 、SHA() |
SHA-1 160 ビットチェックサムを計算します |
UNCOMPRESS() (v4.1.1) |
圧縮された文字列を圧縮解除します |
UNCOMPRESSED_LENGTH() (v4.1.1) |
文字列の圧縮前の長さを返します |
暗号化および圧縮関数はバイナリ列を返します。これらの関数の多くは、結果が任意のバイト値を含む場合があります。これらの結果を格納する場合は、VARBINARY
または BLOB
バイナリ列データ型のカラムを使用してください。そうすれば、非バイナリ列データ型
(CHAR
、VARCHAR
、TEXT
)
を使用した場合に発生する可能性のある、末尾の空白が削除されたりキャラクタセットが変換されたりしてデータ値が変化してしまうという問題を回避することができます。
MD5 および SHA-1 アルゴリズムの利用についてはすでに知られています。開発者は、この節で紹介されているほかの暗号化関数の使用も考慮してください。
AES_DECRYPT(
crypt_str
,key_str
)
この関数を使えば、正式な AES (Advanced
Encryption Standard)
アルゴリズムによるデータの復号化を行えます。詳細については、AES_ENCRYPT()
の説明を参照してください。
AES_ENCRYPT()
と
AES_DECRYPT()
を使えば、以前 「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
のような圧縮ライブラリとコンパイルされている必要があります。その条件が満たされない場合、その戻り値は常に
NULL
になります。圧縮された文字列は、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
などの非バイナリ列データ型に圧縮文字列を格納するとキャラクタセットの変換が発生する可能性があるため、そうすることはお勧めできません。代わりに、VARBINARY
または
BLOB
バイナリ列のカラムを使用してください。)
暗号化された文字列
crypt_str
の復号化を、pass_str
をパスワードとして使用して行います。crypt_str
は、ENCODE()
から返された文字列であるべきです。
pass_str
を使用し、str
をパスワードとして暗号化します。結果を復号化するには
DECODE()
を用います。
結果は、str
と同じ長さのバイナリ列になります。
暗号化の強度は、ランダム発生器の質によります。短い文字列でも十分です。
DES_DECRYPT(
crypt_str
[,key_str
])
DES_ENCRYPT()
によって暗号化された文字列を復号化します。エラーが起きた場合、この関数は
NULL
を返します。
この関数は、MySQL が SSL サポートで設定されている場合のみ作動しますのでご注意ください。Using SSL for Secure Connections を参照してください。
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 サポートで設定されている場合のみ作動しますのでご注意ください。Using SSL for Secure Connections を参照してください。
使用する暗号化キーは、与えられていれば、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
以外のマルチバイトキャラクタセットとの
ENCRYPT()
の使用は、システム呼び出しが、文字列がゼロバイトによって終了させられると想定するため、お薦めできません。
crypt()
が使用しているシステムで利用できない場合
(Windows のケースなど)
、ENCRYPT()
は常に NULL
を返します。
MD5 128
ビットのチェックサムを、文字列用に計算します。その値は
32 16
進数のバイナリ列として戻され、または引数が
NULL
の場合は
NULL
が戻されます。例として、戻り値をハッシュキーとして使用することができます。
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
これは、「RSA Data Security, Inc. MD5 Message-Digest Algorithm.」 です。
値を大文字に変換したい場合は、項7.9. 「キャスト関数と演算子」
の BINARY
演算子のエントリで挙げられているバイナリ列の変換に関する説明をご覧ください。
この節始めの MD5 アルゴリズムに関する注記をご覧ください。
セキュリティー向上のため、PASSWORD()
の実装が変更された際に、OLD_PASSWORD()
が MySQL
に追加されました。OLD_PASSWORD()
は
PASSWORD()
のバイナリ列の旧 (4.1 の前)
実装の値を返し、使用しているバージョンの
5.1 MySQL
サーバーに接続する必要のある 4.1
より前のクライアントが、自らを締め出すことなく、パスワードをリセットすることを許可することが目的です。Password Hashing in MySQL
を参照してください。
プレーンテキストパスワード
str
からパスワード文字列を計算して返し、バイナリ列か、引数が
NULL
の場合は
NULL
を返します。この関数を使用して、user
権限テーブルの
Password
カラムの格納の MySQL
パスワードを暗号化します。
mysql> SELECT PASSWORD('badpwd');
-> '*AAB3E285149C0135D51A520E1940DD3263DC008C'
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