Estou gerando uma chave e preciso armazená-la no banco de dados, então eu a converto em uma String, mas para recuperar a chave da String. Quais são as maneiras possíveis de fazer isso?
Meu código é,
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
Como posso obter a chave de volta da String?
java
string
encryption
Princeyesuraj
fonte
fonte
String
instâncias em Java enquanto objetos-chave e matrizes de bytes podem ser limpos. Isso significa que as chaves podem ficar disponíveis na memória por um longo período de tempo. Usar um (protegido por senha)KeyStore
, preferencialmente um apoiado pelo sistema de tempo de execução / SO ou mesmo hardware deve ser preferido.Respostas:
Você pode converter o
SecretKey
em uma matriz de bytes (byte[]
) e, em seguida, em Base64 codificá-lo em umString
. Para converter de volta para aSecretKey
, Base64 decodifique a String e use-aSecretKeySpec
para reconstruir o originalSecretKey
.Para Java 8
SecretKey to String:
String para SecretKey:
Para Java 7 e anterior (incluindo Android):
NOTA I: você pode pular a parte de codificação / decodificação Base64 e apenas armazená-la
byte[]
no SQLite. Dito isso, realizar a codificação / decodificação Base64 não é uma operação cara e você pode armazenar strings em quase qualquer banco de dados sem problemas.NOTA II: As versões anteriores do Java não incluem um Base64 em um dos pacotes
java.lang
oujava.util
. No entanto, é possível usar codecs do Apache Commons Codec , Bouncy Castle ou Guava .SecretKey to String:
String para SecretKey:
fonte
Para mostrar como é divertido criar algumas funções que falham rapidamente , escrevi as três funções a seguir.
Um cria uma chave AES, outro a codifica e outro a decodifica de volta. Esses três métodos podem ser usados com Java 8 (sem dependência de classes internas ou externas):
fonte
getEncoded()
não esteja disponível).Na verdade, o que Luis propôs não funcionou para mim. Eu tive que descobrir outra maneira. Isso é o que me ajudou. Pode te ajudar também. Links:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Informações do codificador: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Informações do decodificador: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Snippets de código: para codificação:
Para decodificar:
fonte
Você não quer usar
.toString()
.Observe que SecretKey herda de java.security.Key, que por sua vez herda de Serializable. Portanto, a chave aqui (sem trocadilhos) é serializar a chave em um ByteArrayOutputStream, obter o array byte [] e armazená-lo no banco de dados. O processo inverso seria retirar o array byte [] do banco de dados, criar um ByteArrayInputStream offf do array byte [] e desserializar o SecretKey dele ...
... ou ainda mais simples, basta usar o
.getEncoded()
método herdado de java.security.Key (que é uma interface pai de SecretKey). Este método retorna o array codificado byte [] de Key / SecretKey, que você pode armazenar ou recuperar do banco de dados.Isso tudo presumindo que sua implementação de SecretKey suporta codificação. Caso contrário,
getEncoded()
retornará nulo.editar:
Você deve olhar para os javadocs Key / SecretKey (disponíveis no início de uma página do Google):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
Ou isto do CodeRanch (também encontrado com a mesma pesquisa do Google):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
fonte
Convertendo SecretKeySpec em String e vice-versa: você pode usar o
getEncoded()
método emSecretKeySpec
que darábyteArray
, a partir do qual você pode usarencodeToString()
para obterstring
o valor deSecretKeySpec
noBase64
objeto.Ao converter
SecretKeySpec
paraString
: usedecode()
inBase64
darábyteArray
, a partir disso você pode criar uma instância paraSecretKeySpec
com os parâmetros como obyteArray
para reproduzir o seuSecretKeySpec
.fonte
tente fazer isso, ele funciona sem Base64 (que está incluído apenas no JDK 1.8), este código é executado também na versão anterior do java :)
fonte