暗号化と圧縮機能
TiDB は、MySQL 8.0 で利用可能な暗号化および圧縮関数のほとんどをサポートしています。
サポートされている関数
名前 | 説明 |
---|---|
AES_DECRYPT() | AESを使用して復号化する |
AES_ENCRYPT() | AESを使用して暗号化する |
COMPRESS() | 結果を圧縮してバイナリ文字列として返す |
MD5() | MD5チェックサムを計算する |
PASSWORD() | パスワード文字列を計算して返す |
RANDOM_BYTES() | ランダムなバイトベクトルを返す |
SHA() | SHA-1 160ビットチェックサムを計算する |
SHA1() | SHA-1 160ビットチェックサムを計算する |
SHA2() | SHA-2チェックサムを計算する |
SM3() | SM3チェックサムを計算する |
UNCOMPRESS() | 圧縮された文字列を解凍する |
UNCOMPRESSED_LENGTH() | 圧縮前の文字列の長さを返す |
VALIDATE_PASSWORD_STRENGTH() | パスワードの強度を検証する |
AES_DECRYPT()
AES_DECRYPT(data, key [,iv])
関数は、同じkey
使用してAES_ENCRYPT()
関数を使用して以前に暗号化されたdata
復号化します。
block_encryption_mode
システム変数を使用して高度暗号化規格 (AES)暗号化モードを選択できます。
初期化ベクトルを必要とする暗号化モードの場合は、 iv
引数で設定します。デフォルト値はNULL
です。
SELECT AES_DECRYPT(0x28409970815CD536428876175F1A4923, 'secret');
+----------------------------------------------------------------------------------------------------------------------+
| AES_DECRYPT(0x28409970815CD536428876175F1A4923, 'secret') |
+----------------------------------------------------------------------------------------------------------------------+
| 0x616263 |
+----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
AES_ENCRYPT()
AES_ENCRYPT(data, key [,iv])
関数は、 高度暗号化規格 (AES)アルゴリズムを使用してdata
key
で暗号化します。
block_encryption_mode
システム変数を使用して AES 暗号化モードを選択できます。
初期化ベクトルを必要とする暗号化モードの場合は、 iv
引数で設定します。デフォルト値はNULL
です。
SELECT AES_ENCRYPT(0x616263,'secret');
+----------------------------------------------------------------+
| AES_ENCRYPT(0x616263,'secret') |
+----------------------------------------------------------------+
| 0x28409970815CD536428876175F1A4923 |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
COMPRESS()
COMPRESS(expr)
関数は入力データexpr
の圧縮バージョンを返します。
- 引数が
NULL
場合、関数はNULL
返します。 - 引数が空の文字列の場合、関数は長さ 0 の値を返します。
長さがゼロ以外の引数の場合、関数は次の構造を持つバイナリ文字列を返します。
- バイト0~3: 圧縮されていない長さ
- 4バイト目から最後まで: zlib圧縮データ
SELECT COMPRESS(0x414243);
+------------------------------------------+
| COMPRESS(0x414243) |
+------------------------------------------+
| 0x03000000789C72747206040000FFFF018D00C7 |
+------------------------------------------+
1 row in set (0.00 sec)
この出力では、 0x03000000
圧縮されていない長さ (3) を表し、 0x789C72747206040000FFFF018D00C7
zlib 圧縮されたデータを表します。
Python を使用して TiDB の外部でこれをデコードする例:
import codecs
import zlib
data = codecs.decode('03000000789C72747206040000FFFF018D00C7','hex')
print(int.from_bytes(data[:4], byteorder='little')) # 3
print(zlib.decompress(data[4:])) # b'ABC'
短い文字列の場合、 COMPRESS()
入力よりも多くのバイトを返す可能性があります。次の例は、100 a
文字の文字列が 19 バイトに圧縮されることを示しています。
WITH x AS (SELECT REPEAT('a',100) 'a')
SELECT LENGTH(a),LENGTH(COMPRESS(a)) FROM x;
+-----------+---------------------+
| LENGTH(a) | LENGTH(COMPRESS(a)) |
+-----------+---------------------+
| 100 | 19 |
+-----------+---------------------+
1 row in set (0.00 sec)
MD5()
MD5(expr)
関数は、指定された引数expr
に対して 128 ビットのMD5ハッシュを計算します。
SELECT MD5('abc');
+----------------------------------+
| MD5('abc') |
+----------------------------------+
| 900150983cd24fb0d6963f7d28e17f72 |
+----------------------------------+
1 row in set (0.00 sec)
PASSWORD()
PASSWORD(str)
関数は、 mysql_native_password
認証方法で使用できるパスワード ハッシュを計算します。
SELECT PASSWORD('secret');
+-------------------------------------------+
| PASSWORD('secret') |
+-------------------------------------------+
| *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1681): PASSWORD is deprecated and will be removed in a future release.
RANDOM_BYTES()
RANDOM_BYTES(n)
関数はn
ランダム バイトを返します。
SELECT RANDOM_BYTES(3);
+----------------------------------+
| RANDOM_BYTES(3) |
+----------------------------------+
| 0x1DBC0D |
+----------------------------------+
1 row in set (0.00 sec)
SHA()
SHA()
関数はSHA1
の別名です。
SHA1()
SHA1(expr)
関数は、指定された引数expr
に対して 160 ビットのSHA-1ハッシュを計算します。
SELECT SHA1('abc');
+------------------------------------------+
| SHA1('abc') |
+------------------------------------------+
| a9993e364706816aba3e25717850c26c9cd0d89d |
+------------------------------------------+
1 row in set (0.00 sec)
SHA2()
SHA2(str, n)
関数は、 SHA-2ファミリのアルゴリズムを使用してハッシュを計算します。5 引数はアルゴリズムを選択するために使用されます。7 SHA2()
引数のいずれかがNULL
の場合、またはn
によってn
されたアルゴリズムが不明またはサポートされていない場合にNULL
返します。
サポートされているアルゴリズムは次のとおりです。
ん | アルゴリズム |
---|---|
0 | SHA-256 |
224 | SHA-224 |
256 | SHA-256 |
384 | SHA-384 |
512 | 512ハッシュ |
SELECT SHA2('abc',224);
+----------------------------------------------------------+
| SHA2('abc',224) |
+----------------------------------------------------------+
| 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
SM3()
注記:
SM3()
関数は TiDB 拡張機能であり、MySQL には実装されていません。
SM3(str)
関数は、指定された引数str
に対して 256 ビットのシャンミ3(SM3)ハッシュを計算します。
SELECT SM3('abc');
+------------------------------------------------------------------+
| SM3('abc') |
+------------------------------------------------------------------+
| 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
UNCOMPRESS()
UNCOMPRESS(data)
関数は、 COMPRESS()
関数で圧縮されたデータを解凍します。
SELECT UNCOMPRESS(0x03000000789C72747206040000FFFF018D00C7);
+------------------------------------------------------------------------------------------------------------+
| UNCOMPRESS(0x03000000789C72747206040000FFFF018D00C7) |
+------------------------------------------------------------------------------------------------------------+
| 0x414243 |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
UNCOMPRESSED_LENGTH()
UNCOMPRESSED_LENGTH(data)
関数は、圧縮データの最初の 4 バイトを返します。これには、 COMPRESS()
関数で圧縮される前の圧縮文字列の長さが格納されます。
SELECT UNCOMPRESSED_LENGTH(0x03000000789C72747206040000FFFF018D00C7);
+---------------------------------------------------------------+
| UNCOMPRESSED_LENGTH(0x03000000789C72747206040000FFFF018D00C7) |
+---------------------------------------------------------------+
| 3 |
+---------------------------------------------------------------+
1 row in set (0.00 sec)
VALIDATE_PASSWORD_STRENGTH()
VALIDATE_PASSWORD_STRENGTH(str)
関数はパスワード管理の一部として使用されます。パスワードの強度を計算し、0 から 100 までの値を返します。
validate_password.*
システム変数はVALIDATE_PASSWORD_STRENGTH()
関数の動作に影響します。
例:
パスワードの複雑さのチェックを有効にするには、
validate_password.enable
システム変数をON
に設定します。SET GLOBAL validate_password.enable=ON;パスワード検証関連のシステム変数をビュー。
SHOW VARIABLES LIKE 'validate_password.%';+--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password.check_user_name | ON | | validate_password.dictionary | | | validate_password.enable | ON | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +--------------------------------------+--------+ 8 rows in set (0.01 sec)空の文字列のパスワード強度をチェックします
0
が返されます。SELECT VALIDATE_PASSWORD_STRENGTH('');+--------------------------------+ | VALIDATE_PASSWORD_STRENGTH('') | +--------------------------------+ | 0 | +--------------------------------+ 1 row in set (0.00 sec)短い文字列
abcdef
のパスワード強度をチェックすると、25
返されます。SELECT VALIDATE_PASSWORD_STRENGTH('abcdef');+--------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('abcdef') | +--------------------------------------+ | 25 | +--------------------------------------+ 1 row in set (0.00 sec)長い文字列
abcdefghi
のパスワード強度をチェックすると、50
返されます。この文字列はデフォルト値のvalidate_password.length
よりも長いです。SELECT VALIDATE_PASSWORD_STRENGTH('abcdefghi');+-----------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('abcdefghi') | +-----------------------------------------+ | 50 | +-----------------------------------------+ 1 row in set (0.00 sec)文字列に大文字を追加しても、パスワードの強度は向上しません。
SELECT VALIDATE_PASSWORD_STRENGTH('Abcdefghi');+-----------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('Abcdefghi') | +-----------------------------------------+ | 50 | +-----------------------------------------+ 1 row in set (0.01 sec)文字列に数字を追加しても、パスワードの強度は向上しません。
SELECT VALIDATE_PASSWORD_STRENGTH('Abcdefghi123');+--------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('Abcdefghi123') | +--------------------------------------------+ | 50 | +--------------------------------------------+ 1 row in set (0.00 sec)最後に、文字列に特殊文字を追加すると、パスワードの強度が
100
になり、強力なパスワードであることを示します。SELECT VALIDATE_PASSWORD_STRENGTH('Abcdefghi123%$#');+-----------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('Abcdefghi123%$#') | +-----------------------------------------------+ | 100 | +-----------------------------------------------+ 1 row in set (0.00 sec)
サポートされていない関数
- TiDB は、MySQL Enterprise 問題 #2632でのみ利用可能な関数をサポートしていません。
MySQL 互換性
- TiDB は
STATEMENT_DIGEST()
およびSTATEMENT_DIGEST_TEXT()
関数をサポートしていません。 - TiDB は、MySQL 8.0.30 で追加された
AES_ENCRYPT()
とAES_DECRYPT
のkdf_name
、salt
、iterations
引数をサポートしていません。 - MySQL は
SM3()
関数を実装していません。