1.Java暗号化拡張機能による暗号
1.2.4 パスワードベース暗号化(PBE)方式
パスワードベース暗号化方式による暗号化の方法(PKCS#5で規定されています)を説明します。
パスワードベース暗号化では、秘密鍵生成のパラメータとしてパスワードの他にソルト値とイテレーションカウント値を指定します。ソルト値は、それをパスワードに加えることで、同じ鍵が生成されないようにしてアタッカーによる秘密鍵(またはパスワード)の推測を難しくするためのものです。また、イテレーションカウント値は、パスワードから秘密鍵を生成する際の計算回数を指定するものです。これによってアタッカーは秘密鍵を推測するために、この回数試行しなければならなくなります。規定は、このイテレーションカウント値を1000以上にするよう推奨しています。
復号の際は、同じパスワードと同じソルト値そして同じイテレーションカウント値から秘密鍵を生成します。そして、その秘密鍵を使ってChiperで復号します。
以下に"PBEWithMD5AndDES"による暗号化のコードを記します。その他の暗号化アルゴリズムは、1.2.1の暗号化準備を参照してください。他の暗号化アルゴリズムによるサンプルは、こちらです。
パスワードベース暗号化では、秘密鍵生成のパラメータとしてパスワードの他にソルト値とイテレーションカウント値を指定します。ソルト値は、それをパスワードに加えることで、同じ鍵が生成されないようにしてアタッカーによる秘密鍵(またはパスワード)の推測を難しくするためのものです。また、イテレーションカウント値は、パスワードから秘密鍵を生成する際の計算回数を指定するものです。これによってアタッカーは秘密鍵を推測するために、この回数試行しなければならなくなります。規定は、このイテレーションカウント値を1000以上にするよう推奨しています。
復号の際は、同じパスワードと同じソルト値そして同じイテレーションカウント値から秘密鍵を生成します。そして、その秘密鍵を使ってChiperで復号します。
以下に"PBEWithMD5AndDES"による暗号化のコードを記します。その他の暗号化アルゴリズムは、1.2.1の暗号化準備を参照してください。他の暗号化アルゴリズムによるサンプルは、こちらです。
import javax.crypto.*; import javax.crypto.spec.*; public class CipherPasswordBase { public static void main(String[] args) throws Exception { PBEKeySpec pbeKeySpec; PBEParameterSpec pbeParamSpec; SecretKeyFactory keyFac; SecretKey pbeKey; Cipher pbeCipher; // ソルト値 byte[] salt = {(byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c, (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99}; // イテレーションカウント値 int count = 2048; /* * 暗号化 */ // (1)PBE パラメータ生成 pbeParamSpec = new PBEParameterSpec(salt, count); // (2)パスワードから秘密鍵を生成 char[] password = "This is the password".toCharArray(); pbeKeySpec = new PBEKeySpec(password); Arrays.fill(password, (char)0x00); // セキュリティ情報を上書き削除する keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); pbeKey = keyFac.generateSecret(pbeKeySpec); // (3)暗号化準備 pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec); // クリアテキスト byte[] cleartext = "This is an example.".getBytes(); // (4)暗号化 byte[] ciphertext = pbeCipher.doFinal(cleartext); /* * 復号 */ // (5)PBEパラメータを新たに生成 PBEParameterSpec pbeParamSpecDec = new PBEParameterSpec(salt, count); // (6)復号用の秘密鍵を生成 char[] pswd = "This is the password".toCharArray(); PBEKeySpec pbeKeySpecDec = new PBEKeySpec(pswd); Arrays.fill(pswd, (char)0x00); // セキュリティ情報を上書き削除する SecretKeyFactory keyFacDec = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey pbeKeyDec = keyFacDec.generateSecret(pbeKeySpecDec); // (7)復号準備 Cipher cDec = Cipher.getInstance("PBEWithMD5AndDES"); cDec.init(Cipher.DECRYPT_MODE, pbeKeyDec, pbeParamSpecDec); // (8)復号 byte[] output = cDec.doFinal(ciphertext); String outStr = new String(output); System.out.println("The data is \"" + outStr + "\""); } }
このサンプルでは、暗号化と復号ではそれぞれに秘密鍵を生成しています。
(1)PBEパラメータ生成
先に準備した、ソルト値とイテレーションカウント値からPBEのパラメータ仕様を生成します。
(2)パスワードから秘密鍵を生成
まず、パスワードから鍵仕様(PBEKeySpac)を生成します。次に、鍵仕様を秘密鍵に変換するためにファクトリを生成します。ファクトリは、引数に変換アルゴリズムを指定してgetInstance( )のコールで生成します。そして、このファクトリで鍵仕様を秘密鍵に変換します。
(3)暗号化準備
Cipherのインスタンスを生成して、暗号化用に初期化します。初期化の際には、秘密鍵と共に鍵パラメータを渡します。
(4)暗号します
CipherインスタンスのdoFinal( )にクリアテキストを渡してコールすると、暗号データが返されます。
(5)PBEパラメータを新たに生成します
このサンプルでは、復号用にPBEパラメータを新たに生成します。
(6)復号用の秘密鍵を生成します
秘密鍵を暗号化と同じ方法で新たに生成します。
(7)復号準備
復号用にCipherを生成し、秘密鍵と鍵パラメータで復号用に初期化します。 (8)復号
初期化したCipherのdoFinal()メソッドを暗号データと共にコールすると、復号されたデータが返されます。
(1)PBEパラメータ生成
先に準備した、ソルト値とイテレーションカウント値からPBEのパラメータ仕様を生成します。
(2)パスワードから秘密鍵を生成
まず、パスワードから鍵仕様(PBEKeySpac)を生成します。次に、鍵仕様を秘密鍵に変換するためにファクトリを生成します。ファクトリは、引数に変換アルゴリズムを指定してgetInstance( )のコールで生成します。そして、このファクトリで鍵仕様を秘密鍵に変換します。
(3)暗号化準備
Cipherのインスタンスを生成して、暗号化用に初期化します。初期化の際には、秘密鍵と共に鍵パラメータを渡します。
(4)暗号します
CipherインスタンスのdoFinal( )にクリアテキストを渡してコールすると、暗号データが返されます。
(5)PBEパラメータを新たに生成します
このサンプルでは、復号用にPBEパラメータを新たに生成します。
(6)復号用の秘密鍵を生成します
秘密鍵を暗号化と同じ方法で新たに生成します。
(7)復号準備
復号用にCipherを生成し、秘密鍵と鍵パラメータで復号用に初期化します。 (8)復号
初期化したCipherのdoFinal()メソッドを暗号データと共にコールすると、復号されたデータが返されます。
前のページ[http://www.trustss.co.jp/Java/JEncrypt123.html] <<<
>>> 総合目次[http://www.trustss.co.jp/smnIndex.html]
>>> 総合目次[http://www.trustss.co.jp/smnIndex.html]
ご質問・ご要望
ご質問やご要望をお送りください。(匿名でも送信ください。ご質問やご要望内容は、公表しません。)
ご協力をお願いします、この記事は役に立ちましたか? | |
ご質問・ご要望 | |
メールアドレス | |
(記載の会社名および製品名は、各社の登録商標および商標です。)