データの暗号化は、機密性を確保するために現在のデータとアーカイブされたデータを保護する方法であるため、非常に重要です。これにより、不正アクセスや不正使用を防ぎます。この記事では、データの暗号化と復号化のいくつかの重要な側面について簡単に説明します。
暗号化システム
暗号化システムには、2つの主要なコンポーネントがあります。暗号化アルゴリズム これは、値と暗号化キーを変更するために使用される方法です。 、そのセキュリティは暗号化されたデータの脆弱性に依存します。
Oracleは、次の2種類の暗号化アルゴリズムをサポートしています。対称アルゴリズム (データの暗号化と復号化に同じキーを使用)保存されたデータの暗号化と非対称アルゴリズム (2つのキーが生成されます:復号化に使用される秘密キーと、メッセージを暗号化するためにメッセージ送信者によって使用される公開キー)データベースログインおよびデータベースとクライアント間の通信に使用されます。
Oracleで利用可能な対称暗号化アルゴリズムは次のとおりです。データ暗号化標準 ( DES )56ビットのキーを使用して、テキストの64ビットのブロックを暗号化されたテキストの64ビットに暗号化します。トリプルデータ暗号化標準 ( 3-DES )、DESのより高度なバージョン、および Advanced Encryption Standard ( AES )、128、129、または256ビットのキーを使用して、テキストの128ビットのブロックを暗号化されたテキストの128ビットに暗号化します。
上記の暗号化アルゴリズムは固定次元のブロックを使用しているため、暗号化する必要のあるテキストは、使用するアルゴリズムで必要とされる特定の次元のブロックに分割され、取得されたそれぞれにアルゴリズムが適用されます。ブロック。
ただし、データディメンションがブロックの必要なディメンションの倍数でない場合はどうなりますか? パディングテクニック ブロックの寸法に達するまでテキストの最後のセグメントを埋めるために使用する必要があります。ゼロでパディングするか、PKCS#5と呼ばれるパディングスキームを使用するかを選択できます。スキームは、最後のテキストセグメントの差を計算します
d =dim_block – dim_data MOD dim_block
欠落している各バイトを16進値0x0dで埋めます 、
ここで、 dim_block は、アルゴリズムに必要なブロックのバイト単位の次元です
欠落している各バイトを16進値0x0dで埋めます 、
ここで、 dim_block は、アルゴリズムに必要なブロックのバイト単位の次元です
ただし、プレーンテキストが暗号化される複数のブロックで構成されている場合はどうなりますか? 連鎖手法 ブロックの暗号化が前のブロックの暗号化に依存しているかどうかを確認するために使用されます。
次のタイプのチェーンは Oracleで利用可能:
- 電子コードブック (CHAIN_ECB):各ブロックは、残りのブロックから独立して暗号化されます。欠点は、テキストフラグメント内の繰り返しパターンを識別できることです。
- 暗号ブロック連鎖 (CHAIN_CBC):ブロックごとに、暗号化の前に、XOR演算子がベクトルで適用されます。シーケンスの最初のブロックでは初期化ベクトルが使用され、シーケンスの残りのブロックでは前のブロックの暗号化結果がビットのベクトルとして使用されます
- 暗号フィードバック (CHAIN_CFB):XOR演算子がブロック暗号化の後に適用されるという事実を除いて、CBCと同様です。
- 出力フィードバック (CHAIN_OFB):XOR演算子が適用される前に前のブロックの結果が暗号化されるという事実を除いて、CFBと同様です
データを暗号化および復号化するには、ORACLEで利用可能なDBMS_CRYPTOパッケージを使用できます。このパッケージを使用するには、SYSDBAは、次のコマンドを使用して、実行権限をユーザーに付与する必要があります。
GRANT EXECUTE ON dbms_crypto TO username;
暗号化については、 dbms_crypto.encrypt が使用され、次のパラメータがあります:
dbms_crypto.encrypt( clear_text IN RAW, operating_mode IN PLS_INTEGER, key IN RAW, initialization_vector IN RAW DEFAULT NULL) RETURN RAW;
復号化の場合、 dbms_crypto.decrypt が使用され、次のパラメータがあります:
dbms_crypto.decrypt( clear_text IN RAW, operating_mode IN PLS_INTEGER, key IN RAW, initialization_vector IN RAW DEFAULT NULL) RETURN RAW;
動作モードは次の要素で構成されます:
アルゴリズムコード+パディングコード+チェーンコード
データの暗号化と復号化の例を次に示します。
create or replace PROCEDURE encryption(text IN VARCHAR2, encrypted text OUT VARCHAR2) AS raw_set RAW(100); raw_password RAW(100); encryption_result RAW(100); encryption_password VARCHAR2(100) := '[email protected]%5,:QxV'; operation_mode NUMBER; BEGIN raw_set:=utl_i18n.string_to_raw(text,'AL32UTF8'); raw_password := utl_i18n.string_to_raw(encryption_password,'AL32UTF8'); operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB; encryption_result:=DBMS_CRYPTO.ENCRYPT(raw_set,operation_mode,raw_password); dbms_output.put_line(encryption_result); encryptedtext := RAWTOHEX (encryption_result); END; variable result_encryption varchar2(200) exec encryption('Text to be encrypted', :result_encryption); print result_encryption
create or replace PROCEDURE decryption (encrypted_text IN VARCHAR2, decrypted_text OUT VARCHAR2) AS raw_set RAW(100); raw_password RAW(100); decryption_result RAW(100); decryption_password VARCHAR2(100) := '[email protected]%5,:QxV'; operation_mode NUMBER; BEGIN raw_set:=HEXTORAW(encrypted_text); raw_password :=utl_i18n.string_to_raw(decryption_password,'AL32UTF8'); operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB; decryption_result:=DBMS_CRYPTO.DECRYPT(raw_set,operation_mode,raw_password); dbms_output.put_line(decryption_result); decrypted_text := utl_i18n.raw_to_char (decryption_result,'AL32UTF8'); END; variable result_decryption varchar2(200) exec decryption(:result_encryption,:result_decryption) print result_decryption
データ暗号化の課題
データの暗号化キーの管理
データベースユーザーが、暗号化アルゴリズムに必要な長さの効率的な暗号化キーを手動で生成することは困難です。文字列セットとしての暗号化キーの手動供給(次にRAWに変換)に関して、セットの長さは次の式を使用して計算されます。
L_set =Length_key_in_bits / 8(文字)
たとえば、ENCRYPT_AES128の場合、キーは128ビットで、セットの長さはL_set =128/8=16文字になります。
キー「1234567890123456」が指定されている場合は受け入れられますが、キー「1234」は例外「キーの長さが短すぎます」をスローします。
残りのアルゴリズムについて、次の表に有効なキーの長さを示します。
キーの生成と送信
暗号化に使用されるキーが安全である限り、データは安全に暗号化されます。したがって、暗号化キーを安全に生成する必要があります。 DBMS_CRYPTO関数パッケージのRANDOMBYTESは、安全な乱数生成を提供し、乱数生成アルゴリズムを実装します。開発者は、疑似乱数を生成するため、DBMS_RANDOMパッケージを使用しないでください。これにより、疑似セキュリティが発生する可能性があります。
RANDOMBYTES関数は次のように使用されます:
キーRAW(nr_bytes);
key:=DBMS_CRYPTO.randombytes(nr_bytes);
ここで、nr_bytesは暗号化キーのバイト数を表します
キーがアプリケーションからデータベースに渡されるとき、送信時に盗まれないように暗号化する必要があります。 Oracle Advanced Securityは、ネットワーク暗号化を提供します。これにより、ネットワーク転送中のデータと暗号化キーが保護されます。
キーが生成されたら、それらの開示が暗号化されたデータのセキュリティを危険にさらす可能性があるため、キーを安全に保つ必要があります。キーを保持するための3つのオプションがあります:
- データベースレベル:データベース(特別なテーブル)または外部データベースファイルに保存されます
- レコードレベル:データベースに(特別なテーブルに)保存されます
- 前の2つのタイプの組み合わせ:データベースレベルにマスターキーがあり、レコードごとにキーがあります。ハイブリッドキーは、暗号化と復号化の両方に使用されます。hybrid_key=master_key XOR record_key(XOR関数には、PL / SQL関数– UTL_RAW.bit_xorがあります)。
最も効率的なキーは何ですか?ハイブリッドキーです。データベース全体が盗まれた場合、マスターキーがファイルシステムに保存されているときにデータを復号化することはできません。マスターキーまたはキーレコードが盗まれた場合でも、残りのレコードは保護されます。
透過的データ暗号化(TDE)
オラクルが提供するもう1つのセキュリティ機能は、透明データ暗号化(TDE)です。 、Oracle10gから利用可能な機能。 TDEを使用すると、データベースのテーブルレベルで暗号化された列を宣言できます。暗号化された列にデータを挿入すると、Oracleはデータを自動的に暗号化し、その暗号化をデータベースに保存します。
SELECTクエリは、データを自動的に復号化します。 透過的なデータ暗号化を覚えておくことが重要です ユーザー間で違いはなく、誰がデータベースに問い合わせているかに関係なく、復号化されたデータを提供します。 TDEで暗号化できる列はありません。外部キー(外部キー)の列は、この方法では暗号化できません。
例:関係スキームACCOUNT(id_account#、card_series、所有者、金額)を持つACCOUNTというテーブルについて考えてみます。ここで、id_accountは主キーと見なされ、事実は「#」記号で示されます。 card_seriesを宣言したいとします。 およびバランス 暗号化する列。これは、次の方法で実行できます。
ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128'); ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');
この方法を機能させるには、ウォレットを作成して構成する必要があります。
透過的なデータ暗号化を行う理由 データベースが盗まれた場合にデータの復号化を防ぎますか?テーブルTの暗号化されたすべての列は、同じ秘密鍵Key_Tを使用します。暗号化された列を持つテーブル、、…がさらにある場合は、n個の秘密鍵Key _、…、Key_があります。各秘密鍵Key_、j =1、nは、マスター鍵Key_Masterで暗号化され、この暗号化の結果はデータディクショナリに保存されます。マスターキーは外部からウォレットに保存されます。
それでは、この自動暗号化の手順を見てみましょう。それらは:
- 外部ウォレットからマスターKey_Masterを取得する
- マスターキーを使用した秘密キーKey_の復号化
- 秘密鍵Key_を使用して挿入されるデータの暗号化
- 暗号化されたデータをテーブルの列に保存する
自動復号化の手順は次のとおりです。
- 外部ウォレットからマスターキーKey_Masterを取得する
- マスターキーを使用した秘密キーKey_の復号化
- 秘密鍵Key_を使用したデータの復号化
- 結果を返す
暗号化中のデータの整合性はどうですか?これがハッシュ手法を使用しています。
ハッシュ
データの暗号化はデータの機密性を保証しますが、データの整合性を保証するものではありません。この問題を防ぐために、元のデータのみを暗号化する必要があるという事実に加えて、ハッシュと呼ばれる手法を使用できます。 。 2つの重要な利点があります。元の値を解読できないことと、決定論的です(つまり、同じデータに繰り返し適用すると、同じ結果が生成されます)。 Oracleでは、次のハッシュアルゴリズムが許可されています:MD5およびSHA-1。
使用法:
DBMS_CRYPTO.Hash ( original_set IN RAW, operation_mode IN PLS_INTEGER) RETURN RAW; where operation_mode is either DBMS_CRYPTO.HASH_MD5 or DBMS_CRYPTO.HASH_SH1
例:
set serveroutput on DECLARE credit_card_no VARCHAR2(19) := '1234-5678-1234-5678'; credit_card_no_raw RAW(128) := utl_raw.cast_to_raw(credit_card_no); encrypted_raw RAW(2048); BEGIN encrypted_raw:=dbms_crypto.hash(credit_card_no_raw, dbms_crypto.hash_md5); dbms_output.put_line('MD5: ' || encrypted_raw); END;
インデックス付きデータの暗号化
開発者がインデックス付きデータを暗号化することはお勧めしません。列のインデックスに暗号化された値が含まれている場合、そのインデックスは簡単なチェックに使用でき、他の目的には使用できません。
たとえば、会社がデータベーステーブルに格納されている従業員番号に個人識別番号を使用するとします。明らかに、これらの番号は機密データと見なされており、会社はそれが保存されている列を暗号化したいと考えています。この列には一意の値が含まれているため、パフォーマンスを向上させるためにインデックスを実行できます。これは、インデックスに暗号化されたデータが含まれ、基本的に使用できないことを意味します。
結論
結論として、機密データを暗号化および復号化して保護することは非常に重要です。この側面を認識し、それに応じてデータベースセキュリティを実装する必要があります。
参照:
- データ暗号化を使用したアプリケーションの開発
- Feuerstein Steven(2009)Oracle PL / SQLプログラミング(第5版)。オライリー出版。 ISBN978-0-596-51446-4。第23章「アプリケーションのセキュリティとPL/SQL」
- ブロック暗号モードの操作