Je génère une clé et je dois la stocker dans DB, donc je la convertis en une chaîne, mais pour récupérer la clé de la chaîne. Quels sont les moyens possibles pour y parvenir?
Mon code est,
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
Comment puis-je récupérer la clé de la chaîne?
java
string
encryption
Princeyesuraj
la source
la source
String
instances en Java tandis que les objets clés et les tableaux d'octets peuvent être effacés. Cela signifie que les clés peuvent rester disponibles dans la mémoire pendant une période de temps plus longue. L'utilisation d'un (protégé par mot de passe)KeyStore
, de préférence un supporté par le système d'exécution / OS ou même le matériel doit être préféré.Réponses:
Vous pouvez convertir le
SecretKey
en un tableau d'octets (byte[]
), puis l'encoder en Base64 en unString
. Pour reconvertir en aSecretKey
, Base64 décode la chaîne et l'utiliser dans aSecretKeySpec
pour reconstruire votre originalSecretKey
.Pour Java 8
SecretKey à String:
Chaîne à SecretKey:
Pour Java 7 et versions antérieures (y compris Android):
REMARQUE I: vous pouvez ignorer la partie encodage / décodage Base64 et simplement stocker le
byte[]
dans SQLite. Cela dit, effectuer un encodage / décodage Base64 n'est pas une opération coûteuse et vous pouvez stocker des chaînes dans presque n'importe quelle base de données sans problèmes.REMARQUE II: les versions précédentes de Java n'incluent pas de Base64 dans l'un des packages
java.lang
oujava.util
. Il est cependant possible d'utiliser des codecs d' Apache Commons Codec , Bouncy Castle ou Guava .SecretKey à String:
Chaîne à SecretKey:
la source
Pour montrer à quel point il est amusant de créer des fonctions qui échouent rapidement, j'ai écrit les 3 fonctions suivantes.
On crée une clé AES, on l'encode et on la décode. Ces trois méthodes peuvent être utilisées avec Java 8 (sans dépendance de classes internes ou de dépendances extérieures):
la source
getEncoded()
non disponible).En fait, ce que Luis a proposé n'a pas fonctionné pour moi. J'ai dû trouver un autre moyen. C'est ce qui m'a aidé. Cela pourrait vous aider aussi. Liens:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Informations sur l'encodeur: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Informations sur le décodeur: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Extraits de code: pour l'encodage:
Pour le décodage:
la source
Vous ne voulez pas utiliser
.toString()
.Notez que SecretKey hérite de java.security.Key, qui lui-même hérite de Serializable. Donc, la clé ici (sans jeu de mots) est de sérialiser la clé dans un ByteArrayOutputStream, d'obtenir le tableau byte [] et de le stocker dans la base de données. Le processus inverse consisterait à extraire le tableau d'octets [] de la base de données, à créer un ByteArrayInputStream du tableau d'octets [] et à désérialiser le SecretKey hors de celui-ci ...
... ou encore plus simple, il suffit d'utiliser la
.getEncoded()
méthode héritée de java.security.Key (qui est une interface parent de SecretKey). Cette méthode renvoie le tableau d'octets codés [] off Key / SecretKey, que vous pouvez stocker ou récupérer dans la base de données.Tout cela suppose que votre implémentation SecretKey prend en charge le codage. Sinon,
getEncoded()
retournera null.Éditer:
Vous devriez regarder les javadocs Key / SecretKey (disponibles juste au début d'une page google):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
Ou ceci de CodeRanch (également trouvé avec la même recherche google):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
la source
Conversion SecretKeySpec à cordes et vice-versa: vous pouvez utiliser la
getEncoded()
méthode dans ceSecretKeySpec
qui donnerabyteArray
, à partir que vous pouvez utiliserencodeToString()
pour obtenir lastring
valeur deSecretKeySpec
dans l'Base64
objet.Lors de la conversion
SecretKeySpec
enString
: utiliserdecode()
dansBase64
donnerabyteArray
, à partir de là, vous pouvez créer une instance pourSecretKeySpec
avec les paramètres commebyteArray
pour reproduire votreSecretKeySpec
.la source
essayez ceci, cela fonctionne sans Base64 (qui n'est inclus que dans JDK 1.8), ce code s'exécute également dans la version java précédente :)
la source