Estoy generando una clave y necesito almacenarla en DB, así que la convierto en una Cadena, pero para recuperar la clave de la Cadena. ¿Cuáles son las posibles formas de lograr esto?
Mi código es
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
¿Cómo puedo recuperar la llave del String?
java
string
encryption
Princeyesuraj
fuente
fuente
String
instancias en Java, mientras que los objetos clave y las matrices de bytes pueden borrarse. Esto significa que las claves podrían permanecer disponibles en la memoria durante un período de tiempo más largo.KeyStore
Se debe preferir el uso de un (protegido por contraseña) , preferiblemente uno respaldado por el sistema de ejecución / SO o incluso el hardware.Respuestas:
Puede convertir el
SecretKey
en una matriz de bytes (byte[]
), luego en Base64 codificarlo en unString
. Para volver a convertir a aSecretKey
, Base64 decodifica la cadena y úsala en aSecretKeySpec
para reconstruir tu originalSecretKey
.Para Java 8
Clave secreta a cadena:
Cadena a SecretKey:
Para Java 7 y versiones anteriores (incluido Android):
NOTA I: puede omitir la parte de codificación / decodificación Base64 y simplemente almacenar el
byte[]
archivo en SQLite. Dicho esto, realizar la codificación / decodificación Base64 no es una operación costosa y puede almacenar cadenas en casi cualquier base de datos sin problemas.NOTA II: Las versiones anteriores de Java no incluyen Base64 en uno de los paquetes
java.lang
ojava.util
. Sin embargo, es posible utilizar códecs de Apache Commons Codec , Bouncy Castle o Guava .Clave secreta a cadena:
Cadena a SecretKey:
fuente
Para mostrar lo divertido que es crear algunas funciones que fallan rápido , he escrito las siguientes 3 funciones.
Uno crea una clave AES, uno la codifica y otra la decodifica. Estos tres métodos se pueden usar con Java 8 (sin dependencia de clases internas o dependencias externas):
fuente
getEncoded()
no esté disponible).En realidad lo que me propuso Luis no me funcionó. Tuve que encontrar otra forma. Eso es lo que me ayudó. Podría ayudarte también. Enlaces:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Información del codificador: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Información del decodificador: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Fragmentos de código: para codificar:
Para decodificar:
fuente
No quieres usar
.toString()
.Tenga en cuenta que SecretKey hereda de java.security.Key, que a su vez hereda de Serializable. Entonces, la clave aquí (sin juego de palabras) es serializar la clave en un ByteArrayOutputStream, obtener la matriz de bytes [] y almacenarla en la base de datos. El proceso inverso sería sacar la matriz de bytes [] de la base de datos, crear un ByteArrayInputStream de la matriz de bytes [] y deserializar la SecretKey de ella ...
... o incluso más simple, simplemente use el
.getEncoded()
método heredado de java.security.Key (que es una interfaz principal de SecretKey). Este método devuelve la matriz de bytes codificada [] de Key / SecretKey, que puede almacenar o recuperar de la base de datos.Todo esto es asumiendo que su implementación de SecretKey admite la codificación. De otra manera,
getEncoded()
devolverá nulo.editar:
Debe mirar los javadocs Key / SecretKey (disponibles justo al comienzo de una página de Google):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
O esto de CodeRanch (también encontrado con la misma búsqueda de Google):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
fuente
Conversión de SecretKeySpec a String y viceversa: puede usar el
getEncoded()
método en elSecretKeySpec
que darábyteArray
, a partir del cual puede usarencodeToString()
para obtener elstring
valor deSecretKeySpec
enBase64
objeto.Al convertir
SecretKeySpec
aString
: usedecode()
inBase64
darábyteArray
, a partir de eso puede crear una instancia paraSecretKeySpec
con los parámetros comobyteArray
para reproducir suSecretKeySpec
.fuente
intente esto, funciona sin Base64 (que se incluye solo en JDK 1.8), este código se ejecuta también en la versión anterior de Java :)
fuente