キーを生成して DB に保存する必要があるため、キーを文字列に変換しますが、文字列からキーを取得します。これを実現するにはどのような方法がありますか?
私のコードは、
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
文字列からキーを取り戻すにはどうすればいいでしょうか?
ベストアンサー1
SecretKey
をバイト配列 ( ) に変換しbyte[]
、それを に Base64 エンコードすることができますString
。 に戻すにはSecretKey
、文字列を Base64 デコードし、それを で使用してSecretKeySpec
元の を再構築しますSecretKey
。
Java 8の場合
SecretKey から文字列へ:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
文字列を SecretKey に変換:
// decode the base64 encoded string
byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
// rebuild key using SecretKeySpec
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
Java 7 以前 (Android を含む) の場合:
注I:Base64 エンコード/デコード部分をスキップして、byte[]
SQLite に保存することもできます。とはいえ、Base64 エンコード/デコードの実行はコストのかかる操作ではなく、ほとんどすべての DB に問題なく文字列を保存できます。
注 II:java.lang
以前のJavaバージョンでは、またはパッケージのいずれにもBase64は含まれていませんjava.util
。ただし、Apache Commons コーデック、弾む城またはグアバ。
SecretKey から文字列へ:
// CREATE NEW KEY
// GET ENCODED VERSION OF KEY (THIS CAN BE STORED IN A DB)
SecretKey secretKey;
String stringKey;
try {secretKey = KeyGenerator.getInstance("AES").generateKey();}
catch (NoSuchAlgorithmException e) {/* LOG YOUR EXCEPTION */}
if (secretKey != null) {stringKey = Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT)}
文字列を SecretKey に変換:
// DECODE YOUR BASE64 STRING
// REBUILD KEY USING SecretKeySpec
byte[] encodedKey = Base64.decode(stringKey, Base64.DEFAULT);
SecretKey originalKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");