MariaDBでRANDOM_BYTESやCRYPT_GEN_RANDOMの代わりに使えるもの
MariaDBで安全なランダムバイト列を生成する方法
問題点:
RAND()
関数は存在しますが、暗号学的に安全ではないため、パスワードや暗号化キーなどの重要なデータ生成には使用できません。- MariaDB 10.6以前では、安全なランダムバイト列を生成するための標準的な方法がありませんでした。
解決策:
MariaDBで安全なランダムバイト列を生成するには、以下の方法があります。
MariaDB 10.7では、RAND_BYTES()
関数が導入されました。この関数は、CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) を使用して安全なランダムバイト列を生成します。
-- MariaDB 10.7以降
SELECT RAND_BYTES(16);
UDF (ユーザー定義関数) を作成する
MariaDB 10.6以前を使用している場合、または RAND_BYTES()
関数の機能が不足している場合は、C言語などの言語でUDFを作成して、安全なランダムバイト列を生成することができます。
UDFは、CSPRNGライブラリ (OpenSSLなど) を使用してランダムバイト列を生成し、MariaDBから呼び出すことができます。
外部ツールを使用する
openssl rand
などの外部ツールを使用して、安全なランダムバイト列を生成し、MariaDBにインポートすることもできます。
-- 外部ツールを使用
openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 16
- MariaDB 10.7以降を使用している場合は、
RAND_BYTES()
関数を使用するのが最も簡単で安全な方法です。 - MariaDB 10.6以前を使用している場合は、UDFを作成するか、外部ツールを使用する必要があります。
- 生成するランダムバイト列の用途に応じて、適切な方法を選択する必要があります。
補足:
- 上記の方法は、MariaDB以外のデータベースでも使用できる場合があります。
- 安全なランダムバイト列を生成するには、CSPRNGライブラリを使用する必要があります。
- 生成されたランダムバイト列は、適切に保護する必要があります。
MariaDB 10.7以降を使用する
-- MariaDB 10.7以降
-- パスワード生成
SET @password = RAND_BYTES(16);
-- 暗号化キー生成
SET @key = RAND_BYTES(32);
-- INSERT INTO ...
UDF (ユーザー定義関数) を作成する
#include <openssl/rand.h>
static unsigned char *my_random_bytes(unsigned int length) {
unsigned char *buffer = malloc(length);
RAND_bytes(buffer, length);
return buffer;
}
CREATE FUNCTION my_random_bytes(length INT) RETURNS BINARY(length)
DETERMINISTIC
RETURNS NULL ON NULL INPUT
READS SQL DATA
BEGIN
RETURN my_random_bytes(length);
END;
-- 使用例
SELECT my_random_bytes(16);
外部ツールを使用する
-- 外部ツールを使用
-- パスワード生成
openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 16
-- 暗号化キー生成
openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32
-- INSERT INTO ...
上記のコードはサンプルコードであり、実際の使用環境に合わせて変更する必要があります。
MariaDBで安全なランダムバイト列を生成するその他の方法
RAND() 関数を組み合わせて使用する
RAND()
関数は暗号学的に安全ではありませんが、他の関数と組み合わせることで、ある程度のセキュリティを向上させることができます。
-- 安全ではない
SELECT RAND();
-- 多少安全
SELECT MD5(RAND());
-- より安全
SELECT SHA256(RAND() + CONCAT(CURRENT_TIMESTAMP(), @@session_id));
独自のアルゴリズムを作成する
CSPRNGアルゴリズムに関する知識があれば、独自のアルゴリズムを作成して、MariaDBで安全なランダムバイト列を生成することができます。
他のデータベースを使用する
MySQLやMSSQLなどのデータベースには、RAND_BYTES()
や CRYPT_GEN_RANDOM
などの安全なランダムバイト列を生成する関数
random mariadb