MariaDB による PCRE とハッシュ
Postfix の設定を行っている時にふと思った。ハッシュや PCRE、MySQL の設定ファイルなどが多数存在し、管理が鬱陶しいと。MariaDB ならば正規表現をレコード内に格納し、一括管理を行えるのではないかと。
そこで今回は、MariaDB で正規表現をレコード内に格納し、利用する方法などを検討します。
- MariaDB の正規表現
MariaDB の正規表現は PCRE2 10.34(2022年1月現在)対応となっており、PCRE2 が文字コードの問題もなく、そのまま利用できます。
※ MySQL では、正規表現が標準のままであり、PCRE の拡張機能は利用できません。
また、正しい文字コードの設定を行っている場合、それらに付随する問題も発生しません。
※ MySQL(MariaDB) と日本語を参照
- PCRE 格納テーブルの作成
$ mariadb -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6307
Server version: 10.5.13-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
MariaDB [(none)]> create database pcre2;
Query OK, 1 row affected (0.001 sec)
MariaDB [pcre2]> CREATE TABLE `pcre_table` ( `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `pcre` varchar(255) NOT NULL );
Query OK, 0 rows affected (0.233 sec) - 拡張正規表現の挿入
MariaDB [pcre2]> insert into pcre_table ( pcre ) values ( '^\\d+$' ), ( '^\\w+$' );
Query OK, 2 rows affected (0.028 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [pcre2]> select * from pcre_table;
+----+-------+
| id | pcre |
+----+-------+
| 1 | ^\d+$ |
| 2 | ^\w+$ |
+----+-------+
2 rows in set (0.001 sec)
MariaDB [pcre2]> - テーブルを使用した正規表現検索
MariaDB [pcre2]> select * from pcre_table where 'abc' regexp pcre;
+----+-------+
| id | pcre |
+----+-------+
| 2 | ^\w+$ |
+----+-------+
1 row in set (0.001 sec)
MariaDB [pcre2]> select * from pcre_table where '123' regexp pcre;
+----+-------+
| id | pcre |
+----+-------+
| 1 | ^\d+$ |
| 2 | ^\w+$ |
+----+-------+
2 rows in set (0.001 sec)
MariaDB [pcre2]>
※ 「\w」は英数字なので両方にヒットする。
もしも分類したい場合は、テーブルにキーとなる項目を追加すれば良い。
- MariaDB でのハッシュ
もしもハッシュをデータベースの様に使用している場合は、そのままデータを DB に格納すれば問題はないハズだ。
暗号化や複合化をする場合には、ココの関数が参考になる。
「Encryption, Hashing and Compression Functions」
ENCRYPT や ENCOE が暗号化、DECRYOT や DECODE が複合化だ。
- 暗号化と複合家のテスト
MariaDB [pcre2]> select AES_ENCRYPT( ‘Target String’, ‘encrypt keyword’ );
+—————————————————+
| AES_ENCRYPT( ‘Target String’, ‘encrypt keyword’ ) |
+—————————————————+
| =�ɷ�L�����q, |
+—————————————————+
1 row in set (0.000 sec)
MariaDB [pcre2]> select AES_DECRYPT( AES_ENCRYPT( ‘Target String’, ‘encrypt keyword’ ), ‘encrypt keyword’ );
+————————————————————————————-+
| AES_DECRYPT( AES_ENCRYPT( ‘Target String’, ‘encrypt keyword’ ), ‘encrypt keyword’ ) |
+————————————————————————————-+
| Target String |
+————————————————————————————-+
1 row in set (0.000 sec)
MariaDB [pcre2]>
ここでは AES (Advanced Encryption Standard) による暗号化と複合化を行ってみた。
AES_ENCRYPT()、AES_DECRYPT() の1番目の引数は対象文字列、2番目の引数は暗号化/複合化を行う場合の鍵となる文字列だ。
以上の様に、拡張正規表現、ハッシュ、暗号化は MariaDB で問題なく行える。
この機能を利用して、MariaDB で一括管理が行えるハズだ。