MD5加盐加密工具类

在我们做项目时,涉及到用户密码,而正常来说数据库中不会直接存储明文的密码,都是加密之后的密码。

密码加密的方式有很多,比如:

① 3DES、AES、DES:使用对称加密算法,可以通过解密来还原出原始密码

② MD5、SHA1:使用单向HASH算法,无法通过计算还原出原始密码,但是可以建立彩虹表进行查表破解

简单的MD5解密方法需要用到这个网站(有兴趣的小伙伴可以自己试一试),免费MD5解密网站:https://md5.cn/

使用MD5可进行加盐加密,保证安全,下面给大家分享项目中用到的MD5加盐加密工具类。

  • 将密码加密加盐
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);}
  • 验证密码(登录时传入密码)
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());// 生成输入口令的消息摘要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;}}
  • 完整工具类代码如下
package com.codingfuture.utils;import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;public class MD5SaltUtil {private static final String HEX_NUMS_STR = "0123456789ABCDEF";private static final Integer SALT_LENGTH = 12;//将16进制字符转换为字节数组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进制字符串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();}//验证口令是否合法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());// 生成输入口令的消息摘要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;}}//获得加密后的口令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);}
}

要了解更多的密码加密方式可以看下面这个博主的文章:
https://blog.csdn.net/ZGL_cyy/article/details/113826689?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166089218916782391890906%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166089218916782391890906&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-7-113826689-null-null.142v42control,185v2control&utm_term=%E5%AF%86%E7%A0%81%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187

MD5加盐加密工具类(可直接使用)相关推荐

  1. MD5加盐加密工具类

    直接使用MD5加密,能被解密网站破解,因此在加密的时候可以加个盐值.工具类如下: import org.apache.commons.codec.binary.Base64; import java. ...

  2. 密码MD5加盐加密----注册、校验、修改模块

    思路:     单纯的MD5加密容易被碰撞破解,考虑将密码加上一个随机字符串(盐),再一同进行MD5加密,提高安全性. 此时,盐相当于另一半秘钥,需将盐一同存入数据库,用以验证. 实现过程:      ...

  3. md5加密,md5加盐加密和解密

    package com.java.test;import java.security.MessageDigest; import java.security.SecureRandom; import ...

  4. java md5加盐与解密_md5加密,md5加盐加密和解密

    packagecom.java.test;importjava.security.MessageDigest;importjava.security.SecureRandom;importjava.u ...

  5. mysql md5 加盐加密_MD5—加密,加盐

    packagecom.demo.tools;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException ...

  6. ios MD5加盐加密

    MD5加密 是HASH算法一种. 是生成32位的数字字母混合码. MD5主要特点是 不可逆 MD5算法还具有以下性质: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的.2.容易计算:从原数据 ...

  7. SpringBooot MD5加盐加密

    String pwd = userInfo.getPassword();//随机生成密码盐(字符)String str = "abcdefghijklmnopqrstuvwxyzABCDEF ...

  8. Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理

    前言 在开发的时候,有一些敏感信息是不能直接通过明白直接保存到数据库的.最经典的就是密码了.如果直接把密码以明文的形式入库,不仅会泄露用户的隐私,对系统也是极其的不厉,这样做是非常危险的. 那么我们就 ...

  9. 基于java注册登录MD5算法加盐加密颁发 Token身份令牌使用各种邮箱发送验证码详解雪花算法

    目的作用 == 在项目中,为了防止别人窥视我们的密码通常我们会采取一些加密方式.这里简单介绍一下MD5 加盐加密方法,MD5叫做信息-摘要算法,严格来说不是加密方式,而是信息摘要. 对于可以接触到数据 ...

最新文章

  1. IT界顶级大咖讲解如何获得月薪5万以上的秘诀干货!
  2. 『科学计算』科学绘图库matplotlib练习
  3. 搜索提示的实现(仿百度):附源码和在线demo
  4. linux查进程内存问题,关于linux下内存问题排查的工具
  5. Linux系统中DHCP的配置
  6. 语音识别算法有哪些_语音识别特征提取方法
  7. 编程常用英语单词(一)
  8. 微信公众号标题怎么写更吸引人?
  9. Python 使用xlsxwriter绘制Excel表格
  10. 分享一个android手机开不了机的问题
  11. java.lang.IllegalStateException: Already resumed, but proposed with update xxxx
  12. DCDC开关电源学习
  13. 2023 计算机职业规划
  14. 中国电影院排行 API数据接口
  15. DimLayer实现和setRelativeLayer分析【Android12】
  16. android 8.0预装APK为可卸载
  17. Thread类的基本用法
  18. 了解Chatgpt key token计价或扣费说明
  19. java pv实现_java实现UV.PV.IP统计的实现源码包
  20. 5G网络的应用,给物联网的发展带来了哪些机遇?

热门文章

  1. STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
  2. u盘的文件删了最简单恢复
  3. 使用朴素贝叶斯算法,通过用户安装的APP列表来推测用户的性别
  4. 服务器手工修改进程资源,图解Total Commander 7.0之22项更新与改进(推荐)
  5. 戴尔灵越7590电脑风扇起飞,噪音特大
  6. iOS 音频播放 —— AVAudioSession
  7. Cocos Creator 3.x 热更新
  8. RN开发实践——仿携程App(三)
  9. c语言学生信息管理系统实验报告
  10. 世界前 1000 顶级计算机科学家名单出炉;Java25岁生日官方启动最佳JDK功能票选活动...