秘密鍵を文字列に変換する、またはその逆の変換 質問する

秘密鍵を文字列に変換する、またはその逆の変換 質問する

キーを生成して 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");

おすすめ記事