Cet article présente principalement l'explication détaillée de Java sur le cryptage unidirectionnel - MD5, SHA et HMAC et des exemples d'implémentation simples. Les amis dans le besoin peuvent se référer à
Explication détaillée de Java sur le cryptage unidirectionnel --MD5. , SHA et HMAC et exemples d'implémentation simples
Résumé :
Les trois algorithmes de chiffrement MD5, SHA et HMAC peuvent être considérés comme un chiffrement non réversible, ce qui est une méthode de cryptage qui ne peut pas être déchiffrée.
MD5
MD5 est l'algorithme de résumé de message 5 (algorithme de résumé de message 5), qui est utilisé pour assurer une transmission complète et cohérente des informations. MD5 est un algorithme qui saisit des informations de longueur variable et génère une longueur fixe de 128 bits.
L'algorithme MD5 a les caractéristiques suivantes :
1. Compressibilité : Pour les données de n'importe quelle longueur, la longueur de la valeur MD5 calculée est fixe.
2. Facile à calculer : il est facile de calculer la valeur MD5 à partir des données originales.
3. Anti-modification : si des modifications sont apportées aux données d'origine, même si seulement 1 octet est modifié, la valeur MD5 résultante sera très différente.
4. Forte anti-collision : étant donné les données originales et leur valeur MD5, il est très difficile de trouver des données avec la même valeur MD5 (c'est-à-dire des données falsifiées).
MD5 est également largement utilisé dans l'authentification de connexion des systèmes d'exploitation, tels qu'Unix, divers mots de passe de connexion au système BSD, les signatures numériques et bien d'autres aspects. Par exemple, dans un système Unix, le mot de passe de l'utilisateur est stocké dans le système de fichiers après hachage à l'aide de MD5 (ou d'autres algorithmes similaires). Lorsque l'utilisateur se connecte, le système effectue une opération de hachage MD5 sur le mot de passe saisi par l'utilisateur, puis le compare à la valeur MD5 stockée dans le système de fichiers pour déterminer si le mot de passe saisi est correct. Grâce à de telles étapes, le système peut déterminer la légitimité de la connexion de l'utilisateur au système sans connaître le code clair du mot de passe de l'utilisateur. Cela empêche que le mot de passe de l'utilisateur soit connu des utilisateurs disposant de droits d'administrateur système. MD5 mappe une "chaîne d'octets" de n'importe quelle longueur en un grand entier de 128 bits, et il est très difficile d'inverser la chaîne d'origine via ces 128 bits.
SHA
SHA (Secure Hash Algorithm, algorithme de hachage sécurisé), un outil important dans les applications de cryptographie telles que les signatures numériques, est largement utilisé Il est largement utilisé dans les domaines de la sécurité de l’information tels que le commerce électronique. Bien que SHA et MD5 aient été piratés par des méthodes de collision, SHA reste un algorithme de cryptage sécurisé reconnu et plus sécurisé que MD5.
La longueur définie par SHA
La valeur de hachage du relais (état interne) dans le tableau suivant représente le hachage compressé de chaque bloc de données La valeur du relais ( somme de hachage interne).
算法 | 输出散列值长度(bits) | 中继散列值长度(bits) | 数据区块长度(bits) | 最大输入消息长度(bits) | 一个Word长度(bits) | 循环次数 | 使用到的运算符 | 碰撞攻击 |
---|---|---|---|---|---|---|---|---|
SHA-0 | 160 | 160 | 512 | 264 − 1 | 32 | 80 | ,and,or,xor,rotl | 是 |
SHA-1 | 160 | 160 | 512 | 264 − 1 | 32 | 80 | ,and,or,xor,rotl | 存在263的攻击 |
SHA-256/224 | 256/224 | 256 | 512 | 264 − 1 | 32 | 64 | ,and,or,xor,shr,rotr | 尚未出现 |
SHA-512/384 | 512/384 | 512 | 1024 | 2128 − 1 | 64 | 80 | ,and,or,xor,shr,rotr | 尚未出现 |
HMAC
HMAC (Hash Message Authentication Code), code d'authentification du message de hachage, protocole d'authentification basé sur l'algorithme de hachage de clé. Le principe du code d'authentification de message est d'utiliser une fonction et une clé publiques pour générer une valeur de longueur fixe comme identifiant d'authentification, et d'utiliser cet identifiant pour authentifier l'intégrité du message. Une clé secrète est utilisée pour générer un petit bloc de données de taille fixe, le MAC, qui est ajouté au message puis transmis. Le destinataire utilise la clé partagée avec l'expéditeur pour l'authentification et l'authentification.
Exemple Java
package com.zzj.encryption; import java.security.MessageDigest; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * 单向加密(非可逆加密) * @author lenovo * */ public class OneWayEncryption { static final String ALGORITHM_MD5 = "MD5"; static final String ALGORITHM_SHA = "SHA"; /** * MAC算法可选以下多种算法 * <pre class="brush:php;toolbar:false"> * HmacMD5 * HmacSHA1 * HmacSHA256 * HmacSHA384 * HmacSHA512 **/ static final String ALGORITHM_MAC = "HmacMD5"; /** 密钥 **/ static final String MAC_KEY = "abcdef"; public static void main(String[] args) throws Exception { String source = "我是程序猿!我很骄傲!"; // MD5加密 printBase64(encryptionMD5(source)); // SHA加密 printBase64(encryptionSHA(source)); // HMAC加密 printBase64(encryptionHMAC(source)); } static void printBase64(byte[] out) throws Exception { System.out.println(encodeBase64(out)); } /** * MD5加密 * @param source * @return * @throws Exception */ static byte[] encryptionMD5(String source) throws Exception { MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5); md.update(source.getBytes("UTF-8")); return md.digest(); } /** * SHA加密 * @param source * @return * @throws Exception */ static byte[] encryptionSHA(String source) throws Exception { MessageDigest md = MessageDigest.getInstance(ALGORITHM_SHA); md.update(source.getBytes("UTF-8")); return md.digest(); } /** * HMAC加密 * @return * @throws Exception */ static byte[] encryptionHMAC(String source) throws Exception { SecretKey secretKey = new SecretKeySpec(MAC_KEY.getBytes("UTF-8"), ALGORITHM_MAC); Mac mac = Mac.getInstance(ALGORITHM_MAC); mac.init(secretKey); mac.update(source.getBytes("UTF-8")); return mac.doFinal(); } /** * base64编码 * @param source * @return * @throws Exception */ static String encodeBase64(byte[] source) throws Exception{ return new String(Base64.encodeBase64(source), "UTF-8"); } }
Résultat :
1cNbZhnhFsFV3BFPLA71wA== kl5KI61Xq44E/SzSPa2sUntMAEc= JF2v/u9td5l8yGAImNvTZw==
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!