什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?】

标题:

【修真院java小课堂】MD5等常用加密方式的简介

开场语:

大家好,我是IT修真院上海分院第10期的学员许东杰,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务5,深度思考中的知识点——什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?

(1)背景介绍:

安全问题已经成为一个越来越重要的问题,在数据的传输过程中如何对重要数据进行加密解密是本课堂的主要内容。

(2)知识剖析:

加密中常见的算法种类及特点:

1、散列函数(hash):用来验证数据完整性的(不是用来加密解密),由于转化不可逆可以用来进行一些验证。常见散列算法:MD5(消息摘要、摘要长度默认128bit)、SHA、MAC(HMAC) 它们的总体安全性是逐步递增的

2、对称加密算法:通过相同密匙进行加密解密,可逆,用来加密解密。常见对称加密算法:DES算法、AED算法

3、非对称加密算法:密匙分为公钥(公开)和私钥(自己保存)。常见非对称加密算法:DH、RSA

加密过程中的两种数据转换:

传入的字符串-->字节数组-->加密过后的字节数组-->转为base64二进制字符进行传输

举例:一个128bit摘要长度的字符串,转为base64二进制字符串是:128/8* (4/3)=22个字符

传入的字符串-->字节数组-->加密过后的字节数组-->转为16进制字符串进行http传输

举例:一个128bit摘要长度的字符串,转为十六进制字符串是:(128/8)*2=32个字符

(3)常见问题:

MD5怎么使用,怎么提高它的安全性

(4)解决方案:

MD5虽然是不可逆的,但是可以通过彩虹码等进行破解

所以为了解决MD5安全性不高的问题,我们采取加盐的方式和HMACMD5(加密匙)方式来使用

(5)编码实战:

MD5加密测试

public class Md5Util {  

    /** 

     * 根据输入的字符串生成固定的32位MD5码 

     *  

     * @param str 

     *            输入的字符串 

     * @return MD5码 

     */  

    public final static String getMd5(String str) {  

        MessageDigest mdInst = null;  //加密实列

        try {  

            mdInst = MessageDigest.getInstance("MD5");  //确定方式

        } catch (NoSuchAlgorithmException e) {  

            e.printStackTrace();  

        }  

        mdInst.update(str.getBytes());// 使用指定的字节更新摘要  

        byte[] md = mdInst.digest();// 获得密文  

        return StrConvertUtil.byteArrToHexStr(md);  

    }  

MD5加随机盐测试

public static String generate(String password) {

Random r = new Random();

  StringBuilder sb = new StringBuilder(16);

  sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));

  int len = sb.length();

  if (len < 16) {

  for (int i = 0; i < 16 - len; i++) {

  sb.append("0");

  }

  }

  String salt = sb.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);//取出password前48位字符组成的数组

  }

return new String(cs);//数组转字符串,就是加盐md5消息摘要后的string值

}

//随机盐有两种盐的存放:一种取出放数据库,直接通过算法放到加密后的字符串里面

HMACMD5测试

public static String jdkHmacMD5(String src,String akey) {  

try {

KeyGenerator keygenrator = KeyGenerator.getInstance("HmacMD5");

    SecretKey secretkey=keygenrator.generateKey();//产生密匙

    //byte[] key=secretkey.getEncoded();//获取密匙

    byte[] key=akey.getBytes(); 

    

   SecretKey restore=new SecretKeySpec(key,"HmacMD5"); //还原密匙

   Mac mac=Mac.getInstance(restore.getAlgorithm());//实例化mac

   mac.init(restore);//初始化

   byte[] hmacmd5byte=mac.doFinal(src.getBytes());//执行摘要

   //System.out.println(new String(Hex.encodeHex(hmacmd5byte)));

   return (new String(Hex.encodeHex(hmacmd5byte)));    

} catch (Exception e) {

e.printStackTrace();

return null;

}

   

   

}

(6)拓展思考:

对称加密算法

DES算法测试

public static String jdkHmacMD5(String src,String akey) {//加入自定义密匙  

try {

KeyGenerator keygenrator = KeyGenerator.getInstance("HmacMD5");

    SecretKey secretkey=keygenrator.generateKey();//产生密匙

    //byte[] key=secretkey.getEncoded();//获取密匙

    byte[] key=akey.getBytes();     

   SecretKey restore=new SecretKeySpec(key,"HmacMD5"); //还原密匙

   Mac mac=Mac.getInstance(restore.getAlgorithm());//实例化mac

   mac.init(restore);//初始化

   byte[] hmacmd5byte=mac.doFinal(src.getBytes());//执行摘要

   //System.out.println(new String(Hex.encodeHex(hmacmd5byte)));

   return (new String(Hex.encodeHex(hmacmd5byte)));    

} catch (Exception e) {

e.printStackTrace();

return null;

}    

}

AES算法加密测试

public static String encrypt(String content,String password) {

        try {

            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器

            byte[] byteContent = content.getBytes("utf-8");

            cipher.init(Cipher.ENCRYPT_MODE,getSecretKey(password));// 初始化为加密模式的密码器

            byte[] result = cipher.doFinal(byteContent);// 加密

            

            return StrConvertUtil.byteArrToHexStr(result);//通过方法转码返回16进制字符串

            

        } catch (Exception ex) {

            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE,null,ex);

        }

        return null;

    }

(7)参考文献:

百度、谷歌

(8)更多讨论:

Q1:提问人:为什么要用base64算法? A1:用64个可打印字符替代所有的二进制字符来进行http网络数据的传递(因为只有那64个可打印字符才能进行http数据传递)

Q2:加密有哪些应用场景 A2:消息摘要用来进行验证消息的完整性 ,也可以进行一些验证(登录验证) ,传递数据,通过和对方共享密匙和算法,就可以对数据进行加密传递。

Q3:提问人:什么是非对称加密? A3:密匙分为公钥(公开)和私钥(自己保存)。常见非对称加密算法:DH、RSA

(9)鸣谢:

感谢朱明星师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:,初学者转行到互联网的聚集地

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从来没有最好的K-V系统,只有最适合应用业务实际场景的系统,做任何的方案选择,要结合业务当前的实际情况综合权衡,有所取有所舍。
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确统计,原因在于gitlab的host设置了strict-origin-when-cross-origin, 导致不蒜子不能正确获取referer,从而PV只能统计到网站的PV。 为了方便统计页面的PV,这里简单的写了一个java程
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。 采样率 采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立分布式kv系统替换mongodb的思路
验证用户输入是否正确是我们应用程序中的常见功能。Spring提供了`@Valid`和@`Validated`两个注解来实现验证功能,本文详细介绍 [@Valid]和[@Validated]注解的区别 。
引入pdf2dom &lt;dependency&gt; &lt;groupId&gt;net.sf.cssbox&lt;/groupId&gt; &lt;artifactId&gt;pdf2dom&lt;/artifactId&gt; &lt;version&gt;1.8&lt;/version&
grafana 是一款非常优秀的可视化报表工具,有设计精良的可视化工具,今天来聊一聊如何将grafana集成到自己的应用中。 原理是: grafana允许iframe访问,开启auth.proxy, java 后端鉴权后代理grafana 前端通过iframe访问后端代理过的grafana graf
介绍 Call Graph是一款IDEA插件,用于可视化基于IntelliJ平台的IDE的函数调用图。 这个插件的目标是让代码更容易理解,有助于读懂和调试代码。当前只支持Java。针对Typescript、Javascript或Python工具,可以使用作者的另外一款工具Codemap(https:
原理 通过线程安全findAndModify 实现锁 实现 定义锁存储对象: /** * mongodb 分布式锁 */ @Data @NoArgsConstructor @AllArgsConstructor @Document(collection = &quot;distributed-loc
Singleton 单例模式 单例模式是确保每个应用程序只存在一个实例的机制。默认情况下,Spring将所有bean创建为单例。 你用@Autowired获取的bean,全局唯一。 @RestController public class LibraryController { @Autowired
pipeline 分布式任务调度器 目标: 基于docker的布式任务调度器, 比quartzs,xxl-job 更强大的分布式任务调度器。 可以将要执行的任务打包为docker镜像,或者选择已有镜像,自定义脚本程序,通过pipeline框架来实现调度。 开源地址: https://github.c
python训练的模型,转换为onnx模型后,用python代码可以方便进行推理,但是java代码如何实现呢? 首先ONNX 推理,可以使用`onnxruntime` ```xml com.microsoft.onnxruntime onnxruntime 1.15.1 ``` 另外,训练的模型需要
要获取内网地址,可以尝试连接到10.255.255.255:1。如果连接成功,获取本地套接字的地址信息就是当前的内网IP。 python实现: ```python import socket def extract_ip(): st = socket.socket(socket.AF_INET, s
为什么要有索引 gremlin 其实是一个逐级过滤的运行机制,比如下面的一个简单的gremlin查询语句: g.V().hasLabel(&quot;label&quot;).has(&quot;prop&quot;,&quot;value&quot;) 运行原理就是: 找出所有的顶点V 然后过滤出
最近在分析一个应用中的某个接口的耗时情况时,发现一个看起来极其普通的对象创建操作,竟然每次需要消耗 8ms 左右时间,分析后发现这个对象可以通过对象池模式进行优化,优化后此步耗时仅有 0.01ms。
点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章。 此篇文章介绍 Java JMX 技术的相关概念和具体的使用方式。 当前文章属于Java 性能分析优化系列
如何将Java JAR 转化为 win/mac/linux 独立可执行程序?不需要预装 JRE 运行?
点赞再看,动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 Java 19 在2022 年 9 月 20 日正式发布,Java 19 不是一个长期支持版本,直到 2023 年 3 月它将被 JD
点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 前言 Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Cla
JSON 对于开发者并不陌生,如今的 WEB 服务、移动应用、甚至物联网大多都是以 **JSON** 作为数据交换的格式。学习 JSON 格式的操作工具对开发者来说是必不可少的。这篇文章将介绍如何使用 **Jackson** 开源工具库对 JSON 进行常见操作。