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]
ご質問・ご要望
ご質問やご要望をお送りください。(匿名でも送信ください。ご質問やご要望内容は、公表しません。)
| ご協力をお願いします、この記事は役に立ちましたか? | |
| ご質問・ご要望 | |
| メールアドレス | |
(記載の会社名および製品名は、各社の登録商標および商標です。)