AnalyticDB for PostgreSQLは、暗号化と復号化のための組み込みのpgcryito拡張機能を提供し、SM4暗号化アルゴリズムをpgcryito拡張機能に統合します。 pgcrypto拡張機能を使用すると、暗号化された列を保存でき、機密データをさらに保護します。 このように、データベース内の暗号化データはキーなしでは取得できません。
使用上の注意
pgcrypto拡張機能はデータベースサーバー内で実行されます。 すべてのデータとパスワードは、データベースサーバーとクライアント間で平文で転送されます。 最適なセキュリティを確保するために、クライアントとAnalyticDB for PostgreSQLインスタンス間にSSL接続を確立することを推奨します。
pgcrypto拡張機能をインストールする
AnalyticDB for PostgreSQLインスタンスでpgcryptoto拡張機能を使用する前に、インスタンスの [拡張機能] ページにpgcryptoto拡張機能をインストールします。 詳細については、「拡張機能のインストール、更新、およびアンインストール」をご参照ください。
一般的なハッシュ関数
digest() 関数は、さまざまなアルゴリズムに基づいてデータのバイナリハッシュ値を計算するために使用されます。
構文
digest(data text, type text) returns bytea
digest(data bytea, type text) returns byteaを返します
data: バイナリハッシュ値を計算する生データ。type: 暗号化アルゴリズム。 有効な値: MD5、SHA1、SHA224、SHA256、SHA384、およびSHA512。
例
digest() 関数を使用して、ADBPG文字列に対してSHA256暗号化を実行します。
SELECT digest('ADBPG','sha256');サンプル結果:
digest
--------------------------------------------------------------------
\x2d0525fa98e83619424dc1303ba107c59aabb389bbe94ceef885c742088560bc
(1 row)パスワードハッシュ関数
crypt() およびgen_salt() 関数は、パスワードをハッシュするように設計されています。 crypt() 関数はハッシュを実行してデータを暗号化し、gen_salt() 関数はcrypt() 関数のsalt値を生成してソルトハッシュを生成します。
crypt() 関数で使用されるアルゴリズムは、次の点で一般的なMD5およびSHA1ハッシュアルゴリズムとは異なります。
crypt()関数で使用されるアルゴリズムは、パスワードを暗号化するために長い時間を必要とする。 ほとんどの場合、パスワードの長さは短く、crypt()関数は複雑な暗号化アルゴリズムのみを使用して、パスワードの復号化の難しさを高めます。crypt()関数はランダムなsalt値を使用して、同じパスワードを持つユーザーが異なる暗号文パスワードを取得できるようにします。 これは、アルゴリズムのクラッキングに対する追加の防御である。crypt()関数は、結果のアルゴリズムの型を返します。 さまざまな種類のアルゴリズムを使用して、ユーザーごとにパスワードを暗号化できます。crypt()関数で使用される特定のアルゴリズムは適応型です。 コンピュータのパフォーマンスが向上すると、既存のパスワードとの非互換性なしにアルゴリズムを遅くすることができます。
crypt() 関数でサポートされているアルゴリズム
アルゴリズム | 最大パスワード長 | アダプティブ | 塩ビット | 出力長さ | 説明 |
BF | 72 | 継続する | 128 | 60 | Blowfish-2aと呼ばれるBlowfishアルゴリズムの変形。 |
MD5 | 無制限 | 継続しない | 48 | 34 | MD5-based暗号化アルゴリズム。 |
XDES | 8 | 継続する | 24 | 中国 (深セン) の Enterprise Edition トランジットルーターへ 20 GB の | 拡張されたデータ暗号化標準 (DES) アルゴリズム。 |
DES | 8 | 継続しない | 12 | 13 | ネイティブUNIX暗号化アルゴリズム。 |
crypt() 構文
crypt(password text, salt text) returns text crypt() 関数は、パスワード文字列のハッシュ値を返すために使用されます。 saltパラメーターはgen_salt() 関数によって生成されます。 同じパスワード文字列に対して、gen_salt() 関数は毎回異なるsalt値を生成するため、crypt() 関数は異なる結果を返します。 パスワードを確認すると、以前のハッシュ結果をsalt値として使用できます。
crypt() の例
例1:
crypt()関数を使用してパスワードを設定します。UPDATE ... SET pswhash = crypt('my_password', gen_salt('md5'));例2: パスワードハッシュ値を比較して、パスワードが正しいかどうかを確認します。
SELECT (pswhash = crypt('entered password', pswhash)) AS pswmatch FROM ... ;入力されたパスワードが正しい場合、trueが返されます。
gen_salt() 構文
gen_salt(type text [, iter_count integer ]) returns text gen_salt() 関数は、crypt() 関数で使用するランダムなsalt文字列を生成するために使用されます。 salt文字列は、crypt() 関数で使用されるアルゴリズムも決定します。
type: ハッシュアルゴリズム。 有効な値: DES、XDES、MD5、およびBF。
iter_count: 反復回数。 XDESおよびBFアルゴリズムの場合、より高いカウントは、パスワードをハッシュし、解読するためのより多くの時間を示す。
gen_salt() の例
SELECT gen_salt('des'), gen_salt('xdes'), gen_salt('md5'), gen_salt('bf');サンプル結果:
gen_salt | gen_salt | gen_salt | gen_salt
----------+-----------+-------------+-------------------------------
qh | _J9..uEUi | $1$SNgqyKAi | $2a$06$B/Etc3J8zYBV49LrDU97MO
(1 row)PGP暗号化関数
AnalyticDB for PostgreSQLは、OpenPGP (RFC 4880) 標準を実装しています。 対称暗号化と非対称暗号化がサポートされています。
pgp_sym_encrypt()
pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea
pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea を返します
pgp_sym_encrypt() 関数は、対称のPretty Good Privacy (PGP) キーを使用してデータを暗号化するために使用されます。
data: 暗号化されるデータ。psw: 対称PGPキー。options: オプション設定。
pgp_sym_decrypt()
pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text
pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea を返します
pgp_sym_decrypt() 関数は、対称鍵暗号化メッセージを復号するために使用されます。
msg: 復号化されるメッセージ。psw: 対称PGPキー。options: オプション設定。
pgp_sym_decrypt関数を使用してBYTEAデータを復号することはできません。 これにより、無効な文字データの出力が回避される。 pgp_sym_decryp_bytea関数を使用して、元のテキストデータを復号できます。
pgp_pub_encrypt()
pgp_pub_encrypt(data text, key bytea [, options text ]) returns bytea
pgp_pub_encrypt_bytea(data bytea, key bytea [, options text ]) returns bytea を返します
pgp_pub_encrypt() 関数は、パブリックPGPキーを使用してデータを暗号化するために使用されます。
data: 暗号化されるデータ。key: パブリックPGPキー。 秘密鍵を指定すると、エラーメッセージが返されます。options: オプション設定。
pgp_pub_decrypt()
pgp_pub_decrypt(msg bytea, key bytea [, psw text [, options text ]]) returns text
pgp_pub_decrypt_bytea(msg bytea, key bytea [, psw text [, options text ]]) returns bytea を返します。
pgp_pub_decrypt() 関数は、公開鍵で暗号化されたメッセージを復号化するために使用されます。
msg: 復号化されるメッセージ。key: データの暗号化に使用される公開鍵に対応する秘密鍵。 秘密鍵がパスワードで保護されている場合は、pswでパスワードを指定します。 パスワードがないのにオプションを指定する場合は、空のパスワードを指定します。
pgp_pub_decrypt関数を使用してBYTEAデータを復号することはできません。 これにより、無効な文字データの出力が回避される。 pgp_pub_decryp_bytea関数を使用して、元のテキストデータを復号できます。
ランダムデータ関数
gen_random_bytes()
gen_random_bytes(count integer) returns bytea gen_random_bytes() 関数は、暗号的に強いランダムバイトを返すために使用されます。
count: 返されるバイト数。 有効な値: 1 ~ 1024
例:
SELECT gen_random_bytes(16);サンプル結果:
gen_random_bytes
------------------------------------
\x1f1eddc11153afdde0f9e1229f8f4caf
(1 row)gen_random_uuid()
gen_random_uuid() 関数は、バージョン4 (ランダム) UUIDを返すために使用されます。
例:
SELECT gen_random_uuid();サンプル結果:
gen_random_uuid
--------------------------------------
2bd664a2-b760-4859-8af6-8d09ccc5b830SM4暗号化アルゴリズム
情報セキュリティでは、ログオンパスワード、クレジットカード番号、IDカード番号など、データベースに保存されている機密情報を暗号化する必要があります。 pgcrypto拡張は、さまざまな一方向および双方向の暗号化アルゴリズムを提供します。
一方向暗号化アルゴリズム: 平文データは暗号文データから復号できません。 この非可逆暗号化アルゴリズムは、ログオンパスワード検証などのデータ検証に適しています。
双方向暗号化アルゴリズム: 平文データは、鍵に基づいて暗号文データから復号化できます。 この可逆暗号化アルゴリズムは、電子決済やデジタル署名などのシナリオでデータ送信を保護するのに適しています。
AnalyticDB for PostgreSQLはSM4暗号化アルゴリズムをサポートしています。 SM4は、双方向暗号化アルゴリズムである。 このアルゴリズムを使用する場合は、データベースサーバー上のデータを暗号化するためのキーを提供する必要があります。
SM4暗号化アルゴリズムは、TEXTおよびVARCHARデータ型のみをサポートします。 開発者は、暗号化するデータを文字列に変換してから暗号化する必要があります。
SM4暗号化アルゴリズムは、AnalyticDB for PostgreSQL V6.3.8.9以降でのみサポートされます。 AnalyticDB For PostgreSQLインスタンスのマイナーバージョンを表示する方法については、「インスタンスのマイナーバージョンの表示」をご参照ください。
インストール
AnalyticDB for PostgreSQLインスタンスでSM4暗号化アルゴリズムを使用する前に、インスタンスの [拡張機能] ページにpgcryptoto拡張機能をインストールします。 詳細については、「拡張機能のインストール、更新、およびアンインストール」をご参照ください。
暗号化
SM4関数は、次の構文を使用してキーフィールドを暗号化します。
-- Encrypt TEXT data.
sm4_encrypt_text(<data text>, <password text>)
-- Encrypt VARCHAR data.
sm4_encrypt_varchar(<data varchar>, <password text>)下表に、各パラメーターを説明します。
パラメーター | 説明 |
| 暗号化するTEXTデータ。 |
| 暗号化するVARCHARデータ。 |
| 暗号化キー (TEXT形式) 。 |
例1: 暗号化キー
キーでwho am iテキストフィールドを暗号化します。SELECT sm4_encrypt_text('who am i','key');暗号化されたフィールドの値はBYTEA形式です。 サンプル結果:
sm4_encrypt_text ------------------------------------ \x308b71cc7fa0de7d720b2c394a3a83c2 (1 row)例2: SM4関数を使用して、
t_plainテーブルのデータを暗号文データに変換し、そのデータをt_encテーブルに挿入します。-- DROP EXTENSION encdb; CREATE TABLE t_plain( id int, name varchar(20), introduction text ) distributed BY (id); INSERT INTO t_plain VALUES (1, 11, 'aaa'); CREATE TABLE t_enc( id int, name varchar(20), introduction bytea ) distributed by (id); INSERT INTO t_enc SELECT id ,name, sm4_encrypt_text(introduction,'passwd') FROM t_plain; SELECT * FROM t_enc;導入フィールドの値は暗号化されている。 サンプル結果:
id | name | introduction ----+------+------------------------------------ 1 | 11 | \x0ca8e6c45a83e98efe99dcde0510930e (1 row)
解読
SM4関数は、次の構文を使用して暗号化フィールドを復号します。
-- Decrypt TEXT data.
sm4_decrypt_text(data bytea, password text)
-- Decrypt VARCHAR data.
sm4_decrypt_varchar(data bytea, password text)下表に、各パラメーターを説明します。
パラメーター | 説明 |
| 復号化されるBYTEAデータ。 |
| 暗号化キー (TEXT形式) 。 |
例1: 上記の暗号化されたフィールドを復号化します。
SELECT sm4_decrypt_text('\x308b71cc7fa0de7d720b2c394a3a83c2'::bytea, 'key');暗号化されたフィールドは、
who am iに復号化される。 サンプル結果:sm4_decrypt_text ------------------ who am i (1 row)例2: SM4関数を使用して、
t_encテーブルを復号化およびクエリします。SELECT id, name, sm4_decrypt_text(introduction,'passwd') FROM t_enc;導入フィールドの値が解読される。 サンプル結果:
id | name | sm4_decrypt_text ----+------+------------------ 1 | 11 | aaa (1 row)
関連ドキュメント
pgcryptoの詳細については、「postgresql」をご参照ください。