[解決済み] Javaでパスワードから鍵を派生させる場合、なぜSecretKeySpecが必要なのですか?
質問内容
とはどのような違いがあるのでしょうか?
SecretKey
対
SecretKeySpec
のクラスは、Javaでは?
のドキュメントは
SecretKeySpec
は言う。
バイト配列からSecretKeyを作成するのに使用することができます。
このコードでは、もし私が
secretKey.getEncoded()
または
secret.getEncoded()
を16進数で表示すると、どちらも同じ出力になります。では、なぜ
SecretKeySpec
?
final String password = "test";
int pswdIterations = 65536 ;
int keySize = 256;
byte[] ivBytes;
byte[] saltBytes = {0,1,2,3,4,5,6};
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(
password.toCharArray(),
saltBytes,
pswdIterations,
keySize
);
SecretKey secretKey = factory.generateSecret(spec);
SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES");
を両方呼び出した場合の出力は次のとおりです。
getEncoded()
:
00367171843C185C043DDFB90AA97677F11D02B629DEAFC04F935419D832E697
解決方法は?
すべての
SecretKey
には、関連するアルゴリズム名があります。このため
SecretKey
というアルゴリズムで
"DES"
を、例えばAESの鍵が必要なコンテキストで使用することができます。
あなたのコードでは、次の行で
SecretKey
:
SecretKey secretKey = factory.generateSecret(spec);
しかし、この時点では、キーは
ではなく
AESキーです。もしあなたが
secretKey.getAlgorithm()
の場合、その結果は
"PBKDF2WithHmacSHA1"
. これが実際にAESキーであることをJavaに伝える何らかの方法が必要です。
これを行う最も簡単な方法は、新しい
SecretKeySpec
オブジェクトを作成し、元のキーデータを使ってアルゴリズム名を明示的に指定します。
SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES");
注:個人的には
secret
として
SecretKey
この後、具体的な実装を気にする必要はないと思いますので。
関連
-
[解決済み】不正なエスケープ文字"㊧"について
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み] Java 256ビットAESパスワードベース暗号化機能
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み】Java Error "Exception in thread "main" java.util.InputMismatchException" Array プログラムで発生。
-
[解決済み] テスト
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。
-
[解決済み】CreateProcess error=2, The system cannot find file specified.