2009-11-19 8 views
1

Lorsque vous voulez crypter quelque chose, vous ne voulez pas que la clé à déchiffrer soit décidée par vous et non par un générateur de nombres aléatoires?Pourquoi la clé aes devrait-elle être générée aléatoirement?

Je vois ce code dans le post de stackoverflow. mais je ne veux pas que la clé soit générée aléatoirement je veux que l'utilisateur soit invité à entrer la clé et sur ce bases le cryptage devrait arriver ..

des suggestions comment devrais-je modifier le code?

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
KeySpec spec = new PBEKeySpec(password, salt, 1024, 256); 
SecretKey tmp = factory.generateSecret(spec); 
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 

Répondre

1

L'idée de cryptage est tout sauf que personne les parties nécessaires ne peut jamais déduire la clé puisque la clé est le seul secret. Si vous choisissez les clés vous-même, vous êtes susceptible de suivre un modèle habituel, donc si vous concombre une clé, vous exposer ce modèle et l'attaquant peut utiliser cette information pour simplifier la recherche d'autres clés que vous utilisez. L'utilisation d'un bon générateur de nombres aléatoires élimine cette possibilité et rend le chiffrement beaucoup plus efficace.

+0

De plus, grâce à la génération aléatoire, la clé est généralement sélectionnée dans l'espace «clé», ce qui signifie que les clés définies par l'utilisateur sont généralement limitées aux lettres et aux chiffres. – mjv

+0

Eh bien, vous pourriez compenser cela en demandant à un utilisateur plus de lettres et de chiffres et en hachant l'entrée pour avoir la largeur nécessaire. – sharptooth

+0

Oui, c'est exactement ce que fait le code OP à l'aide de PBKDF2. – erickson

0

Le code que vous affichez ne génère pas de clé aléatoire. La clé générée est une fonction du mot de passe, et sera exactement la même chaque fois qu'un mot de passe donné est utilisé. Dans ce cas, l'utilisateur doit entrer le code password. Ce mot de passe est utilisé comme germe pour un algorithme qui produit de façon déterministe une chaîne d'octets pouvant être utilisée comme clé cryptographique.

Il y a quelque chose qui devrait être choisi au hasard pour chaque opération: le vecteur d'initialisation utilisé pour les chiffrements en mode CBC. Cela produit différents textes chiffrés même lorsque la même clé est utilisée pour chiffrer le même texte en clair.