MD5Util MD5加密工具类
Java实现MD5加密及解密的代码实例分享
Java实现MD5加密及解密的代码实例分享基础:MessageDigest类的使⽤其实要在Java中完成MD5加密,MessageDigest类⼤部分都帮你实现好了,⼏⾏代码⾜矣:/*** 对字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static String getMD5(String str) {try {// ⽣成⼀个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");// 计算md5函数md.update(str.getBytes());// digest()最后确定返回md5 hash值,返回值为8为字符串。
因为md5 hash值是16位的hex值,实际上就是8位的字符// BigInteger函数则将8位的字符串转换成16位hex值,⽤字符串来表⽰;得到字符串形式的hash值return new BigInteger(1, md.digest()).toString(16);} catch (Exception e) {throw new SpeedException("MD5加密出现错误");}}进阶:加密及解密类Java实现MD5加密以及解密类,附带测试类,具体见代码。
MD5加密解密类——MyMD5Util,代码如下package com.zyg.security.md5;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Arrays;public class MyMD5Util {private static final String HEX_NUMS_STR="0123456789ABCDEF";private static final Integer SALT_LENGTH = 12;/*** 将16进制字符串转换成字节数组* @param hex* @return*/public static byte[] hexStringToByte(String hex) {int len = (hex.length() / 2);byte[] result = new byte[len];char[] hexChars = hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4| HEX_NUMS_STR.indexOf(hexChars[pos + 1]));}return result;}/*** 将指定byte数组转换成16进制字符串* @param b* @return*/public static String byteToHexString(byte[] b) {StringBuffer hexString = new StringBuffer();for (int i = 0; i < b.length; i++) {String hex = Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}hexString.append(hex.toUpperCase());}return hexString.toString();}/*** 验证⼝令是否合法* @param password* @param passwordInDb* @return* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static boolean validPassword(String password, String passwordInDb)throws NoSuchAlgorithmException, UnsupportedEncodingException {//将16进制字符串格式⼝令转换成字节数组byte[] pwdInDb = hexStringToByte(passwordInDb);//声明盐变量byte[] salt = new byte[SALT_LENGTH];//将盐从数据库中保存的⼝令字节数组中提取出来System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);//创建消息摘要对象MessageDigest md = MessageDigest.getInstance("MD5");//将盐数据传⼊消息摘要对象md.update(salt);//将⼝令的数据传给消息摘要对象md.update(password.getBytes("UTF-8"));//⽣成输⼊⼝令的消息摘要byte[] digest = md.digest();//声明⼀个保存数据库中⼝令消息摘要的变量byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];//取得数据库中⼝令的消息摘要System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length); //⽐较根据输⼊⼝令⽣成的消息摘要和数据库中消息摘要是否相同if (Arrays.equals(digest, digestInDb)) {//⼝令正确返回⼝令匹配消息return true;} else {//⼝令不正确返回⼝令不匹配消息return false;}}/*** 获得加密后的16进制形式⼝令* @param password* @return* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static String getEncryptedPwd(String password)throws NoSuchAlgorithmException, UnsupportedEncodingException {//声明加密后的⼝令数组变量byte[] pwd = null;//随机数⽣成器SecureRandom random = new SecureRandom();//声明盐数组变量byte[] salt = new byte[SALT_LENGTH];//将随机数放⼊盐变量中random.nextBytes(salt);//声明消息摘要对象MessageDigest md = null;//创建消息摘要md = MessageDigest.getInstance("MD5");//将盐数据传⼊消息摘要对象md.update(salt);//将⼝令的数据传给消息摘要对象md.update(password.getBytes("UTF-8"));//获得消息摘要的字节数组byte[] digest = md.digest();//因为要在⼝令的字节数组中存放盐,所以加上盐的字节长度pwd = new byte[digest.length + SALT_LENGTH];//将盐的字节拷贝到⽣成的加密⼝令字节数组的前12个字节,以便在验证⼝令时取出盐 System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);//将消息摘要拷贝到加密⼝令字节数组从第13个字节开始的字节System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);//将字节数组格式加密后的⼝令转化为16进制字符串格式的⼝令return byteToHexString(pwd);}}测试类——Client,代码如下:package com.zyg.security.md5;import java.io.UnsupportedEncodingException;import java.security.NoSuchAlgorithmException;import java.util.HashMap;import java.util.Map;public class Client {private static Map users = new HashMap();public static void main(String[] args){String userName = "zyg";String password = "123";registerUser(userName,password);userName = "changong";password = "456";registerUser(userName,password);String loginUserId = "zyg";String pwd = "1232";try {if(loginValid(loginUserId,pwd)){System.out.println("欢迎登陆");}else{System.out.println("⼝令错误,请重新输⼊");}} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 注册⽤户** @param userName* @param password*/public static void registerUser(String userName,String password){String encryptedPwd = null;try {encryptedPwd = MyMD5Util.getEncryptedPwd(password);users.put(userName, encryptedPwd);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 验证登陆** @param userName* @param password* @return* @throws UnsupportedEncodingException* @throws NoSuchAlgorithmException*/public static boolean loginValid(String userName,String password)throws NoSuchAlgorithmException, UnsupportedEncodingException{String pwdInDb = (String)users.get(userName);if(null!=pwdInDb){ // 该⽤户存在return MyMD5Util.validPassword(password, pwdInDb);}else{System.out.println("不存在该⽤户");return false;}}}PS:这⾥再为⼤家提供2款MD5加密⼯具,感兴趣的朋友可以参考⼀下:MD5在线加密⼯具:在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密⼯具:。
Java中常用的加密方式
Java中常⽤的加密⽅式⼀、Java常⽤加密⽅式Base64加密算法(编码⽅式)MD5加密(消息摘要算法,验证信息完整性)对称加密算法⾮对称加密算法数字签名算法数字证书⼆、分类按加密算法是否需要key被分为两类:不基于key的有: Base64算法、MD5基于key的有: 对称加密算法、⾮对称加密算法、数字签名算法、数字证书、HMAC、RC4(对称加密)按加密算法是否可逆被分为两类:单向加密算法(不可解密):MD5、SHA、HMAC⾮单项加密算法(可解密):BASE64、对称加密算法、⾮对称加密算法、数字签名算法、数字证书三、算法介绍1.对称加密对称加密是最快速、最简单的⼀种加密⽅式,加密(encryption)与解密(decryption)⽤的是同样的密钥(secret key)。
对称加密有很多种算法,由于它效率很⾼,所以被⼴泛使⽤在很多加密协议的核⼼当中。
对称加密通常使⽤的是相对较⼩的密钥,⼀般⼩于256 bit。
因为密钥越⼤,加密越强,但加密与解密的过程越慢。
如果你只⽤1 bit来做这个密钥,那⿊客们可以先试着⽤0来解密,不⾏的话就再⽤1解;但如果你的密钥有1 MB⼤,⿊客们可能永远也⽆法破解,但加密和解密的过程要花费很长的时间。
密钥的⼤⼩既要照顾到安全性,也要照顾到效率,是⼀个trade-off。
DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
DES和TripleDES基本算法⼀致,只是TripleDES算法提供的key位数更多,加密可靠性更⾼。
DES使⽤的密钥key为8字节,初始向量IV也是8字节。
TripleDES使⽤24字节的key,初始向量IV也是8字节。
两种算法都是以8字节为⼀个块进⾏加密,⼀个数据块⼀个数据块的加密,⼀个8字节的明⽂加密后的密⽂也是8字节。
如果明⽂长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。
所以加密后的密⽂长度⼀定为8字节的整数倍下⾯举个例⼦:⾮对称加密为数据的加密与解密提供了⼀个⾮常安全的⽅法,它使⽤了⼀对密钥,公钥(public key)和私钥(private key)。
hutool-all 密码加密方法
hutool-all 密码加密方法全文共四篇示例,供读者参考第一篇示例:在应用程序开发中,密码加密是一项非常重要的安全措施。
Hutool是一个Java工具类库,提供了一系列简便易用的密码加密方法,可以帮助开发者轻松实现数据加密和解密的功能。
本文将介绍Hutool-all中的一些常用密码加密方法,并讨论如何在实际项目中应用这些方法保护用户数据安全。
Hutool-all是一个功能强大的Java工具类库,其中包含了丰富的工具方法和类,可以帮助开发者简化程序开发过程。
在密码加密方面,Hutool-all提供了多种加密算法,包括MD5、SHA-1、SHA-256、AES等。
接下来,我们将逐一介绍这些加密算法的用法和特点。
我们来看一下最常用的MD5加密算法。
MD5是一种消息摘要算法,可以将任意长度的数据转换为一个128位的数字指纹。
在Hutool-all中,可以通过如下代码来实现对字符串进行MD5加密:```String password = "123456";String md5Password = SecureUtil.md5(password);System.out.println("MD5加密后的密码:" + md5Password);```通过上面的代码,我们可以看到将字符串"123456"加密为MD5后的密码。
MD5是一种单向加密算法,不可逆,但可以用于验证原始数据的完整性。
在实际应用中,可以将用户的密码存储为MD5加密后的值,确保数据安全。
除了MD5之外,Hutool-all还提供了SHA系列的加密算法,包括SHA-1和SHA-256。
这些算法可以生产更长的摘要结果,提高了加密的安全性。
下面是一个使用SHA-256加密算法的示例代码:通过以上代码,我们可以看到将密码"123456"使用SHA-256算法加密后的结果。
关于java中MD5加密(可直接使用)
关于java中MD5加密(可直接使⽤)上部分是转载的关于字符串的加密,后半部分则⽐较全,包括字符串、⽂件、字节数组、等1. package util;2.3. import java.security.MessageDigest;4.5. public class Encript {6. //⼗六进制下数字到字符的映射数组7. private final static String[] hexDigits = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};8.9. /**把inputString加密*/10. public static String md5(String inputStr){11. return encodeByMD5(inputStr);12. }13.14. /**15. * 验证输⼊的密码是否正确16. * @param password 真正的密码(加密后的真密码)17. * @param inputString 输⼊的字符串18. * @return 验证结果,boolean类型19. */20. public static boolean authenticatePassword(String password,String inputString){21. if(password.equals(encodeByMD5(inputString))){22. return true;23. }else{24. return false;25. }26. }27.28. /**对字符串进⾏MD5编码*/29. private static String encodeByMD5(String originString){30. if (originString!=null) {31. try {32. //创建具有指定算法名称的信息摘要33. MessageDigest md5 = MessageDigest.getInstance("MD5");34. //使⽤指定的字节数组对摘要进⾏最后更新,然后完成摘要计算35. byte[] results = md5.digest(originString.getBytes());36. //将得到的字节数组变成字符串返回37. String result = byteArrayToHexString(results);38. return result;39. } catch (Exception e) {40. e.printStackTrace();41. }42. }43. return null;44. }45.46. /**47. * 轮换字节数组为⼗六进制字符串48. * @param b 字节数组49. * @return ⼗六进制字符串50. */51. private static String byteArrayToHexString(byte[] b){52. StringBuffer resultSb = new StringBuffer();53. for(int i=0;i<b.length;i++){54. resultSb.append(byteToHexString(b[i]));55. }56. return resultSb.toString();57. }58.59. //将⼀个字节转化成⼗六进制形式的字符串60. private static String byteToHexString(byte b){61. int n = b;62. if(n<0)63. n=256+n;64. int d1 = n/16;65. int d2 = n%16;66. return hexDigits[d1] + hexDigits[d2];67. }68. }69. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++70. package com.angsentech.ssm.util;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** MD5加密处理⼯具类* @author Administrator**/public class MD5Utils {/*** 默认的密码字符串组合,⽤来将字节转换成 16 进制表⽰的字符,apache校验下载的⽂件的正确性⽤的就是默认的这个组合*/protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };protected static MessageDigest messagedigest = null;static {try {messagedigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException nsaex) {System.err.println(MD5Utils.class.getName()+ "初始化失败,MessageDigest不⽀持MD5Util。
md5加密 参数
md5加密参数MD5加密:保护信息安全的重要工具在信息时代,数据安全是一个非常重要的问题。
随着互联网的发展,人们的隐私和敏感信息越来越容易受到黑客和恶意软件的攻击。
为了保护个人和机构的数据安全,各种加密算法应运而生。
其中,MD5加密算法是一种常用且广泛应用的加密方式。
MD5,全称为Message Digest Algorithm 5,是一种被广泛应用的密码散列函数。
它的主要功能是将任意长度的信息转换为一个128位的哈希值,也就是常说的摘要或指纹。
MD5加密算法具有以下几个特点:1. 单向性:MD5加密算法是一种单向加密算法,即无法通过哈希值逆向推导出原始信息。
这意味着一旦信息经过MD5加密,就无法还原为原始数据。
这种特性保证了加密后的信息的安全性。
2. 高度不可逆:MD5算法经过了多轮复杂的运算,使得不同的输入信息可以生成不同的哈希值。
即使是原始信息仅有微小的变化,也会导致完全不同的哈希值。
这种高度不可逆的特性保证了加密后的信息的唯一性。
3. 快速计算:MD5算法的计算速度相对较快,能够在很短的时间内完成大量数据的加密。
这为实时加密和大规模数据处理提供了便利。
MD5加密算法在实际应用中有着广泛的用途。
以下是几个典型的应用场景:1. 密码保护:在用户注册和登录过程中,常常需要对密码进行加密存储,以保护用户的账号安全。
MD5加密算法可以对用户输入的密码进行加密,并将加密后的密文存储在数据库中。
在用户登录时,将用户输入的密码再次进行MD5加密,然后与数据库中的密文进行比对,从而验证密码的正确性。
2. 文件完整性校验:MD5算法可以对文件的哈希值进行计算,生成文件的唯一标识。
在文件传输过程中,接收方可以通过计算接收到的文件的哈希值与发送方提供的哈希值进行比对,来验证文件的完整性和准确性。
3. 数字签名:MD5算法可以用于生成数字签名,确保信息的真实性和完整性。
发送方可以将信息的MD5哈希值与信息一同发送给接收方,接收方可以通过重新计算信息的哈希值与接收到的哈希值进行比对,来验证信息的真实性和完整性。
java的md5util.encodemd5string方法
java的md5util.encodemd5string方法Java的MD5Util.encodeMD5String方法是一种常见的加密方法,用于将任意长度的字符串转化成固定长度的MD5值。
在本文中,我们将一步一步地回答有关这个方法的问题,从而全面地了解它的使用和原理。
1. 什么是MD5?MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,常用于对密码或其他敏感信息进行加密。
它产生一个唯一的128位(32个字符)MD5值,不同的输入会产生不同的输出,且无法从MD5值反推出原始数据。
2. 什么是加密方法?加密是一种将数据转化为不可读的密文的过程,以保护数据的安全性。
而加密方法则指用于执行加密操作的算法或函数。
3. MD5Util.encodeMD5String方法的作用是什么?MD5Util.encodeMD5String方法用于将字符串转化为MD5值。
通过将用户输入的字符串进行哈希处理,可以将其变为不可逆的MD5值。
这样一来,即使有人获取了MD5值,也无法从中获取原始数据。
4. 这个方法的使用步骤是什么?使用MD5Util.encodeMD5String方法有以下几个步骤:- 导入MD5Util类。
- 创建一个字符串变量,用来存储需要加密的字符串。
- 调用MD5Util.encodeMD5String方法并传入需要加密的字符串作为参数。
- 获取返回的MD5值并进行后续操作,如存储、比较等。
5. encodeMD5String方法的参数和返回值是什么?encodeMD5String方法的参数是一个字符串类型的明文数据。
它返回一个字符串类型的MD5值,即将明文数据转化后的加密结果。
6. 如何导入MD5Util类?要使用MD5Util类,首先需要确保该类已存在于项目中。
如果该类来自于外部库或框架,则需要先在项目的构建路径中导入相关的依赖。
然后,在Java代码的开头导入MD5Util类。
JavaMD5加密
JavaMD5加密MD5加密很常⽤,⽐如数据库中密码等敏感字段需要加密存储,核对密码时先以同样的⽅式对⽤户输⼊的密码进⾏加密,再与数据库中存储的密码⽐较。
MD5加密有很多种实现⽅式,此处介绍2种。
1、使⽤JDK⾃带MessageDigestpublic class MD5Util {public static String getMD5Str(String str) {byte[] digest = null;try {MessageDigest md5 = MessageDigest.getInstance("md5");digest = md5.digest(str.getBytes("utf-8"));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}//16是表⽰转换为16进制数String md5Str = new BigInteger(1, digest).toString(16);return md5Str;}}2、使⽤Spring⾃带的DigestUtils上⾯是⾃⼰封装,太⿇烦,Spring已经给我们封装好了。
String md5Str = DigestUtils.md5DigestAsHex("原串".getBytes());说明只使⽤md5加密是不⾏的,很容易被破解。
常见的做法有:先对原串进⾏⼀些处理,⽐如先给它拼接⼀个字符串常量,再进⾏md5加密。
即使对⽅解密,也获取不到原串。
使⽤多种加密算法。
⽐如先⽤md5加密,再对加密的结果使⽤其它加密算法进⾏加密。
⽐如先使⽤md5加密,对加密的结果再次使⽤md5加密。
这2种⽅式⽅式经常⼀起使⽤。
Hutool中常用的工具类和方法
Hutool中常⽤的⼯具类和⽅法Convert 类型转换⼯具类,⽤于各种类型数据的转换
DateUtil ⽇期时间⼯具类,定义了⼀些常⽤的⽇期时间操作⽅法
StrUtil 字符串⼯具类,定义了⼀些常⽤的字符串操作⽅法
ReflectUtil Java反射⼯具类,可⽤于反射获取类的⽅法及创建对象
NumberUtil 数字处理⼯具类,可⽤于各种类型数字的加减乘除操作及判断类型(float、double、BigDecimal) BeanUtil JavaBean的⼯具类,可⽤于Map与JavaBean对象的互相转换以及对象属性的拷贝。
CollUtil 集合操作的⼯具类,定义了⼀些常⽤的集合操作。
MapUtil Map操作⼯具类,可⽤于创建Map对象及判断Map是否为空。
AnnotationUtil 注解⼯具类,可⽤于获取注解与注解中指定的值。
SecureUtil 加密解密⼯具类,可⽤于MD5加密。
CaptchaUtil 验证码⼯具类,可⽤于⽣成图形验证码。
HtmlUtil HTML⼯具类
HttpUtil 基于HttpUrlConnection的Http客户端封装
ExcelUtil Excel导⼊导出⼯具类。
Java语言实现MD5加密
Java语⾔实现MD5加密Java 语⾔实现 MD5 加密背景说明在实际项⽬中,为了安全性考虑,经常要求账号密码是以加密后的密⽂形式,保存到数据库中。
这样,即使有⼈获取到了数据库中的密⽂密码,也不知道明⽂密码信息是什么,从⽽防⽌系统被恶意访问。
密码加密有很多种⽅式,⽐如:Base64,DSA,RSA,MD5,SHA128,SHA256,SHA512等加密⽅式。
本⽂主要讲述 MD5 加密⽅式。
MD5 简介MD5 消息摘要算法(英⽂:MD5 Message-D igest Algorithm),⼀种被⼴泛使⽤的,可以产⽣出⼀个128位(16)的散列值(hash value),⽤于确保信息传输完整⼀致。
MD5由美国密码学家(Ronald Linn Rivest)设计,于1992年公开,⽤以取代算法。
MD5应⽤1、数据加密利⽤它的单向加密性,即不可逆性,我们可以应⽤于数据和密码的加密。
由于MD5算法的单向性,由MD5码计算出原⽂⼏乎是不可能的。
⽬前对于这种加密⽅法的破解⽅式是收集常⽤的密码形式,例如⽣⽇,⾝份证号,电话号码等。
把这些收集到的秘密⽤MD5处理之后进⾏存储,然后与需要还原的MD5进⾏⽐对,当收集的数据达到⼀定的数⽬,⽤户密码被破解的可能性就会变得很⼤。
对于这种⽅法,⼀种加强安全性的⽅法就是在对⽤户密码进⾏MD5处理的时候在原密码上加⼀个附近值,例如原密码为“password”,处理的时候变为“passworddrowssap”,经过这样的处理之后可以有效降低密码被破解的可能性。
2、确认⽂件是否被篡改每个⽂件都可以计算出⼀个特定的 MD5 值。
⽐如,我们上传⼀个⽂件到服务器上,可以同时计算出该⽂件对应的 MD5 值;在⽂件下载的时候,通过再次计算该⽂件的 MD5 值。
如果两个MD5值相同,说明⽂件没有变化,否则,说明⽂件被修改过。
Java 语⾔实现 MD5 加密通过Java编写程序,实现对任意字符串进⾏ MD5 加密。
JAVA中简单的MD5加密类(MD5Utils)
JAVA中简单的MD5加密类(MD5Utils)MD5加密分析:JDK API:获取对象的API:加密的API:1package cn.utils;23import java.security.MessageDigest;4import java.security.NoSuchAlgorithmException;56/**7 * @author CQY13 MD5加密⼯具类8*/9public class MD5Utils {1011/**12 * 获取MD5加密13 *14 * @param pwd15 * 需要加密的字符串16 * @return String字符串加密后的字符串17*/18public static String getPwd(String pwd) {19try {20// 创建加密对象21 MessageDigest digest = MessageDigest.getInstance("md5");2223// 调⽤加密对象的⽅法,加密的动作已经完成24byte[] bs = digest.digest(pwd.getBytes());25// 接下来,我们要对加密后的结果,进⾏优化,按照mysql的优化思路⾛26// mysql的优化思路:27// 第⼀步,将数据全部转换成正数:28 String hexString = "";29for (byte b : bs) {30// 第⼀步,将数据全部转换成正数:31// 解释:为什么采⽤b&25532/*33 * b:它本来是⼀个byte类型的数据(1个字节) 255:是⼀个int类型的数据(4个字节)34 * byte类型的数据与int类型的数据进⾏运算,会⾃动类型提升为int类型 eg: b: 1001 1100(原始数据)35 * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 000036 * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 000037 * 0000 0000 1001 1100 此时的temp是⼀个int类型的整数38*/39int temp = b & 255;40// 第⼆步,将所有的数据转换成16进制的形式41// 注意:转换的时候注意if正数>=0&&<16,那么如果使⽤Integer.toHexString(),可能会造成缺少位数42// 因此,需要对temp进⾏判断43if (temp < 16 && temp >= 0) {44// ⼿动补上⼀个“0”45 hexString = hexString + "0" + Integer.toHexString(temp);46 } else {47 hexString = hexString + Integer.toHexString(temp);48 }49 }50return hexString;51 } catch (NoSuchAlgorithmException e) {52// TODO Auto-generated catch block53 e.printStackTrace();54 }55return "";56 }5758/**59 * @param args60*/61public static void main(String[] args) {62 String pwd = MD5Utils.getPwd("abc");63 System.out.println(pwd);64 }6566 }。
md5加密用法范文
md5加密用法范文MD5是一种广泛使用的密码哈希函数,也是一种常见的加密算法。
下面将介绍MD5加密的用法、工作原理、优缺点以及如何使用MD5来加密数据。
一、MD5加密的用法:MD5加密算法最常见的用法是将密码或敏感信息加密存储在数据库中,以保护用户的隐私。
它可以用于用户登录、验证数据完整性、数字签名等应用场景。
MD5加密还常用于文件校验和,用于验证文件在传输过程中是否被修改。
此外,MD5还可以用于生成随机的摘要值,以作为数据的唯一标识。
二、MD5加密的工作原理:MD5加密算法是将输入的数据(如密码、文本等)通过MD5算法计算得到128位(16字节)的哈希值,这个哈希值是一个固定长度的串。
MD5算法的工作原理如下:1.对输入数据进行数据填充,使得输入数据长度满足512位的倍数。
2.将填充后的数据分为若干个512位(64字节)的分组。
3.对每个分组进行四轮运算(将初始的4个32位的寄存器每轮更新一次),最终得到每个分组的消息摘要。
4.将所有分组的消息摘要连接起来,得到最终的MD5哈希值。
三、MD5加密的优缺点:MD5加密算法有一些优点,如加密速度快、生成的哈希值固定长度等。
然而,MD5加密也存在一些缺点,导致现在已不再推荐使用:1.易碰撞:MD5算法被广泛破解,存在碰撞问题。
也就是说,不同的输入可能导致相同的MD5哈希值,这降低了MD5的安全性。
2.易被暴力破解:MD5哈希值可以通过穷举法暴力破解,也就是通过尝试将不同的输入与目标MD5哈希值进行比对,找到对应的明文。
3.不抗彩虹表攻击:彩虹表是一种预先计算的哈希表,用于快速破解MD5哈希值。
通过使用彩虹表,黑客可以更快地找到对应的明文。
基于以上缺点,现在通常不再推荐使用MD5加密算法来存储密码等敏感信息。
而是采用更为安全的加密算法,如SHA-256四、如何使用MD5来加密数据:尽管MD5算法已被破解,并不再安全,这里还是介绍一下如何使用MD5来加密数据。
JAVA中使用MD5加密工具类实现对数据的加密处理
JAVA中使⽤MD5加密⼯具类实现对数据的加密处理1.MD5⼯具类package com.ssm.util;import java.security.MessageDigest;public class MD5Util {//将字节数组转成⼗六进制字符串private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}//对单个字节转换成整数进⾏取商取余数计算private static String byteToHexString(byte b) {int n = b;if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;//根据下标d1,d2去数组hexDigits的数据return hexDigits[d1] + hexDigits[d2];}public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);// 获得MD5摘要算法的 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))//将加密之后的字节数据转换成16进制的字符串resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};}2.在登录注册中使⽤MD5加密算法 demo⽬录结构 数据库⽤户表CREATE TABLE `user` (`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`userName` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '⽤户名',`password` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '密码',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci pojo对象User.javapackage com.ssm.pojo;public class User {private Integer id;private String userName;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}2.1DAO层 DAO层:DAO层主要是做数据持久层的⼯作,负责与数据库进⾏联络的⼀些任务都封装在此,DAO层的设计⾸先是设计DAO的接⼝,然后在Spring的配置⽂件中定义此接⼝的实现类,然后就可在模块中调⽤此接⼝来进⾏数据业务的处理,⽽不⽤关⼼此接⼝的具体实现类是哪个类,显得结构⾮常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置⽂件中进⾏配置。
java MD5加密工具类
package com.person.util;import ng.reflect.Array;public class MD5 {/* 下面这些S11-S44实际上是\uFFFD \uFFFD4*4的矩阵,在原始的C实现中是\uFFFD#define 现的,这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多\uFFFD Instance 共\uFFFD*/static final int S11 = 7;static final int S12 = 12;static final int S13 = 17;static final int S14 = 22;static final int S21 = 5;static final int S22 = 9;static final int S23 = 14;static final int S24 = 20;static final int S31 = 4;static final int S32 = 11;static final int S33 = 16;static final int S34 = 23;static final int S41 = 6;static final int S42 = 10;static final int S43 = 15;static final int S44 = 21;static final byte[] PADDING = {-128, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* 面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现\uFFFD 定义到MD5_CTX结构\uFFFD*/private long[] state = new long[4]; // state (ABCD)private long[] count = new long[2]; // number of bits, modulo 2^64 (lsb first)private byte[] buffer = new byte[64]; // input buffer/* digestHexStr MD5的唯\uFFFD \uFFFD个公共成员,是最新一次计算结果的\uFFFD 16 制ASCII表示.*/public String digestHexStr;/* digest,是最新一次计算结果的2进制内部表示,表\uFFFD128bit MD5\uFFFD.*/private byte[] digest = new byte[16];/*getMD5ofStr 类MD5\uFFFD 要的公共方法,入口参数是你想要进行MD5变换的字符串返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.*/public String getMD5ofStr(String inbuf) {md5Init();md5Update(inbuf.getBytes(), inbuf.length());md5Final();digestHexStr = "";for (int i = 0; i < 16; i++) {digestHexStr += byteHEX(digest[i]);}return digestHexStr;}// 这是MD5这个类的标准构\uFFFD 数,JavaBean要求有一个public的并且没有参数的构\uFFFD \uFFFDpublic MD5() {md5Init();return;}/* md5Init 一个初始化函数,初始化核心变量,装入标准的幻数*/private void md5Init() {count[0] = 0L;count[1] = 0L;///* Load magic initialization constants.state[0] = 0x67452301L;state[1] = 0xefcdab89L;state[2] = 0x98badcfeL;state[3] = 0x10325476L;return;/* F, G, H ,I \uFFFD4 基本的MD5函数,在原始的MD5的C实现中,由于它们\uFFFD \uFFFD单的位运算,可能出于效率的\uFFFD 把它们实现成了宏,在java中,我们把它\uFFFD\uFFFD\uFFFD 现成了private方法,名字保持了原来C中的\uFFFD */private long F(long x, long y, long z) {return (x & y) | ((~x) & z);}private long G(long x, long y, long z) {return (x & z) | (y & (~z));}private long H(long x, long y, long z) {return x ^ y ^ z;}private long I(long x, long y, long z) {return y ^ (x | (~z));}/*FF,GG,HH II将调用F,G,H,I进行近一步变\uFFFDFF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.Rotation is separate from addition to prevent recomputation.*/private long FF(long a, long b, long c, long d, long x, long s,long ac) {a += F(b, c, d) + x + ac;a = ((int) a << s) | ((int) a >>> (32 - s));a += b;return a;}private long GG(long a, long b, long c, long d, long x, long s,long ac) {a += G(b, c, d) + x + ac;a = ((int) a << s) | ((int) a >>> (32 - s));a += b;return a;private long HH(long a, long b, long c, long d, long x, long s,long ac) {a += H(b, c, d) + x + ac;a = ((int) a << s) | ((int) a >>> (32 - s));a += b;return a;}private long II(long a, long b, long c, long d, long x, long s,long ac) {a += I(b, c, d) + x + ac;a = ((int) a << s) | ((int) a >>> (32 - s));a += b;return a;}/*md5Update MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private\uFFFD */private void md5Update(byte[] inbuf, int inputLen) {int i, index, partLen;byte[] block = new byte[64];index = (int) (count[0] >>> 3) & 0x3F;// /* Update number of bits */if ((count[0] += (inputLen << 3)) < (inputLen << 3))count[1]++;count[1] += (inputLen >>> 29);partLen = 64 - index;// Transform as many times as possible.if (inputLen >= partLen) {md5Memcpy(buffer, inbuf, index, 0, partLen);md5Transform(buffer);for (i = partLen; i + 63 < inputLen; i += 64) {md5Memcpy(block, inbuf, 0, i, 64);md5Transform(block);}index = 0;} elsei = 0;///* Buffer remaining input */md5Memcpy(buffer, inbuf, index, i, inputLen - i);}/*md5Final 理和填写输出结\uFFFD*/private void md5Final() {byte[] bits = new byte[8];int index, padLen;///* Save number of bits */Encode(bits, count, 8);///* Pad out to 56 mod 64.index = (int) (count[0] >>> 3) & 0x3f;padLen = (index < 56) ? (56 - index) : (120 - index);md5Update(PADDING, padLen);///* Append length (before padding) */md5Update(bits, 8);///* Store state in digest */Encode(digest, state, 16);}/* md5Memcpy 一个内部使用的byte数组的块拷贝函数,从input的inpos\uFFFD 把len 长度\uFFFD\uFFFD\uFFFD \uFFFD\uFFFD \uFFFD 字节拷贝到output的outpos位置\uFFFD \uFFFD */private void md5Memcpy(byte[] output, byte[] input,int outpos, int inpos, int len) {int i;for (i = 0; i < len; i++)output[outpos + i] = input[inpos + i];}/*md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节*/private void md5Transform(byte block[]) {long a = state[0], b = state[1], c = state[2], d = state[3];long[] x = new long[16];Decode(x, block, 64);/* Round 1 */a = FF(a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */d = FF(d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */c = FF(c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */b = FF(b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */a = FF(a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */d = FF(d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */c = FF(c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */b = FF(b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */a = FF(a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */d = FF(d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */c = FF(c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */b = FF(b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */a = FF(a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */d = FF(d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */c = FF(c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */b = FF(b, c, d, a, x[15], S14, 0x49b40821L); /* 16 *//* Round 2 */a = GG(a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */d = GG(d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */c = GG(c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */b = GG(b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */a = GG(a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */d = GG(d, a, b, c, x[10], S22, 0x2441453L); /* 22 */c = GG(c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */b = GG(b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */a = GG(a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */d = GG(d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */c = GG(c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */b = GG(b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */a = GG(a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */d = GG(d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */ c = GG(c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */ b = GG(b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 *//* Round 3 */a = HH(a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */ d = HH(d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */ c = HH(c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */b = HH(b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */ a = HH(a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */ d = HH(d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */c = HH(c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */ b = HH(b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */ a = HH(a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */d = HH(d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */ c = HH(c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */ b = HH(b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */ a = HH(a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */ d = HH(d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */ c = HH(c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */ b = HH(b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 *//* Round 4 */a = II(a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */d = II(d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */c = II(c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */ b = II(b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */a = II(a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */ d = II(d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */c = II(c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */b = II(b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */a = II(a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */d = II(d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */ c = II(c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */b = II(b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */ a = II(a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */d = II(d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */ c = II(c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */b = II(b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */state[0] += a;state[1] += b;state[2] += c;state[3] += d;}/*Encode把long数组按顺序拆成byte数组,因为java的long类型\uFFFD64bit ,只拆\uFFFD32bit 以适应原始C实现的用\uFFFD*/private void Encode(byte[] output, long[] input, int len) {int i, j;for (i = 0, j = 0; j < len; i++, j += 4) {output[j] = (byte) (input[i] & 0xffL);output[j + 1] = (byte) ((input[i] >>> 8) & 0xffL);output[j + 2] = (byte) ((input[i] >>> 16) & 0xffL);output[j + 3] = (byte) ((input[i] >>> 24) & 0xffL);}}/*Decode byte数组按顺序合成成long数组,因为java的long类型\uFFFD64bit ,只合成低32bit,高32bit清零,以适应原始C实现的用\uFFFD*/private void Decode(long[] output, byte[] input, int len) {int i, j;for (i = 0, j = 0; j < len; i++, j += 4)output[i] = b2iu(input[j]) |(b2iu(input[j + 1]) << 8) |(b2iu(input[j + 2]) << 16) |(b2iu(input[j + 3]) << 24);return;}/*b2iu 我写的\uFFFD 把byte按照不\uFFFD 正负号的原则的"升位"程序,因为java 没有unsigned运算*/public static long b2iu(byte b) {return b < 0 ? b & 0x7F + 128 : b;}/*byteHEX(),用来把\uFFFD byte类型的数转换成十六进制的ASCII表示\uFFFD\uFFFD因为java中的byte的toString无法实现这一点,我们又没有C语言中的sprintf(outbuf,"%02X",ib)*/public static String byteHEX(byte ib) {char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F'};char [] ob = new char[2];ob[0] = Digit[(ib >>> 4) & 0X0F];ob[1] = Digit[ib & 0X0F];String s = new String(ob);return s;}public static void main(String args[]) {MD5 m = new MD5();if (Array.getLength(args) == 0) { //如果没有参数,执行标准的Test SuiteSystem.out.println("MD5 Test suite:");System.out.println("MD5(\"\"):" + m.getMD5ofStr(""));System.out.println("MD5(\"a\"):" + m.getMD5ofStr("a"));System.out.println("MD5(\"abc\"):" + m.getMD5ofStr("abc"));System.out.println("MD5(\"message digest\"):" + m.getMD5ofStr("message digest"));System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):" +m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw xyz0123456789\"):" +m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345 6789"));} elseSystem.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));}}。
MD5加密——精选推荐
MD5加密MD5加密算法⼜称-- 数据摘要算法、数据指纹算法------------------------------------------------特点:◇任意长度的⼆进制数, 经过MD5加密计算后, 都可以得到⼀个128位长的⼆进制密⽂◇相同的原⽂经过加密后得到的密⽂永远相同◇不同的原⽂经过加密后得到的密⽂永远不同◇只能从原⽂加密成密⽂, 密⽂永远也解不回原⽂MD5加密算法在很多应⽤场景下都有所应⽤------------------------------------------------MD5应⽤:1.创建MD5Utils⼯具类, 提供md5⽅法实现MD5加密功能/*** 使⽤md5的算法进⾏加密*/public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}2.在实现登陆功能时, 密码应该先加密再和数据库中的密码做⽐较password = MD5Utils.md5(password);3.在实现注册功能时, 密码应该先加密再存⼊数据库user.setPassword(MD5Utils.md5(password));service.registuser(user);4.实现⾃动登陆功能时, 在将⽤户名和密码保存进Cookie之前, 需要将密码加密后再保存进Cookie(步骤2已实现)。
MD5签名算法工具类
MD5签名算法⼯具类 MD5加密本⾝是不可逆的,⽆法对加密之后的报⽂进⾏解密。
⼀般⽤作签名算法,⽤来检查报⽂是否被窜改。
实际应使⽤加盐加密来确保数据的安全性。
import ng3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.security.MessageDigest;/*** MD5算法不可逆,⽤于校验报⽂窜改*/public class MD5Utils {private static final Logger LOGGER = LoggerFactory.getLogger(MD5Utils.class);private static final char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};private static final String MD5 = "MD5";private static final String ENCODING = "UTF-8";/*** MD⼀次加密* @param string 待加密内容* @return*/public static String getMD5(String string){if(StringUtils.isBlank(string)){("MD5 encrypt string is null");return null;}try {//获得待加密内容的字节数组byte[] bytes = string.getBytes(ENCODING);//初始化加密⼯具类MessageDigest md5 = MessageDigest.getInstance(MD5);md5.update(bytes);byte[] digest = md5.digest();int j = digest.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = digest[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {(e.getMessage());return null;}}/*** MD5⼆次加密* @param string 待加密内容* @return*/public static String getMd5X2(String string){return getMD5(getMD5(string));}/*** MD5多次加密* @param string 待加密内容* @param times 加密次数* @return*/public static String getMd5Times(String string, int times){for(int i = 0; i < times; i++){string = getMD5(string);}return string;}/*** MD5加盐加密* @param string 待加密的内容* @param salt 盐* @return*/public static String getMD5WithSalt(String string, String salt){ return getMD5(string + salt);}public static void main(String[] args) {String str = "MD5测试";String s = getMD5(str);System.out.println("MD5⼀次加密:" + s);System.out.println("MD5⼆次加密:" + getMd5X2(str));String withSalt = getMD5WithSalt(str, "123456");System.out.println("MD5⼀次加盐加密:" + withSalt);}}。
secureutil 用法
secureutil 用法SecureUtil 是Hutool 开源工具包中的一个模块,用于提供各种安全相关的工具方法。
它封装了一些常用的加密、解密、签名和校验等功能,方便开发者在项目中使用。
本文将逐步介绍SecureUtil 的用法,帮助读者更好地理解和应用这个工具。
首先,我们需要在项目中引入Hutool 的核心包。
在Maven 项目中,可以在pom.xml 文件中添加以下依赖:xml<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.10</version></dependency>导入依赖后,我们就可以开始使用SecureUtil 提供的功能了。
下面将按照功能分类介绍SecureUtil 的常用用法。
1. 加密与解密SecureUtil 提供了多种常见的加密与解密算法,如MD5、SHA1、SHA256、DES、AES 等。
我们可以通过加密工具类调用对应的方法进行加密或解密操作。
例如,我们要对一个字符串进行MD5 加密,可以使用以下代码:javaString str = "hutool";String md5 = SecureUtil.md5(str);System.out.println(md5);输出结果为:`cdcd8a0fc5d5baf161340c4a0fd8dcca`类似地,我们可以使用其他算法进行加密或解密操作,比如SHA1 加密:javaString sha1 = SecureUtil.sha1(str);System.out.println(sha1);输出结果为:`34cc16a44a5c2f02582b97f971daeb5a3b0b9807`2. 签名与校验SecureUtil 还提供了一些常见的签名与校验算法,如HMAC、RSA、DSA 等。