常见的加密解密算法-MD5
一、MD5加密概述
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
MD5 是非对称的加密算法(PS:对称加密就是加密用的密码和解密用的密码是一样的,非对称就是加密和解密用的密钥不一样)
参考连接:MD5加密
二、Java实现MD5加密解密
1、maven 引入apache的jar(不是maven项目,去网上下一个jar手动引入)
1 2 3 4 5 | <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version> 3.3 . 2 </version> </dependency> |
2、MD5使用代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | package com.battcn.util; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.StringUtils; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; /** * MD5通用类 * * @author 沧海一粟 * @since 2017.04.15 * @version 1.0.0_1 * */ public class MD5 { /** * 合作ID(开通套餐之后运营分配) */ public static final String OPEN_ID = "666002" ; /** * 密钥:为保证通讯不被篡改,平台在=用户注册并开通套餐之后会分配32位字符串,请求接口时使用 */ public static final String KEY = "97fd73ec9418d6b72c03109140aa18e1" ; /** * MD5方法 * @param text 明文 * @param key 密钥 * @return 密文 * @throws Exception */ public static String md5(String text, String key) throws Exception { //加密后的字符串 String encodeStr=DigestUtils.md5Hex(text + key); System.out.println( "MD5加密后的字符串为:encodeStr=" +encodeStr); return encodeStr; } /** * MD5验证方法 * @param text 明文 * @param key 密钥 * @param md5 密文 * @return true/false * @throws Exception */ public static boolean verify(String text, String key, String md5) throws Exception { //根据传入的密钥进行验证 String md5Text = md5(text, key); if (md5Text.equalsIgnoreCase(md5)) { System.out.println( "MD5验证通过" ); return true ; } return false ; } /** * * 方法用途: 对所有传入参数按照字段名的Unicode码从小到大排序(字典序),并且生成url参数串<br> * 实现步骤: <br> * * @param paraMap 要排序的Map对象 * @param urlEncode 是否需要URLENCODE * @param keyToLower 是否需要将Key转换为全小写 * true:key转化成小写,false:不转化 * @return */ public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) { String buff = "" ; Map<String, String> tmpMap = paraMap; try { List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet()); // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { return (o1.getKey()).toString().compareTo(o2.getKey()); } }); // 构造URL 键值对的格式 StringBuilder buf = new StringBuilder(); for (Map.Entry<String, String> item : infoIds) { if (StringUtils.isNotBlank(item.getKey())) { String key = item.getKey(); String val = item.getValue(); if (urlEncode) { val = URLEncoder.encode(val, "utf-8" ); } if (keyToLower) { buf.append(key.toLowerCase() + "=" + val); } else { buf.append(key + "=" + val); } buf.append( "&" ); } } buff = buf.toString(); if (buff.isEmpty() == false ) { buff = buff.substring( 0 , buff.length() - 1 ); } } catch (Exception e) { return null ; } return buff; } public static void main(String[] args) throws Exception { String rtime=TimeUtil.getDate(); Map<String,String> paraMap = new HashMap<String,String>(); paraMap.put( "openid" ,OPEN_ID); paraMap.put( "rtime" , rtime); paraMap.put( "name" , "哈哈" ); paraMap.put( "pid" , "421126199407203168" ); paraMap.put( "mobile" , "18772101525" ); paraMap.put( "loan_type" , "1" ); String signSrc = formatUrlMap(paraMap, false , false ); signSrc=signSrc+ "&key=" +KEY; System.out.println( "明文字符串signSrc=" +signSrc); String sign=md5(signSrc, KEY); boolean result=verify(signSrc, KEY, sign); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决