《 Java实现MD5加盐加密算法 》

现在一般的MD5加密在网上随随便便就能解密,解密的网站有以下一个:

http://pmd5.com/

http://www.cmd5.com/

http://tool.chinaz.com/tools/md5.aspx

数据通过MD5加密后,可以轻松的通过上面的工具解密,但是为了提高密码的安全性,可以使用Java实现MD5的随机加盐加密,这样以来就很难解密了,必须使用原密码才能正常的登录系统了,以下为Java实现的MD5随机加盐加密,以及使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转:

MD5Utils工具类:

package com.etc.cls.img.main.utils;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;import org.apache.commons.codec.binary.Hex;/*** MD5加密解密工具类* <p>* * @ClassName : PassWordUtils*            </p>*            <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com*                     </p>*                     <p>* @Date : 2017年12月26日 下午2:44:14*       </p>* *       <p>* @Version : V1.0.0*          </p>**/
public class MD5Utils {/*** 普通MD5加密 01* <p>* * @Title : getStrMD5*        </p>*        <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @Date : 2017年12月26日 下午2:49:44*       </p>*/public static String getStrMD5(String inStr) {// 获取MD5实例MessageDigest md5 = null;try {md5 = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {e.printStackTrace();System.out.println(e.toString());return "";}// 将加密字符串转换为字符数组char[] charArray = inStr.toCharArray();byte[] byteArray = new byte[charArray.length];// 开始加密for (int i = 0; i < charArray.length; i++)byteArray[i] = (byte) charArray[i];byte[] digest = md5.digest(byteArray);StringBuilder sb = new StringBuilder();for (int i = 0; i < digest.length; i++) {int var = digest[i] & 0xff;if (var < 16)sb.append("0");sb.append(Integer.toHexString(var));}return sb.toString();}/*** 普通MD5加密 02* <p>* * @Title : getStrrMD5*        </p>*        <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @Date : 2017年12月27日 上午11:18:39*       </p>*/public static String getStrrMD5(String password) {char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };try {byte strTemp[] = password.getBytes("UTF-8");MessageDigest mdTemp = MessageDigest.getInstance("MD5");mdTemp.update(strTemp);byte md[] = mdTemp.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 15];str[k++] = hexDigits[byte0 & 15];}return new String(str);} catch (Exception e) {return null;}}/*** MD5双重解密* <p>* * @Title : getconvertMD5*        </p>*        <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @Date : 2017年12月26日 下午3:34:17*       </p>*/public static String getconvertMD5(String inStr) {char[] charArray = inStr.toCharArray();for (int i = 0; i < charArray.length; i++) {charArray[i] = (char) (charArray[i] ^ 't');}String str = String.valueOf(charArray);return str;}/*** 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转* <p>* * @Title : md5Hex*        </p>*        <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @Date : 2017年12月27日 上午11:28:25*       </p>*/@SuppressWarnings("unused")private static String md5Hex(String str) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] digest = md.digest(str.getBytes());return new String(new Hex().encode(digest));} catch (Exception e) {e.printStackTrace();System.out.println(e.toString());return "";}}/*** 加盐MD5加密* <p>* * @Title : getSaltMD5*        </p>*        <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @Date : 2017年12月27日 上午11:21:00*       </p>*/public static String getSaltMD5(String password) {// 生成一个16位的随机数Random random = new Random();StringBuilder sBuilder = new StringBuilder(16);sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));int len = sBuilder.length();if (len < 16) {for (int i = 0; i < 16 - len; i++) {sBuilder.append("0");}}// 生成最终的加密盐String Salt = sBuilder.toString();password = md5Hex(password + Salt);char[] cs = new char[48];for (int i = 0; i < 48; i += 3) {cs[i] = password.charAt(i / 3 * 2);char c = Salt.charAt(i / 3);cs[i + 1] = c;cs[i + 2] = password.charAt(i / 3 * 2 + 1);}return String.valueOf(cs);}/*** 验证加盐后是否和原文一致* <p>* * @Title : verifyMD5*        </p>*        <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @Date : 2017年12月27日 下午2:22:22*       </p>*/public static boolean getSaltverifyMD5(String password, String md5str) {char[] cs1 = new char[32];char[] cs2 = new char[16];for (int i = 0; i < 48; i += 3) {cs1[i / 3 * 2] = md5str.charAt(i);cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2);cs2[i / 3] = md5str.charAt(i + 1);}String Salt = new String(cs2);return md5Hex(password + Salt).equals(String.valueOf(cs1));}}

程序入口:

package com.etc.cls.img.main;import com.etc.cls.img.main.utils.MD5Utils;/*** 程序启动入口* <p>* * @ClassName : ClsMain*            </p>*            <p>* @Description : TODO*              </p>*              <p>* @Author : HuaZai*         </p>*         <p>* @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com*                     </p>*                     <p>* @Date : 2017年12月20日 下午4:37:54*       </p>* *       <p>* @Version : V1.0.0*          </p>**/
public class ClsMain {@SuppressWarnings("static-access")public static void main(String[] args) {MD5Utils md = new MD5Utils();String strMD5 = new String("12345");System.out.println("原始:" + strMD5);System.out.println("东东的:" + md.getStrrMD5(strMD5));System.out.println("MD5后:" + md.getStrMD5(strMD5));System.out.println("加密的:" + md.getconvertMD5(strMD5));System.out.println("解密的:" + md.getconvertMD5(md.getconvertMD5(strMD5)));System.out.println("\t\t=======================================");// 原文String plaintext = "huazai";// plaintext = "123456";System.out.println("原始:" + plaintext);System.out.println("普通MD5后:" + MD5Utils.getStrMD5(plaintext));// 获取加盐后的MD5值String ciphertext = MD5Utils.getSaltMD5(plaintext);System.out.println("加盐后MD5:" + ciphertext);System.out.println("是否是同一字符串:" + MD5Utils.getSaltverifyMD5(plaintext, ciphertext));/*** 其中某次DingSai字符串的MD5值*/String[] tempSalt = { "810e1ee9ee5e28188658f431451a29c2d81048de6a108e8a","66db82d9da2e35c95416471a147d12e46925d38e1185c043","61a718e4c15d914504a41d95230087a51816632183732b5a" };for (String temp : tempSalt) {System.out.println("是否是同一字符串:" + MD5Utils.getSaltverifyMD5(plaintext, temp));}}}

使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转 需要的Jar包下载:

commons-codec-1.11 CSDN下载

Java实现MD5加盐加密算法相关推荐

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

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

  2. Scala / Java - 采用 MD5 加盐 实现 id 均匀分组

    一.引言 大量 id 场景下经常需要通过 id 进行 AB Test,最常见的就是使用尾号 hash 进行分组,但是由于 id 生成规则以及其他因素,按照尾号分组往往会造成 id 不匀,从而导致 AB ...

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

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

  4. MD5加盐加密工具类(可直接使用)

    MD5加盐加密工具类 在我们做项目时,涉及到用户密码,而正常来说数据库中不会直接存储明文的密码,都是加密之后的密码. 密码加密的方式有很多,比如: ① 3DES.AES.DES:使用对称加密算法,可以 ...

  5. SpringBoot 系列教程(八十五):Spring Boot使用MD5加盐验签Api接口之前后端分离架构设计

    加密算法参考: 浅谈常见的七种加密算法及实现 加密算法参考: 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 目的: 通过对API接口请求报文签名,后端进行验签处理, ...

  6. 解决方案:加盐加密算法BCrypt

    解决方案:加盐加密算法BCrypt 关键词 对称加密(单钥),非对称加密(公私钥),数字签名 BCrypt加密(加盐) 一.对称加密算法 (1)定义: 采用单钥密码系统的加密方法,同一个密钥可以同时用 ...

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

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

  8. 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

    RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网 ...

  9. 一文读懂md5,md5有什么用,什么是md5加盐

    md5是一种密码散列函数,在计算机安全领域得到广泛的应用.本文将带大家了解一些md5的知识点,什么是md5,md5有什么用,什么是md5加盐,为什么md5不可逆,为什么md5可能会被解密?帮助大家快速 ...

  10. 【甄选靶场】Vulnhub百个项目渗透——项目四十二:Moria1.1(MD5加盐爆破)

    Vulnhub百个项目渗透 Vulnhub百个项目渗透--项目四十二:Moria1.1(MD5加盐爆破)

最新文章

  1. SQL Server 数据库崩溃后的恢复之法
  2. 【机器学习】Python机器学习的神器- Scikit-learn使用说明
  3. SQLAlchemy
  4. 排毒食物 红糖可补血美体排毒
  5. 思科:多款主流信息传递应用程序易遭到会话劫持
  6. adb shell循环命令_Android adb 命令使用总结
  7. grafana 中国地图 echarts
  8. 劳务派遣计算机信息管理系统,劳务派遣人员信息管理系统
  9. APP(Android)性能测试实例(查询FPS/内存/CPU)【Appetizer+PerfDog】
  10. vscode快建创建vue模板
  11. 传奇服务器端显示时间问题,架设传奇出现is not a valid date and time时间错误
  12. python编程选股_python编写选股公式
  13. git rebase 命令 常用_git rebase命令
  14. 深度解析上海互联网产业为何沉沦
  15. Swift-Tips之rounded(_:)
  16. Python免费发短信
  17. automagica 调用windows画图以及登录qq
  18. Android常见系统问题分析工具
  19. 面试官让你说说你的缺点,你该怎么回答
  20. mysql万能标签调用字段_万能循环(Loop)标签与万能调用(SQL)标签

热门文章

  1. 文字转语音软件真人发声(声音自然有感情)
  2. tomcat8下载时各个版本的说明
  3. 福特dms系统服务器,长安福特DMS使用规范.pdf
  4. 下划线小写字母转大写
  5. 搭建Linux虚拟机并编写简单程序
  6. 经典sql练习题(oracle版)
  7. Ardunio开发实例-WS2812B独立寻址LED调色调光
  8. tftpd64-SE使用
  9. excel如何比对两列数据是否相同
  10. 【windows10】 CH340/CH341 USB转串口驱动安装