7. パスワードベース暗号化
2006.09.06 株式会社四次元データ 里見玲爾
パスワードベース暗号化方式(Password Base Encyption, PBE)は、入力されたパスワードを受け取ってそれをもとに鍵を生成し暗号化を行う 共通鍵暗号化アルゴリズムです。大半の実装では解読されにくくするためアルゴリズムパラメータとしてsaltとiterationというパラメータを パスワードとは別に与えます。この章ではパスワードベース暗号化方式のコード例を紹介します。
4章で解説したジェネレータによる鍵の生成ではアルゴリズム名と乱数(SecureRandom)を与えて鍵を生成していましたが、 パスワードベース暗号化方式では鍵に対してパスワードを与えることで鍵を生成する方法をとり、これにはファクトリを使います。 またパスワードベース暗号化方式はアルゴリズムパラメータを使うため、AlgorithmParameterSpec(ここではこれを 実装したPBEParameterSpec)に対してsaltとiterationのパラメータを渡しています。この章ではPBE実装の核となる部分のコード例を示します。
/* * PBE による暗号化メソッド * @param plainText 平文 * @param password PBE 用パスワード * * @return 平文を暗号化したバイト列 */ publice byte[] encrypt(String plainText, char[] password){ //saltとiterationの生成 byte[] salt = {(byte)0x39, (byte)0x4e, (byte)0xa2, (byte)0x18, (byte)0x79, (byte)0x22, (byte)0x10, (byte)0xfe}; int iteration = 10; //Cipherオブジェクトの生成 Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); //パスワードを使って鍵を生成 PBEKeySpec keySpec = new PBEKeySpec(password); Arrays.fill(password, ' '); SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFac.generateSecret(keySpec); //saltとiterationを使ってアルゴリズムパラメータを生成 PBEParameterSpec paramSpec = new PBEParameterSpec(salt, iteration); //鍵とパラメータ仕様からCipherオブジェクトを初期化して暗号化 cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); byte[] ptextByte = plainText.getBytes(); byte[] etextByte = cipher.doFinal(ptextByte); return etextByte; }
上の例は暗号化の実装コードですが、復号化の実装コードの場合でも9行目から35行目までの部分は変わりません。 復号化の場合にはCipherの初期化の際のパラメーターがCipher.DECRYPT_MODEになり、 doFinalメソッドの引数が暗号化されたバイト列に変わるだけです。
注意事項として、Stringオブジェクトは不変であるという理由からセキュリティ関連の情報の格納には適していないため、
パスワードは常にchar配列で保存し、途中でパスワードを格納した配列は使用後にArraysクラスのfillメソッドで配列を空にしています。
readPasswdメソッドでは標準入力の場合に読み込んでしまう改行をchar配列から取り除くようになっています。
saltとiterationはアルゴリズムパラメータを経由してcipherオブジェクトに渡されます。アルゴリズムパラメータの取り扱いについては9章で解説します。
上の暗号化、復号化どちらの例でも鍵を生成する処理は
PBEKeySpecオブジェクトにパスワードを渡す ↓ SecretKeyFactoryオブジェクトを生成する ↓ SecretKeyFactoryのメソッドを使ってSecretKeyを生成
となっています。これがファクトリによる鍵の生成で、次章で詳しく解説します。