Saya membuat kunci dan perlu menyimpannya di DB, jadi saya mengubahnya menjadi String, tetapi untuk mendapatkan kembali kunci dari String. Apa cara yang mungkin untuk mencapai ini?
Kode saya adalah,
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
Bagaimana saya bisa mendapatkan kembali kunci dari String?
java
string
encryption
Princeyesuraj
sumber
sumber
String
instance di Java sementara objek kunci dan array byte mungkin dihapus. Artinya, kunci dapat tetap tersedia dalam memori untuk jangka waktu yang lebih lama. Menggunakan (dilindungi kata sandi)KeyStore
, sebaiknya yang didukung oleh sistem runtime / OS atau bahkan perangkat keras harus lebih disukai.Jawaban:
Anda dapat mengonversi
SecretKey
ke array byte (byte[]
), lalu Base64 menyandikannya ke aString
. Untuk mengonversi kembali ke aSecretKey
, Base64 mendekode String dan menggunakannya di aSecretKeySpec
untuk membangun kembali aslinyaSecretKey
.Untuk Java 8
SecretKey ke String:
String ke SecretKey:
Untuk Java 7 dan sebelumnya (termasuk Android):
CATATAN I: Anda dapat melewati bagian encoding / decoding Base64 dan hanya menyimpannya
byte[]
di SQLite. Meskipun demikian, melakukan encoding / decoding Base64 bukanlah operasi yang mahal dan Anda dapat menyimpan string di hampir semua DB tanpa masalah.CATATAN II: Versi Java sebelumnya tidak menyertakan Base64 di salah satu paket
java.lang
ataujava.util
. Namun, Anda dapat menggunakan codec dari Apache Commons Codec , Bouncy Castle, atau Guava .SecretKey ke String:
String ke SecretKey:
sumber
Untuk menunjukkan betapa menyenangkannya membuat beberapa fungsi yang gagal dengan cepat, saya telah menulis 3 fungsi berikut.
Satu membuat kunci AES, satu mengkodekannya dan satu lagi mendekodekannya kembali. Ketiga metode ini dapat digunakan dengan Java 8 (tanpa ketergantungan kelas internal atau ketergantungan luar):
sumber
getEncoded()
tidak tersedia).Sebenarnya apa yang Luis usulkan tidak berhasil untukku. Saya harus mencari cara lain. Inilah yang membantu saya. Mungkin bisa membantu Anda juga. Tautan:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Informasi encoder: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Informasi decoder: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Potongan kode: Untuk encoding:
Untuk decoding:
sumber
Anda tidak ingin menggunakan
.toString()
.Perhatikan bahwa SecretKey mewarisi dari java.security.Key, yang dengan sendirinya mewarisi dari Serializable. Jadi kuncinya di sini (tidak ada permainan kata-kata) adalah untuk membuat serial kunci menjadi ByteArrayOutputStream, dapatkan array byte [] dan menyimpannya ke dalam db. Proses kebalikannya adalah untuk mendapatkan array byte [] dari db, membuat ByteArrayInputStream dari array byte [], dan deserialisasi SecretKey dari itu ...
... atau bahkan lebih sederhana, cukup gunakan
.getEncoded()
metode yang diwarisi dari java.security.Key (yang merupakan antarmuka induk dari SecretKey). Metode ini mengembalikan array byte [] yang disandikan dari Key / SecretKey, yang dapat Anda simpan atau ambil dari database.Ini semua dengan asumsi implementasi SecretKey Anda mendukung encoding. Jika tidak,
getEncoded()
akan mengembalikan null.edit:
Anda harus melihat javadocs Key / SecretKey (tersedia tepat di awal halaman google):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
Atau ini dari CodeRanch (juga ditemukan dengan pencarian google yang sama):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
sumber
Mengubah SecretKeySpec menjadi String dan sebaliknya: Anda dapat menggunakan
getEncoded()
metodeSecretKeySpec
yang akan memberibyteArray
, dari situ Anda dapat menggunakanencodeToString()
untuk mendapatkanstring
nilaiSecretKeySpec
dalamBase64
objek.Saat mengonversi
SecretKeySpec
keString
: gunakandecode()
dalamBase64
akan memberibyteArray
, dari situ Anda dapat membuat contoh untukSecretKeySpec
dengan params sebagaibyteArray
untuk mereproduksiSecretKeySpec
.sumber
coba ini, ini berfungsi tanpa Base64 (yang hanya disertakan di JDK 1.8), kode ini juga berjalan di versi java sebelumnya :)
sumber