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

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

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

【什么叫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链接 视频链接

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

  1. 什么叫MD5,MD5通常做什么用处

    (1)背景介绍: 什么是MD5? MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(has ...

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

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

  3. 简单的MD5密码加密和解密方法

    MD5的算法是不可逆的,MD5被广泛用于密码验证和消息体完整性验证. 下面的例子用到了密码加密和登陆时的解密的基本方法.当然这样很容易被暴力破解,可以做其他改进,如先设计一个足够复杂的密码,然后将他的 ...

  4. shiro 使用md5密码加密 锁定账户

    此篇博客根据之前写的shiro快速配置延续的,建议不了解的可以先看看之前的博客. springMVC中快速配置shiro 1.为了使用密码加密,我们新建一个对用户信息操作的工具类 package co ...

  5. MD5加密是什么?为什么不可解密?

    MD5是一种我们日常开发中经常使用到的加密方式,它使用起来操作简单且不可逆向解密.那么MD5到底是什么呢?又为什么不可逆呢?下面就来为大家介绍一下MD5加密的原理. 1.什么是MD5加密 MD5消息摘 ...

  6. 密码加密技术(MD5)

    1.MD5概念 md5的全称是md5信息摘要算法(英文:MD5 Message-Digest Algorithm ),一种被广泛使用的密码散列函数,可以产生一个128位(16字节,1字节8位)的散列值 ...

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

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

  8. md5 php 加密后乱码_PHP中的密码加密的解决方案总结

    很多用户多个网站使用一个密码,当一个密码丢失其他也遭殃,本篇文章介绍了PHP中的密码加密的解决方案总结,有需要的朋友可以了解一下. 层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站 ...

  9. MD5应用于数据库中密码加密

    最近接触网络安全方面的知识,把好的整理下: 登录Web系统时通常都采用用户名和密码的形式,如果这样的数据以明码的方式放在数据库中的话无疑会给别有用心的人以可趁之机,所以采取一定的防范措施是必要的. 现 ...

最新文章

  1. Wiz开发 定时器的使用与处理
  2. 这个登上Nature封面的群体学习,无需中央协调员比联邦学习更优秀
  3. 银行启动开放战略,能否赢回金融科技下半场?
  4. mybatis的执行流程
  5. Winform中自定义xml配置文件,并配置获取文件路径
  6. JOptionPane弹框常用实例
  7. csdn上传图片发现:缺少图像源文件地址
  8. vmware虚拟机i copied it 和 i moved it的区别
  9. led灯条维修_康佳液晶电视LED42F2200N灯条问题导致不开机故障修复
  10. DispatcherServlet服务调度
  11. python lambda表达式及用法_Python中lambda表达式的常见用法
  12. c语言如何框出视频或图像中的车辆,视频图像中的车辆检测跟踪和分类
  13. C语言实现简易计算器
  14. 如何给新固态硬盘安装系统
  15. BeanUtils工具
  16. 如何用OBS录制Mac系统声音
  17. python翻译-50 行代码,实现中英文翻译
  18. 网络历史之金融投资三剑客0
  19. Sprint(第二天11.15)
  20. 统计学 一元线性回归

热门文章

  1. UpdateData()函数的用法
  2. uniapp调试ESC指令热敏打印机 打印图片 以及 打印途中报10007特性不支持解决方案
  3. centos8重启网卡命令nmcli
  4. [Android] 如何制作手电筒程序
  5. 【网络】https单向认证和双向认证
  6. Java集合(十一)TreeSet解读
  7. bismark 识别甲基化位点-比对篇
  8. Linux共享打印机手机打印,[分享]让linux和linux之间共享打印机
  9. 初看SOA:SOA是什么?
  10. 痛苦的事, 伤心的事, 一生只需要一次, 别折腾, 别忘痛- 人生, 软件, 所有人皆如是!...