Quelle est la taille de la clé pour PBEWithMD5AndTripleDES?
Je suis en train de remplacer PBEWithMD5AndDES avec PBEWithMD5AndTripleDES dans le code existant. Jusqu'à présent, je suis en utilisant le même mot de passe que j'utilisais avant, et la réception de cette Exception:
java.de sécurité.InvalidKeyException: Illégal de la taille de la clé
J'ai regardé en ligne et vu que le DES utilise une version 64 bits de la clé et de TripleDES utilise une clé de 128 bits. Je ne suis pas clair sur les détails de la façon dont mon mot de passe est utilisé pour générer une clé, et vous ne savez pas où chercher à comprendre ce entièrement. Mon mot de passe est de 260 caractères. J'ai essayé le doublement de la longueur, mais j'obtiens la même Exception.
Je suis de la génération d'un PBEKeySpec de mon mot de passe, avec 8 octets de sel et un nombre d'itérations de 12. Je vois qu'il y a un autre constructeur qui prend un keyLength argument, mais la documentation décrit comme "être issu," et je ne comprends pas. J'ai dans l'idée que j'ai besoin de modifier le nombre d'itérations et/ou la fourniture d'un keyLength argument, mais je ne veux pas juste faire aveuglément sans comprendre pleinement ce que je suis en train de faire.
Voici le schéma de base du code que j'utilise actuellement:
String passphrase = ...
byte[] salt = ...
int iterationCount = 12;
String algorithm = "PBEWithMD5AndTripleDES";
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec);
Cipher cipher = Cipher.getInstance(key.getAlgorithm());
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
byte[] encoded = cipher.doFinal(data);
- TripleDES, ou plus précisément DESede utilise soit un DES ABA clé ou une DES touche ABC. Dans les 16 bits / 128 bits version, qui a une entropie de 112 bits et d'une longueur d'environ 80 bits, les 8 premiers octets sont la première touche (A), et les 8 octets sont la deuxième clé (B), puis DESede est C = E(Sa, D(Sb, E(Sa, le bloc de données))). Il est plus probable que Oracle utilise ABC clés (24 octets, 192 bits, 168 bits d'entropie, 128 bits efficace) car c'était le seul qu'ils ont pris en charge pour un certain temps. 16 octets clés donnerait un InvalidKeySize, ou un InvalidKeySpec exception, si je ne me trompe pas.
- Juste une remarque: pensez à utiliser AES au lieu de (Triple)DES - il est à la fois plus rapide et considéré comme plus sûr.
Vous devez vous connecter pour publier un commentaire.
PBEWith<Hash>AndTripleDES Exige "Force irrésistible" de la Politique
Cet algorithme utilise une clé de 168 bits (bien qu'en raison de vulnérabilités, il est efficace de la force de 112 bits). Pour utiliser une clé symétrique de longueur, vous avez besoin de la "force illimitée de la compétence de la politique" installé dans votre Java runtime.
Un "Illégale la taille de la clé" message indique la longueur de la clé n'est pas autorisé par la politique; si la longueur de la clé est incorrecte pour l'algorithme, le SunJCE fournisseur utilise le message, "Mal la taille de la clé".
Ne pas Utiliser PBEWith<Hash>AndTripleDES
Note que "PBEWithMD5AndTripleDES" est un mauvais algorithme à utiliser.
Chiffrement par mot de passe suit généralement PKCS #5. Il définit un schéma de chiffrement pour DES (ou RC2) appelé PBES1. Parce que PBES1 a été conçu pour générer 64 bits (ou moins) de clés, Oracle a créé une extension propriétaire de générer des clés plus longues. Il n'a pas été exposés à la même attention que PKCS #5 a, et si vous avez besoin d'inter-opérer avec toute autre plate-forme, vous aurez à creuser dans le code source pour savoir comment la clé et le vecteur d'initialisation sont dérivés.
C'est aussi étrange que le vecteur d'initialisation est dérivé du mot de passe. Le but d'un IV est de créer différentes de chiffrement de textes chaque fois qu'un texte en clair est chiffré avec la même clé. Si le IV est généré à partir de la clé, ce but est vaincu. La clé de dérivation de l'algorithme utilisé par PBES1 évite cela en intégrant un "sel" qui est censé être différente à chaque fois le mot de passe est utilisé. Mais, il pourrait être facile de le visser; fournir une IV directement sur le chiffre d'initialisation est plus conventionnel, et le rend plus évident de ce qui se passe.
Utilisation PBKDF2 au Lieu
PKCS #5 définit également une clé de dérivation algorithme appelé PBKDF2 est désormais pris en charge par Java. Il offre une sécurité supérieure à PBES1 parce que le vecteur d'initialisation et de tous les autres paramètres requis par l'algorithme de chiffrement sont pas dérivé du mot de passe, mais sont sélectionnés de façon indépendante.
Voici un exemple avec PBKDF2, à l'aide de l'algorithme AES. Si vous ne pouvez pas suivre la recommandation de mise à jour de l'AES, l'exemple peut être appliqué à DESede en utilisant une longueur de clé de 192, et l'évolution des événements "AES" pour "DESede".
TDEA Incrustation Options
Il y a trois incrustation d'options qui peuvent être utilisées avec TDEA ("Triple DES" ou "DESede"). Ils prennent de 64, 128 ou 192-bit clés (y compris les bits de parité), selon l'option choisie.
Les tailles de clé acceptée par le TDEA de mise en œuvre dépendent du fournisseur; un peu besoin de vous pour former une clé de 192 bits, même si vous êtes à l'aide de la clé de 56 bits option qui est effectivement DES au lieu de TDEA. La plupart des implémentations de prendre 16 ou de 24 octets comme une clé.
Seulement les trois-touche option (168 bits, ou 192 bits avec parité) peut être considéré comme "le chiffrement fort". Il dispose de 112 bits de efficace de la force.
KeySpec
à unSecretKeyFactory
, puis à l'aide de l'résultantSecretKey
avec un "DESede"Cipher
objet, ou essayez-vous d'utiliser un "PBEWithMD5AndTripleDES"Cipher
en une seule étape? Aussi, ce fournisseur de services de sécurité utilisez-vous? Alors que les cet exemple c'est pour AES-256, la même approche est ce que je recommande pour TDEA, parce que vous pouvez utiliser PBKDF2, qui est un meilleur algorithme de dérivation de clé.SecretKey
la façon dont vous avez ne pas faire n'importe quoi. Si vous avez réellement imprimernew String(key.getEncoded())
, vous devriez voir votre mot de passe. La véritable clé de dérivation qui se passe (lors de l'utilisation de la SunJCE fournisseur) lorsque vousinit()
laCipher
(c'est pourquoi vous avez besoin de la redondantePBEParameterSpec
de l'information). Cependant, peut-être que votreCipher
fournisseur est pas SunJCE. Veuillez préciser votre Java runtime version, et ajouter un peu de débogage à trouver pour certains le fournisseur de laSecretKeyFactory
et leCipher
:x.getProvider().getName()
Comme erickson dit, la "bonne" réponse à cette question est d'installer la force illimitée de la compétence de la politique de fichiers dans le JRE.
Qui va rendre le chiffrement avec PBEWithMD5AndTripleDES "travail", mais les données qui en résultent ne peuvent pas être déchiffrés pour autant que je peux dire. Vous obtiendrez une marge d'erreur de l'exception. Il peut y avoir un moyen de régler le problème, mais c'était une preuve suffisante pour moi que la poursuite de cette route n'était pas la peine car elle semble être une route qui n'est pas voyagé assez pour obtenir les bugs travaillé ou à la popularisation des exemples de travail.
J'ai aussi découvert un PBEWithSHA1AndTripleDES et il a essayé, mais j'ai reçu le même rembourrage erreur sur le déchiffrement.
J'ai été en mesure d'obtenir nos exigences changé de PBEWithMD5AndTripleDES juste TripleDES (DESede), et qui a éliminé toute la question pour moi!