暗号化と圧縮機能

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返します。

サポートされているアルゴリズムは次のとおりです。

アルゴリズム
0SHA-256
224SHA-224
256SHA-256
384SHA-384
512512ハッシュ
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_DECRYPTkdf_namesaltiterations引数をサポートしていません。
  • MySQL はSM3()関数を実装していません。

このページは役に立ちましたか?