データベース内のカラムを暗号化する場合は、ENCRYPT 関数を使用します。ENCRYPT 関数は、同じ AES の強力な暗号化アルゴリズムを使用します。このアルゴリズムはデータベースの暗号化用に使用され、その関数に渡される値を暗号化します。
ENCRYPT 関数のキーは、大文字と小文字を区別しないデータベース内であっても、大文字と小文字が区別されます。ほとんどのパスワードと同様、最善の方法は、簡単には推測できないキー値を選択することです。キーには最低でも 16 文字の値を選択し、大文字と小文字、数字、文字、特殊文字を組み合わせて使用することをおすすめします。このキーは、データを復号化するたびに指定する必要があります。
強力な暗号化が適用されたデータベースの場合、キーのコピーは必ず安全な場所に保管してください。暗号化キーがわからなくなった場合は、Sybase 製品の保守契約を結んでいるサポート・センタに依頼してもデータにはアクセスできません。アクセスできなくなったデータベースは、廃棄して、新しくデータベースを作成する必要があります。
暗号化された値は、DECRYPT 関数で復号化できます。このとき、ENCRYPT 関数で指定したキーと同じキーを使用する必要があります。これらの関数はともに LONG BINARY 値を返します。異なるデータ型を使用する必要がある場合は、CAST 関数を使用して、その値を必要なデータ型に変換できます。次の例では、CAST 関数を使用して、復号化された値を必要なデータ型に変換する方法を示します。CAST 関数 [データ型変換]を参照してください。
データベース・ユーザが復号化された形式のデータにアクセスする必要があっても、暗号化キーにはアクセスできないようにする必要がある場合は、DECRYPT 関数を使用するビューを作成できます。これにより、ユーザは暗号化キーを知らなくても、復号化されたデータにアクセスできるようになります。テーブルを使用したビューまたはストアド・プロシージャを作成する場合は、ALTER VIEW 文や ALTER PROCEDURES 文の SET HIDDEN パラメータを使用して、ユーザがビュー定義やプロシージャ定義を参照することによって暗号化キーにアクセスできないようにすることができます。ALTER PROCEDURE 文とALTER VIEW 文を参照してください。
次の例では、user_info というテーブルのパスワードを格納するカラムを暗号化するトリガを使用します。user_info テーブルは、次のように定義されています。
CREATE TABLE user_info ( employee_ID INTEGER NOT NULL PRIMARY KEY, user_name CHAR(80), user_pwd CHAR(80) ); |
新しいユーザが追加されたとき、または既存のユーザのパスワードが更新されたときに、2 つのトリガが user_pwd カラムの値を暗号化するためにデータベースに追加されます。
encrypt_new_user_pwd トリガは、新しいローが user_info テーブルに追加されるたびに実行されます。
CREATE TRIGGER encrypt_new_user_pwd BEFORE INSERT ON user_info REFERENCING NEW AS new_pwd FOR EACH ROW BEGIN SET new_pwd.user_pwd=ENCRYPT(new_pwd.user_pwd, '8U3dkA'); END; |
encrypt_updated_pwd トリガは、user_info テーブルの user_pwd カラムが更新されるたびに実行されます。
CREATE TRIGGER encrypt_updated_pwd BEFORE UPDATE OF user_pwd ON user_info REFERENCING NEW AS new_pwd FOR EACH ROW BEGIN SET new_pwd.user_pwd=ENCRYPT(new_pwd.user_pwd, '8U3dkA'); END; |
データベースに新しいユーザを追加する場合
INSERT INTO user_info VALUES ( '1', 'd_williamson', 'abc123'); |
SELECT 文を発行して user_info テーブルの情報を表示する場合、user_pwd カラムの値はバイナリ・データ (パスワードの暗号化された形式) であり、INSERT 文で指定された値 abc123 ではありません。
このユーザがパスワードを変更した場合
UPDATE user_info SET user_pwd='xyz' WHERE employee_ID='1'; |
encrypt_updated_pwd トリガが実行され、新しいパスワードの暗号化された形式が user_pwd カラムに表示されます。
元のパスワードは、次の SQL 文を発行して検索できます。この文はデータを復号化するために DECRYPT 関数と暗号化キーを使用し、値を LONG BINARY から CHAR 型に変換するために CAST 関数を使用しています。
SELECT CAST ( DECRYPT( user_pwd, '8U3dkA' ) AS CHAR(100)) FROM user_info WHERE employee_ID = '1'; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |