MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

12.14 暗号化関数と圧縮関数

表 12.18 「暗号化関数」

名前 説明
AES_DECRYPT() AES を使用して復号化します
AES_ENCRYPT() AES を使用して暗号化します
COMPRESS() バイナリ文字列として結果を返します
MD5() MD5 チェックサムを計算します
RANDOM_BYTES() ランダムなバイトベクトルを返します
SHA1(), SHA() SHA-1 160 ビットチェックサムを計算します
SHA2() SHA-2 チェックサムを計算します
STATEMENT_DIGEST() ステートメントダイジェストハッシュ値の計算
STATEMENT_DIGEST_TEXT() 正規化されたステートメントダイジェストの計算
UNCOMPRESS() 圧縮された文字列を圧縮解除します
UNCOMPRESSED_LENGTH() 圧縮前の文字列長を返します
VALIDATE_PASSWORD_STRENGTH() パスワードの強度を判断します

多くの暗号化関数および圧縮関数では、結果に任意のバイト値が含まれている可能性のある文字列が返されます。 これらの結果を格納する場合は、VARBINARY または BLOB バイナリ文字列データ型のカラムを使用します。 これにより、バイナリ以外の文字列データ型 (CHAR, VARCHAR, TEXT) を使用している場合など、データ値を変更する可能性がある後続の領域削除または文字セット変換の潜在的な問題を回避できます。

一部の暗号化関数は ASCII 文字の文字列を返します: MD5(), SHA(), SHA1(), SHA2(), STATEMENT_DIGEST(), STATEMENT_DIGEST_TEXT()。 戻り値は、character_set_connection および collation_connection システム変数によって決定される文字セットと照合順序を持つ文字列です。 これは、文字セットが binary でないかぎり、非バイナリ文字列です。

アプリケーションで 16 進数の文字列を返す関数 (MD5()SHA1() など) からの値を格納する場合は、UNHEX() を使用して 16 進表現をバイナリに変換し、その結果を BINARY(N) カラムに格納すれば、より効率的な格納および比較を実現できます。 16 進数の各ペアにはバイナリ形式で 1 バイトが必要であるため、N の値は 16 進数文字列の長さに依存します。 N は、MD5() 値の場合は 16、SHA1() の場合は 20 です。 SHA2() の場合、N の範囲は、結果の目的のビット長を指定する引数に応じて 28 から 32 までです。

utf8 文字セット (文字ごとに 4 バイト使用されます) が使用されるカラムに値が格納される場合に、16 進文字列を CHAR カラムに格納する際のサイズのペナルティーは最小で 2 回、最大で 8 回です。 また、文字列を格納すると、値が大きくなり、文字セットの照合順序ルールを考慮に入れる必要があるため、比較が遅くなります。

アプリケーションで MD5() 文字列値が CHAR(32) カラムに格納されると仮定します。

CREATE TABLE md5_tbl (md5_val CHAR(32), ...);
INSERT INTO md5_tbl (md5_val, ...) VALUES(MD5('abcdef'), ...);

16 進文字列をよりコンパクトな形式に変換するには、次のように、代わりに UNHEX() および BINARY(16) が使用されるようにアプリケーションを変更します。

CREATE TABLE md5_tbl (md5_val BINARY(16), ...);
INSERT INTO md5_tbl (md5_val, ...) VALUES(UNHEX(MD5('abcdef')), ...);

ハッシュ関数が 2 つの異なる入力値に同じ値を生成するという非常にまれなケースに対応できるように、アプリケーションが準備されるはずです。 競合を検出可能にする方法の 1 つは、ハッシュカラムを主キーにすることです。

注記

MD5 および SHA-1 アルゴリズムの悪用が知られています。 かわりに、このセクションで説明されている別の一方向暗号化機能 (SHA2() など) の使用を検討してください。

注意

暗号化機能の引数として指定されたパスワードまたはその他の機密値は、SSL 接続が使用されないかぎり、クリアテキストとして MySQL サーバーに送信されます。 また、このような値は、書き込まれるすべての MySQL ログに表示されます。 このようなタイプの露出を回避するために、アプリケーションはクライアント側で機密の値を暗号化してから、サーバーに送信できます。 同じ考慮事項が暗号化鍵にも適用されます。 これらの露出を回避するために、アプリケーションはストアドプロシージャーを使用して、サーバー側で値を暗号化および復号化できます。