表 12.17 暗号化関数
名前 | 説明 |
---|---|
AES_DECRYPT() |
AES を使用して復号化します |
AES_ENCRYPT() |
AES を使用して暗号化します |
ASYMMETRIC_DECRYPT() (導入 5.6.21) |
秘密鍵または公開鍵を使用して暗号文を復号化します |
ASYMMETRIC_DERIVE() (導入 5.6.21) |
非対称鍵から対称鍵を導出します |
ASYMMETRIC_ENCRYPT() (導入 5.6.21) |
秘密鍵または公開鍵を使用してプレーンテキストを暗号化します |
ASYMMETRIC_SIGN() (導入 5.6.21) |
ダイジェストから署名を生成します |
ASYMMETRIC_VERIFY() (導入 5.6.21) |
署名がダイジェストと一致することを確認します |
COMPRESS() |
バイナリ文字列として結果を返します |
CREATE_ASYMMETRIC_PRIV_KEY() (導入 5.6.21) |
秘密鍵を作成します |
CREATE_ASYMMETRIC_PUB_KEY() (導入 5.6.21) |
公開鍵を作成します |
CREATE_DH_PARAMETERS() (導入 5.6.21) |
共有 DH シークレットを生成します |
CREATE_DIGEST() (導入 5.6.21) |
文字列からダイジェストを生成します |
DECODE() |
ENCODE() を使用して暗号化された文字列をデコードします |
DES_DECRYPT() |
文字列を復号化します |
DES_ENCRYPT() |
文字列を暗号化します |
ENCODE() |
文字列をエンコードします |
ENCRYPT() |
文字列を暗号化します |
MD5() |
MD5 チェックサムを計算します |
OLD_PASSWORD() (非推奨 5.6.5) |
4.1 より前の PASSWORD 実装の値を返します |
PASSWORD() |
パスワード文字列を計算して返します |
RANDOM_BYTES() (導入 5.6.17) |
ランダムなバイトベクトルを返します |
SHA1() , SHA() |
SHA-1 160 ビットチェックサムを計算します |
SHA2() |
SHA-2 チェックサムを計算します |
UNCOMPRESS() |
圧縮された文字列を圧縮解除します |
UNCOMPRESSED_LENGTH() |
圧縮前の文字列長を返します |
VALIDATE_PASSWORD_STRENGTH() (導入 5.6.6) |
パスワードの強度を判断します |
多くの暗号化関数および圧縮関数では、結果に任意のバイト値が含まれている可能性のある文字列が返されます。これらの結果を格納する場合は、VARBINARY
または BLOB
バイナリ文字列データ型のカラムを使用します。これにより、末尾の空白を削除したり、文字セットを変換したりするとデータ値が変更される可能性があるという問題を回避できます。たとえば、非バイナリ文字列のデータ型
(CHAR
、VARCHAR
、TEXT
)
を使用した場合に、これが発生する可能性があります。
一部の暗号化関数では、ASCII 文字
(MD5()
、OLD_PASSWORD()
、PASSWORD()
、SHA()
、SHA1()
、SHA2()
)
の文字列が返されます。MySQL 5.6
では、戻り値は、character_set_connection
および collation_connection
システム変数で決定された文字セットおよび照合順序を含む非バイナリ文字列です。
MD5()
や SHA1()
などの関数がバイナリ文字列として 16
進数の文字列を返すバージョンでは、戻り値を大文字に変換したり、大文字と小文字が区別されない方法でそのまま比較したりできません。値を非バイナリ文字列に変換する必要があります。セクション12.10「キャスト関数と演算子」で、バイナリ文字列の変換の説明を参照してください。
アプリケーションで 16 進数の文字列を返す関数
(MD5()
や
SHA1()
など)
からの値を格納する場合は、UNHEX()
を使用して 16
進表現をバイナリに変換し、その結果を
BINARY(
カラムに格納すれば、より効率的な格納および比較を実現できます。16
進数の各ペアには、バイナリ形式での 1
バイトが必要であるため、N
)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 ログにも表示されます。このようなタイプの露出を回避するために、アプリケーションはクライアント側で機密の値を暗号化してから、サーバーに送信できます。同じ考慮事項が暗号化鍵にも適用されます。これらの露出を回避するために、アプリケーションはストアドプロシージャーを使用して、サーバー側で値を暗号化および復号化できます。
-
AES_DECRYPT(
crypt_str
,key_str
[,init_vector
])この関数は、公式の AES (Advanced Encryption Standard) アルゴリズムを使用してデータを復号化します。詳細は、
AES_ENCRYPT()
の説明を参照してください。MySQL 5.6.17 の時点では、オプションの初期化ベクトル引数
init_vector
を使用できます。そのバージョンでは、AES_DECRYPT()
が使用されるステートメントはステートメントベースのレプリケーションに対して安全ではなく、クエリーキャッシュ内に格納できません。 -
AES_ENCRYPT(
str
,key_str
[,init_vector
])AES_ENCRYPT()
およびAES_DECRYPT()
では、AES (Advanced Encryption Standard) アルゴリズム (以前は 「Rijndael」 と呼ばれていました) を使用したデータの暗号化および復号化が実装されます。AES の標準では、さまざまな鍵の長さが許可されます。デフォルトでは、これらの関数で鍵の長さが 128 ビットの AES が実装されます。MySQL 5.6.17 の時点では、あとで説明するように、使用できる鍵の長さは 196 または 256 ビットです。鍵の長さは、パフォーマンスとセキュリティーの間でのトレードオフです。AES_ENCRYPT()
は、鍵文字列key_str
を使用して文字列str
を暗号化し、暗号化された出力を含むバイナリ文字列を返します。AES_DECRYPT()
は、鍵文字列key_str
を使用して暗号化された文字列crypt_str
を復号化し、元のプレーンテキスト文字列を返します。関数引数のいずれかがNULL
の場合は、関数でNULL
が返されます。str
およびcrypt_str
引数は任意の長さにすることができ、AES などのブロックベースのアルゴリズムによって、必要に応じてブロックの倍数になるように、自動的にパディングがstr
に追加されます。このパディングは、AES_DECRYPT()
関数によって自動的に削除されます。crypt_str
の長さは、次の公式を使用して計算できます。16 * (trunc(string_length / 16) + 1)
鍵の長さが 128 ビットの場合、
key_str
引数に鍵を渡すもっともセキュアな方法は、完全にランダムな 128 ビット値を作成し、それをバイナリ値として渡すことです。例:INSERT INTO t VALUES (1,AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));
パスフレーズを使用すると、パスフレーズをハッシュ化することで AES 鍵を生成できます。例:
INSERT INTO t VALUES (1,AES_ENCRYPT('text', SHA2('My secret passphrase',512)));
パスワードまたはパスフレーズは直接
crypt_str
に渡さず、最初にハッシュ化してください。このドキュメントの以前のバージョンでは、従来のアプローチが提案されていましたが、ここで示す例の方がセキュアであるため、推奨されなくなりました。AES_DECRYPT()
で無効な日付または不正なパディングが検出された場合は、NULL
が返されます。ただし、入力データまたは鍵が無効になっている場合は、AES_DECRYPT()
でNULL
以外の値 (ごみの可能性もあります) が返される可能性があります。MySQL 5.6.17 の時点では、
AES_ENCRYPT()
およびAES_DECRYPT()
でブロック暗号化モードの制御が許可され、オプションのinit_vector
初期化ベクトル引数が指定されます。block_encryption_mode
システム変数は、ブロックベースの暗号化アルゴリズムのモードを制御します。そのデフォルト値は、128 ビットの鍵の長さと ECB モードを使用した暗号化を表すaes-128-ecb
です。この変数で許可されている値については、セクション5.1.4「サーバーシステム変数」を参照してください。オプションの
init_vector
引数では、必要とするブロック暗号化モードに対応する初期化ベクトルが提供されます。
オプションの
init_vector
引数が必要なモードでは、16 バイト以上の長さにする必要があります (16 を超えるバイトは無視されます)。init_vector
が欠落している場合は、エラーが発生します。init_vector
が必要ないモードでは、これが無視され、指定されている場合は警告が生成されます。RANDOM_BYTES(16)
を呼び出すと、初期化ベクトルに使用されるバイトのランダム文字列を生成できます。初期化ベクトルが必要な暗号化モードでは、暗号化および復号化でも同じベクトルを使用する必要があります。mysql> SET block_encryption_mode = 'aes-256-cbc'; mysql> SET @key_str = SHA2('My secret passphrase',512); mysql> SET @init_vector = RANDOM_BYTES(16); mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector); mysql> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector); +-----------------------------------------------+ | AES_DECRYPT(@crypt_str,@key_str,@init_vector) | +-----------------------------------------------+ | text | +-----------------------------------------------+
次の表には、許可されている各ブロック暗号化モード、サポートされている SSL ライブラリ、および初期化ベクトル引数が必須であるかどうかを一覧表示します。
ブロック暗号化モード モードがサポートされている SSL ライブラリ 初期化ベクトルが必要 ECB OpenSSL、yaSSL いいえ CBC OpenSSL、yaSSL はい CFB1 OpenSSL はい CFB8 OpenSSL はい CFB128 OpenSSL はい OFB OpenSSL はい MySQL 5.6.17 では、
AES_ENCRYPT()
またはAES_DECRYPT()
が使用されるステートメントはステートメントベースのレプリケーションに対して安全ではなく、クエリーキャッシュ内に格納できません。 -
文字列を圧縮し、その結果をバイナリ文字列として返します。この関数を使用するには、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 バイトの長さの圧縮されていない文字列として格納され (低いバイトが 1 番目)、そのあとに圧縮された文字列が続きます。文字列が空白文字で終わる場合は、結果が
CHAR
またはVARCHAR
カラムに格納されていても、末尾の空白文字が削除されるという問題が回避されるように、「.
」 文字が追加されます。(ただし、CHAR
やVARCHAR
などの非バイナリ文字列のデータ型を使用して圧縮された文字列を格納すると、文字セットの変換が発生する可能性があるため、いずれにしても推奨されません。代わりに、VARBINARY
またはBLOB
バイナリ文字列のカラムを使用してください。)
-
暗号化された文字列
crypt_str
は、パスワードとしてpass_str
を使用して復号化します。crypt_str
は、ENCODE()
から返された文字列にするようにしてください。 -
DES_DECRYPT(
crypt_str
[,key_str
])DES_ENCRYPT()
を使用して暗号化された文字列を復号化します。エラーが発生した場合、この関数はNULL
を返します。この関数は、MySQL が SSL サポートで構成されている場合のみ機能します。セクション6.3.10「セキュアな接続のための SSL の使用」を参照してください。
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 サポートで構成されている場合のみ機能します。セクション6.3.10「セキュアな接続のための SSL の使用」を参照してください。
使用する暗号化鍵は、指定されていれば、
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
は、メッセージを暗号化する際に使用される文字列です。数字と鍵の間には、少なくとも 1 つの空白文字を入れるようにしてください。最初の鍵は、DES_ENCRYPT()
への鍵引数を指定しなかった場合に使用されるデフォルトのキーです。FLUSH DES_KEY_FILE
ステートメントで鍵ファイルから新しいキー値を読み取るように、MySQL に指示できます。これには、RELOAD
権限が必須です。デフォルト鍵のセットを持つ利点は、これらの値を復号化する権利をエンドユーザーに付与せずに、暗号化されたカラム値の有無をチェックする方法がアプリケーションに提供されることです。
mysql> SELECT customer_address FROM customer_table > WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
-
パスワードとして
pass_str
を使用して、str
を暗号化します。結果は、str
と同じ長さのバイナリ文字列です。結果を復号化するには、DECODE()
を使用します。ENCODE()
関数は使用されるべきではなくなっています。まだENCODE()
を使用する必要がある場合は、リスクを軽減するために、一緒に salt 値を使用する必要があります。例:ENCODE('plaintext', CONCAT('my_random_salt','my_secret_password'))
パスワードを更新するたびに、新しいランダムな salt 値を使用する必要があります。
-
Unix
crypt()
システム呼び出しを使用してstr
を暗号化し、バイナリ文字列を返します。salt
引数は、2 つ以上の文字を含む文字列にする必要があります。それ以外の場合は、結果がNULL
になります。salt
引数が指定されていない場合は、ランダムな値が使用されます。mysql> SELECT ENCRYPT('hello'); -> 'VxuFAJXVARROc'
少なくとも一部のシステムでは、
ENCRYPT()
はstr
の最初の 8 文字以外のすべてを無視します。この動作は、ベースとなるcrypt()
システム呼び出しの実装によって決まります。システム呼び出しではゼロバイトで終了する文字列が要求されるため、
ucs2
、utf16
、utf16le
、またはutf32
マルチバイト文字セットを含むENCRYPT()
の使用は推奨されません。システムで
crypt()
を使用できない場合 (Windows の場合など)、ENCRYPT()
は常にNULL
を返します。 -
文字列の MD5 128 ビットチェックサムを計算します。この値は、32 桁の 16 進数の文字列として返されます。引数が
NULL
だった場合は、NULL
になります。たとえば、戻り値をハッシュ鍵として使用できます。効率的なハッシュ値の格納については、このセクションの冒頭で示した注記を参照してください。戻り値は、接続文字セット内の非バイナリ文字列です。
mysql> SELECT MD5('testing'); -> 'ae2b1fca515949e5d54fb22b8ed95575'
これは、「RSA Data Security, Inc. MD5 Message-Digest Algorithm」 です。
このセクションの冒頭で示した MD5 アルゴリズムに関する注記を参照してください。
-
OLD_PASSWORD()
は、セキュリティーを改善するために、MySQL 4.1 でPASSWORD()
の実装が変更されたときに追加されました。OLD_PASSWORD()
は、PASSWORD()
の 4.1 よりも前の実装の値を文字列として返します。これは、バージョン 5.6 の MySQL サーバーに接続する必要のある 4.1 よりも前のクライアントをロックアウトせずに、それらのクライアントのパスワードをリセットするよう許可するためです。セクション6.1.2.4「MySQL でのパスワードハッシュ」を参照してください。戻り値は、接続文字セット内の非バイナリ文字列です。
注記4.1 より前のハッシュ方式を使用するパスワードはネイティブのパスワードハッシュ方式を使用するパスワードよりもセキュアでないため、使用しないようにしてください。4.1 よりも前のパスワードは非推奨であり、これらのサポートは今後の MySQL リリースで削除される予定です。最終的に、
OLD_PASSWORD()
も非推奨になりました。 -
平文のパスワード
str
から計算してハッシュ化されたパスワード文字列を返します。戻り値は、接続文字セット内の非バイナリ文字列です。引数がNULL
の場合は、NULL
になります。この関数は、mysql.user
付与テーブルに格納する MySQL パスワードを暗号化する際に、サーバーで使用されるアルゴリズムへの SQL インタフェースです。old_passwords
システム変数は、PASSWORD()
関数で使用されるパスワードのハッシュ化方法を制御します。これは、IDENTIFIED BY
句を使用してパスワードを指定するCREATE USER
およびGRANT
ステートメントによって実行されるパスワードハッシュにも影響します。次の表は、
old_passwords
の許可される値、それぞれの値に対するパスワードハッシュ方式、およびそれぞれの方式でハッシュされたパスワードを使用する認証プラグインを示します。これらの値は MySQL 5.6.6 以降で許可されます。5.6.6 より前では、許可される値は 0 (またはOFF
) および 1 (またはON
) です。値 パスワードハッシュ方式 関連付けられた認証プラグイン 0 MySQL 4.1 ネイティブハッシュ mysql_native_password
1 4.1 以前の (「古い」) ハッシュ mysql_old_password
2 SHA-256 ハッシュ sha256_password
old_passwords=1
の場合、PASSWORD(
はstr
)OLD_PASSWORD(
と同じ値を返します。後者の関数はstr
)old_passwords
の値によって影響を受けません。mysql> SET old_passwords = 0; mysql> SELECT PASSWORD('mypass'), OLD_PASSWORD('mypass'); +-------------------------------------------+------------------------+ | PASSWORD('mypass') | OLD_PASSWORD('mypass') | +-------------------------------------------+------------------------+ | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | 6f8c114b58f2ce9e | +-------------------------------------------+------------------------+ mysql> SET old_passwords = 1; mysql> SELECT PASSWORD('mypass'), OLD_PASSWORD('mypass'); +--------------------+------------------------+ | PASSWORD('mypass') | OLD_PASSWORD('mypass') | +--------------------+------------------------+ | 6f8c114b58f2ce9e | 6f8c114b58f2ce9e | +--------------------+------------------------+
SHA-256 パスワードのハッシュ化 (
old_passwords=2
) では、PASSWORD()
からの結果を非決定的にするランダムな salt 値が使用されます。その結果、この関数が使用されるステートメントはステートメントベースのレプリケーションで安全ではなく、クエリーキャッシュ内に格納できません。PASSWORD()
で実行される暗号化は一方向です (可逆ではありません)。暗号化のタイプは、Unix パスワードに使用されるものと同じではありません。そのタイプを使用するには、ENCRYPT()
を使用します。注記PASSWORD()
関数は、MySQL サーバーの認証システムで使用されます。独自のアプリケーションでは、使用しないようにしてください。そのためには、代わりにMD5()
またはSHA2()
を使用してください。アプリケーションでのセキュアなパスワードの処理および認証セキュリティーについての詳細は、RFC 2195 のセクション 2 (「Challenge-Response Authentication Mechanism (CRAM)」)も参照してください。注記4.1 より前のハッシュ方式を使用するパスワードはネイティブのパスワードハッシュ方式を使用するパスワードよりもセキュアでないため、使用しないようにしてください。4.1 よりも前のパスワードは非推奨であり、これらのサポートは今後の MySQL リリースで削除される予定です。その結果、
PASSWORD()
で 4.1 以前のパスワードハッシュを生成するold_passwords=1
も非推奨となります。アカウントのアップグレード手順については、セクション6.3.8.3「4.1 よりも前のパスワードハッシュ方式と mysql_old_password プラグインからの移行」を参照してください。注意状況によっては、サーバーログまたはクライアント側の
~/.mysql_history
などの履歴ファイルに、PASSWORD()
を呼び出すステートメントが記録される可能性があります。これは、その情報への読み取りアクセス権を持っているユーザーならだれでも、平文のパスワードを読み取る可能性があることを意味します。これがサーバーログで発生する条件およびこれを制御する方法については、セクション6.1.2.3「パスワードおよびロギング」を参照してください。クライアント側のロギングに関する同様の情報については、セクション4.5.1.3「mysql のロギング」を参照してください。 -
この関数は、SSL ライブラリ (OpenSSL または yaSSL) の乱数ジェネレータを使用して生成されたランダムな
len
バイトのバイナリ文字列を返します。len
で許可されている値は、1 から 1024 までの範囲内です。値がこの範囲外の場合、RANDOM_BYTES()
は警告を生成し、NULL
を返します。RANDOM_BYTES()
を使用すると、AES_DECRYPT()
およびAES_ENCRYPT()
関数に初期化ベクトルを提供できます。このコンテキストで使用するには、len
を 16 以上にする必要があります。さらに大きい値も許可されますが、16 を超えるバイトは無視されます。RANDOM_BYTES()
は、その結果を非決定的にするランダムな値を生成します。その結果、この関数が使用されるステートメントはステートメントベースのレプリケーションに対して安全ではなく、クエリーキャッシュ内に格納できません。この関数は、MySQL 5.6.17 の時点で使用可能です。
-
RFC 3174 (Secure Hash Algorithm) で説明されているように、文字列の SHA-1 160 ビットチェックサムを計算します。この値は、40 桁の 16 進数の文字列として返されます。引数が
NULL
だった場合は、NULL
になります。この関数を使用する一例として、ハッシュ鍵が考えられます。効率的なハッシュ値の格納については、このセクションの冒頭で示した注記を参照してください。SHA1()
は、パスワードを格納する暗号化関数としても使用できます。SHA()
はSHA1()
のシノニムです。戻り値は、接続文字セット内の非バイナリ文字列です。
mysql> SELECT SHA1('abc'); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()
はMD5()
と同等ですが、暗号化に関してはよりセキュアであると考えられます。ただし、このセクションの冒頭で示した MD5 と SHA-1 アルゴリズムに関する注記を参照してください。 -
SHA-2 ファミリのハッシュ関数 (SHA-224、SHA-256、SHA-384、および SHA-512) を計算します。1 番目の引数は、ハッシュ化される平文の文字列です。2 番目の引数には、結果の目的のビット長が指定されます。値は、224、256、384、512、または 0 (256 と同等です) にする必要があります。引数のいずれかが
NULL
の場合や、ハッシュの長さが許可される値のいずれでもない場合は、戻り値がNULL
になります。それ以外の場合は、関数の結果が目的のビット数が含まれるハッシュ値になります。効率的なハッシュ値の格納については、このセクションの冒頭で示した注記を参照してください。戻り値は、接続文字セット内の非バイナリ文字列です。
mysql> SELECT SHA2('abc', 224); -> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
この関数は、MySQL が SSL サポートで構成されている場合のみ機能します。セクション6.3.10「セキュアな接続のための SSL の使用」を参照してください。
SHA2()
はMD5()
やSHA1()
よりも、暗号化に関してはよりセキュアであると考えられます。 -
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
-
VALIDATE_PASSWORD_STRENGTH(
str
)平文のパスワードを表す引数が指定された場合、この関数はパスワードの強度を示す整数を返します。戻り値は、0 (弱) から 100 (強) までの範囲内です。
パスワードは、一段と厳密になったテストの対象であり、戻り値は、次の表に示すように、どのテストに合格したのかを示します。
パスワードテスト 戻り値 長さ < 4 0 長さ ≥ 4 および < validate_password_length
25 ポリシー 1 を満たす ( LOW
)50 ポリシー 2 を満たす ( MEDIUM
)75 ポリシー 3 を満たす ( STRONG
)100 VALIDATE_PASSWORD_STRENGTH()
によるパスワードの評価は、validate_password
プラグインで実行されます。このプラグインがインストールされていない場合、関数は常に 0 を返します。validate_password
プラグインのインストールについては、セクション6.1.2.6「パスワード検証プラグイン」を参照してください。パスワードのテストに影響を与えるパラメータを確認または構成するには、validate_password
プラグインで実装されているシステム変数をチェックまたは設定します。セクション6.1.2.6.2「パスワード検証プラグインのオプションおよび変数」を参照してください。この関数は、MySQL 5.6.6 で追加されました。