Cet article présente principalement les algorithmes de chiffrement couramment utilisés pour la mise en œuvre de Java - algorithmes de chiffrement unidirectionnels MD5 et SHA, comme suit:
1. Architecture de sécurité de Java
1.1 Introduction à l'architecture de sécurité de Java
Fournir des classes et des interfaces pour les cadres de sécurité en Java. L'API de sécurité JDK est l'API principale du langage de programmation Java, situé dans le package Java.Security (et ses sous-packages), ainsi que le package Sun.Securityapi (et ses sous-packages). Conçu pour aider les développeurs à utiliser les fonctionnalités de sécurité de bas niveau et avancées dans leurs programmes.
La première version de JDK dans JDK 1.1 a présenté la "Java Encryption Architecture" (JCA), qui fait référence à l'architecture utilisée pour accéder et développer des fonctions de mot de passe de la plate-forme Java. Dans JDK 1.1, JCA comprend une API pour les signatures numériques et les digestions de messages. JDK 1.2 étend considérablement l'architecture de cryptage Java, il améliore également l'infrastructure de gestion des certificats pour prendre en charge les certificats X.509 V3 et introduit une nouvelle architecture de sécurité Java pour un contrôle d'accès à grain fin, configurable, flexible et extensible.
L'architecture de cryptage Java comprend les parties liées au mot de passe de l'API de sécurité JDK 1.2, ainsi qu'un ensemble de conventions et de spécifications fournies dans ce document. Pour implémenter plusieurs mots de passe interopérables, il fournit également une architecture "fournisseur".
Java Motway Extension (JCE)) étend l'API JCA, y compris les API pour le cryptage, l'échange de clés et les codes d'authentification des informations (MAC). Les mots de passe JCE et JDK ensemble fournissent ensemble une API de mot de passe complète qui n'est pas liée à la plate-forme. JCE en tant qu'extension de JDK sera libéré indépendamment pour se conformer aux contraintes de contrôle des exportations américaines.
1.2 Code source connexe de JDK dans Eclipse
Afin d'avoir une compréhension plus approfondie de la mise en œuvre des algorithmes de chiffrement unidirectionnels MD5 et SHA en Java, le code source du JDK peut être associé à l'utilisation de l'IDE Eclipse (l'auteur utilise JDK6.0).
Une fois l'installation de JDK6.0 terminée, il y a le répertoire Src.zip dans le répertoire racine de JDK (par exemple C: /java/jdk1.6.0_21). Ce répertoire peut être décompressé dans un autre répertoire (par exemple D: / Amigo / Study / Technical Essay / 201405). Src.zip ne contient pas tout le code source JDK. Par exemple, les sous-packages sous Sun n'existent pas dans Src.zip (par exemple, le package Sun.Security et ses sous-packages utilisés dans cet article ne sont pas inclus).
Pour télécharger ces sous-packages, vous devez télécharger le code source d'OpenJDK. OpenJDK est la version open source de JDK et est publiée sous la forme du protocole GPL. À JDK7, OpenJDK était devenu le développement de l'épine dorsale de JDK7. Sun JDK7 a été libéré sur la base d'OpenJDK7. La plupart de ses codes d'origine sont les mêmes, et seule une petite partie des codes d'origine a été remplacée. Publié à l'aide de JRL (Javaresearch Licence, Java Research Licence Contrat).
Adresse de téléchargement OpenJDK: //www.vevb.com/softs/75724.html
Après le téléchargement, copiez tous les fichiers et dossiers dans l'OpenJDK-6-SRC-B27-26_OCT_2012 / JDK / SRC / CLASS / CLASSE SRC / Classes du répertoire SRC non décompressé.
Ensuite, configurez le code source associé dans Eclipse: cliquez sur "Windows" -> "Préférences" et sélectionnez "Java" -> "Installé JRES" dans le menu de gauche. Si le JRE de cette machine a été configuré, vous n'avez pas besoin de le configurer. Si ce n'est pas configuré, cliquez sur le bouton "Ajouter" à droite et sélectionnez le chemin d'accès à la fenêtre JDK6.0 installée dans la fenêtre pop-up "Ajouter JRE" (par exemple C: /java/jdk1.6.0_21). Cliquez sur le bouton "OK" pour terminer les paramètres de JRE.
Sélectionnez le bouton SET JRE, cliquez sur le bouton "Modifier ..." à droite, sélectionnez le package RT.Jar dans la fenêtre contextuelle, cliquez sur le bouton "Source Attachment ...", cliquez sur le bouton "Dossier externe ..." dans la fenêtre contextuelle et pointez le chemin du code source vers le chemin du chemin du SRC. Voir la figure ci-dessous:
Après avoir cliqué sur le bouton "OK" pour le configurer, lors de l'écriture de l'implémentation de MD5 et SHA, lorsque vous appelez les méthodes pertinentes de MessagediGest, vous pouvez utiliser le mode de débogage F5 de débogage en un seul pas pour afficher les classes principalement impliquées dans l'implémentation de MD5 et des algorithmes de crypypage à sens inverse de MD5 et SHA dans Java.
1.3 Les principales classes de cryptage MD5 et SHA dans JDK
Dans JDK6.0, les diagrammes de classe de plusieurs classes étroitement liés à MD5 et SHA sont les suivants:
Parmi eux, "Messagedigestspi" est la classe abstraite de niveau supérieur, et "Messagedigest" et "Digestbase" sous le même package sont des classes de sous-abstract.
Dans le diagramme de classe ci-dessus, le modèle de conception du délégué est utilisé. Le principe de ce modèle est que la classe B (voici la classe intérieure du délégation) et la classe A (voici la classe MessagedigestsPI) sont deux classes qui n'ont aucune relation entre elles. B a exactement les mêmes méthodes et attributs que A; Et les méthodes et les attributs d'appel dans B consiste à appeler des méthodes et des attributs avec le même nom dans A. B semble être un intermédiaire autorisé par A. Code tiers n'a pas besoin de connaître l'existence de A et de ses sous-classes, et il n'a pas besoin d'avoir un lien direct avec A et ses sous-classes. Grâce à B, les fonctions de A peuvent être directement utilisées, qui peuvent non seulement utiliser diverses fonctions de A, mais aussi bien protéger A et ses sous-classes.
Les codes pertinents pour MD5 et SHA sont tous dans des classes telles que MD5 et SHA, mais la classe abstraite de MessagediGest orientée client n'a pas besoin de traiter diverses classes d'implémentation, il suffit de les traiter via la classe déléguée.
2. Encryption MD5
2.1 Aperçu
Message Digest Algorithm MD5 (Nom chinois est un algorithme de digest de messages cinquième édition) est une fonction de hachage largement utilisée dans le domaine de la sécurité informatique pour fournir une protection d'intégrité des messages. Le numéro de dossier de cet algorithme est RFC 1321 (R.rivest, MIT Laboratory for Computer Science et RSA Data Security Inc. avril 1992).
Le nom complet de MD5 est un algorithme de message-digeur 5 (algorithme d'information-abstract), développé par Ronald L. Rivest of MIT Laboratory for Computer Science et RSA Data Security Inc au début des années 1990, et développé par MD2, MD3 et MD4.
MD5 est utilisé pour assurer une transmission d'informations complète et cohérente. C'est l'un des algorithmes de hachage largement utilisés par les ordinateurs (également traduits par algorithme abstrait et algorithme de hachage). Les langages de programmation grand public sont généralement mis en œuvre par MD5. Le calcul des données (telles que les caractères chinois) dans une autre valeur de longueur fixe est le principe de base de l'algorithme de hachage. Les prédécesseurs de MD5 étaient MD2, MD3 et MD4.
La fonction de MD5 est de permettre aux informations de grande capacité d'être "compressées" au format confidentiel avant de signer une clé privée avec un logiciel de signature numérique (c'est-à-dire pour convertir une chaîne d'octets de toute longueur en une chaîne hexadécimale d'une certaine longueur).
2.2 Principes d'algorithme
Une brève description de l'algorithme MD5 peut être la suivante: MD5 traite les informations d'entrée dans des paquets 512 bits, et chaque paquet est divisé en 16 sous-paquets 32 bits. Après une série de traitements, la sortie de l'algorithme se compose de quatre paquets 32 bits. Après en cascade ces quatre paquets 32 bits, une valeur de hachage 128 bits sera générée.
Dans l'algorithme MD5, les informations doivent être remplies en premier, de sorte que le résultat du solde restant de sa paire de longueurs de bit 512 est égal à 448. Par conséquent, la longueur de bit de l'information sera étendue à N * 512 + 448, n est un entern non négatif, et n peut être nulle. La méthode de remplissage est la suivante: Remplissez un 1 et d'innombrables 0 derrière les informations et arrêtez de remplir les informations avec 0 jusqu'à ce que les conditions ci-dessus soient remplies. Ensuite, une longueur d'information de remplissage supérieur est attachée en binaire 64 bits. Après ces deux étapes de traitement, la longueur du bit des informations = n * 512 + 448 + 64 = (n + 1) * 512, c'est-à-dire que la longueur est exactement un multiple entier de 512. La raison en est de répondre aux exigences de longueur d'information dans le traitement ultérieur.
2.3 Implémentation MD5 en Java
L'implémentation Java de l'algorithme de cryptage MD5 est la suivante:
Package Amigo.endecrypt; Importer Java.Security.Messagedigest; / ** * Utiliser MD5 Encryption * @Author Xingxing, Xie * @DateTime 2014-5-31 * / Classe publique MD5Util {/ *** * MD5 Encryption Générats 32-Bit Code * @param String to Being Be Acrypted * @rerning Retour 32-Bit Code * @param String to Be Be Acrypted * @rern La chaîne statique publique MD5Encode (String instr) lève l'exception {MessagediGest md5 = null; essayez {md5 = messagediGest.getInstance ("md5"); } catch (exception e) {System.out.println (e.toString ()); e.printStackTrace (); retour ""; } byte [] bytearray = instlit.getBytes ("utf-8"); octet [] md5bytes = md5.digest (bytearray); StringBuffer hexValue = new StringBuffer (); for (int i = 0; i <md5bytes.length; i ++) {int val = ((int) md5bytes [i]) & 0xff; if (val <16) {hexvalue.append ("0"); } hexvalue.append (Integer.tohexString (Val)); } return hexvalue.toString (); } / ** * Tester la fonction principale * @param args * @throws exception * / public static void main (String args []) lève l'exception {String str = new String ("AmigoxiexiexingXing"); System.out.println ("Original:" + Str); System.out.println ("MD5:" + md5encode (str)); }}Résultats des tests:
Original: AmigoxiexiexingXing
Post-MD5: E9AC094091B96B84CCA48098BC21B1D6
3. Encryption Sha
3.1 Aperçu
SHA est un algorithme de chiffrement des données. Cet algorithme a été développé et amélioré par des experts en cryptage au fil des ans et est devenu de plus en plus parfait. Il est maintenant devenu l'un des algorithmes de hachage les plus sécurisés reconnus et a été largement utilisé. L'idée de cet algorithme est de recevoir un texte brut, puis de le convertir en texte de chiffre (généralement plus petit) de manière irréversible. Il peut également être simplement compris comme le processus de prise d'une chaîne de codes d'entrée (appelés pré-appapports ou d'informations) et de les convertir en une séquence de sortie à chiffre fixe plus courte, c'est-à-dire des valeurs de hachage (également connues sous le nom d'informations digest ou code d'authentification des informations). La valeur de la fonction de hachage peut être considérée comme une sorte «d'empreinte digitale» ou de «résumé» du texte en clair, de sorte que la signature numérique de la valeur de hachage peut être considérée comme la signature numérique du texte en clair.
L'algorithme de hachage sécurisé (SHA) est le National Standard FIPS Pub 180 publié par l'Institut national des normes et de la technologie. La dernière norme a été mise à jour de FIPS Pub 180-3 en 2008. Parmi eux, plusieurs algorithmes de hachage unidirectionnels tels que Sha-1, SHA-224, SHA-256, SHA-384 et SHA-512 sont spécifiés. SHA-1, SHA-224 et SHA-256 conviennent aux messages d'une longueur de pas plus de 2 ^ 64 bits binaires. SHA-384 et SHA-512 conviennent aux messages d'une longueur de 2 ^ 128 bits binaires.
3.2 Principe
SHA-1 est un algorithme de chiffrement des données. L'idée de cet algorithme est de recevoir un texte brut, puis de la convertir en texte de chiffre (généralement plus petit) de manière irréversible. Il peut également être simplement compris comme le processus de prise d'une chaîne de codes d'entrée (appelés pré-appapports ou d'informations) et de les convertir en une séquence de sortie à chiffre fixe plus courte, c'est-à-dire des valeurs de hachage (également connues sous le nom d'informations digest ou code d'authentification des informations).
La sécurité d'une fonction de hachage à sens unique réside dans la forte nature unidirectionnelle de son processus de fonctionnement de génération de valeurs de hachage. Si un mot de passe est intégré dans la séquence d'entrée, personne ne peut générer la valeur de hachage correcte sans connaître le mot de passe, assurant ainsi sa sécurité. SHA bloque les flux d'entrée en 512 bits (64 octets) par bloc et produit 20 octets de sortie appelés code d'authentification des informations ou digestion d'informations.
La longueur des paquets d'entrée de cet algorithme est illimitée et la sortie générée est un digest de message 160 bits. L'entrée est traitée dans des paquets 512 bits. SHA-1 est irréversible, résistant aux conflits et a un bon effet d'avalanche.
La signature numérique peut être implémentée via un algorithme de hachage. Le principe de la signature numérique est de convertir le texte brut pour être transmis en un digestion de message via une opération de fonction (hachage) (différents textes brusques correspondent à différents digestes de messages). Le message de message est chiffré et envoyé au destinataire avec le texte brut. Le destinataire génère un nouveau message de message pour décrypter et compare le digestion du message de l'expéditeur. Le résultat de la comparaison est cohérent, ce qui signifie que le texte brut n'a pas été modifié. S'il est incohérent, cela signifie que le texte brut a été falsifié.
Mac (code d'authentification des informations) est un résultat de hachage, dans lequel une partie des informations d'entrée est un mot de passe. Seuls les participants qui connaissent ce mot de passe peuvent calculer et vérifier à nouveau la légitimité du code MAC.
3.3 Implémentation SHA en Java
L'implémentation Java de SHA est similaire à MD5, et le code de référence est le suivant:
Package Amigo.endecrypt; Importer Java.Security.Messagedigest; / ** * Utiliser Shaa Encryption * @Author Xingxing, Xie * @DateTime 2014-6-1 * / public class Shautil {/ *** * sha Encryption Generates 40-bits sha code * @param String to Being Encrypted * @return retour shaencode (string instr) lève l'exception {messagediGest sha = null; essayez {sha = messagediGest.getInstance ("sha"); } catch (exception e) {System.out.println (e.toString ()); e.printStackTrace (); retour ""; } byte [] bytearray = instlit.getBytes ("utf-8"); octet [] md5bytes = sha.digest (bytearray); StringBuffer hexValue = new StringBuffer (); for (int i = 0; i <md5bytes.length; i ++) {int val = ((int) md5bytes [i]) & 0xff; if (val <16) {hexvalue.append ("0"); } hexvalue.append (Integer.tohexString (Val)); } return hexvalue.toString (); } / ** * Tester la fonction principale * @param args * @throws exception * / public static void main (String args []) lève l'exception {String str = new String ("AmigoxiexiexingXing"); System.out.println ("Original:" + Str); System.out.println ("sha:" + shaencode (str)); }}Les résultats des tests sont les suivants:
Original: AmigoxiexiexingXing
Après SHA: 04F79F496DD6BDAB3439511606528A4AD9CAAC5E
3. Comparaison entre SHA-1 et MD5
Parce que les deux sont dérivés de MD4, SHA-1 et MD5 sont très similaires les uns aux autres. De même, leur force et d'autres caractéristiques sont similaires, mais il existe également des différences dans les points suivants:
1) Sécurité contre les attaques forcées: La différence la plus significative et la plus importante est que le digest Sha-1 est de 32 bits plus long que le digest MD5. En utilisant la technologie forcée, la difficulté de générer un message afin que son digest soit égal à un digest donné est une opération de l'ordre de 2 ^ 128 pour MD5 et une opération de 2 ^ 160 pour Sha-1. De cette façon, Sha-1 a une plus grande force pour les attaques de force.
2) Sécurité de l'analyse des mots de passe: En raison de la conception de MD5, il est vulnérable à l'analyse des mots de passe et SHA-1 semble être moins sensible à de telles attaques.
3) Vitesse: Sur le même matériel, SHA-1 fonctionne lentement que MD5.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.