MD5 消息摘要算法,英文:MD5 Message-Digest Algorithm ,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5 是单向加密不可逆的,也就是常说的非对称加密,常用于用户密码的加密,这样即使密码泄露也不知道对应的明文信息,有效的保护系统和用户的隐私信息。
MD5 算法产生的是一个 128 位的散列值,128 位是指的二进制中的 128 位,具体占 16 字节(每个字节可以表示为 8 位二进制数)。
MD5 加密最终会将 128 位数字转换成十六进制表示,每个字节( 8 位)转成 2 位十六进制数,最终得到 32 个字符,其中每两个字符代表一个十六进制数,因此最终 MD5 加密结果字符长度为 32 位。
由于 MD5 算法是单向的,不能被反向解析,但是可以通过正向加密后的字典表(Lookup 表和 Rainbow 表)对比的方式进行暴力破解。
对于此种情况可以使用自定义偏移常量(盐值)的方法来降低加密结果被破解的可能。
Java 中进行 MD5 加密使用的是 JDk 中的 java.security
包中的 MessageDigest 类,其中的 getInstance() 方法可以根据算法名称获取对应的算法实例。
// 获取 MD5 算法实例对象
MessageDigest md = MessageDigest.getInstance("MD5");
根据 JDK 提供的算法,可以对任意的字符内容进行 MD5 加密处理,加密处理的流程为:
获取 MD5 算法实例
获取需要加密的字符内容对应的的字节信息,可指定编码方式
对得到的字节信息使用 MD5 算法处理,得到加密后的字节
将加密后的字节转化为 16 进制字符串
返回加密后的字符串信息
public static String md5(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5 = md.digest(data.getBytes(StandardCharsets.UTF_8));
// 将处理后的字节转成 16 进制,得到最终 32 个字符
StringBuilder sb = new StringBuilder();
for (byte b : md5) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
MessageDigest 类可以获取 MD5 实例
md.digest() 计算字符串内容的摘要,并得到计算后的 hash value
StandardCharsets.UTF_8 用来指定计算时使用的编码格式,如果不指定则会使用系统默认编码格式,系统之间不统一会造成中文乱码
sb.append(String.format(“%02x”, b)) 用于将字节信息转为十六进制
最后,可以在 main 方法中验证 MD5 算法的有效性
public static void main(String[] args) {
String password = "testPsd";
String passwordMd5Str = md5(password);
System.out.println("加密前: " + password);
System.out.println("加密后: " + passwordMd5Str);
}
输出结果为
加密前: testPsd
加密后: 52c165118aae94580335f628dc8b202b
使用盐值可以进一步提升 MD5 加密算法安全性,降低破解风险。
public static String md5(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// 加盐处理,需要将对应的盐记录,用于验证密码
int randomNum = new SecureRandom().nextInt(1000);
byte[] md5 = md.digest((data + randomNum).getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : md5) {
//sb.append(Integer.toHexString(b & 0xff));
// 字符串格式转成 16 进制
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
MD5 算法除了用于对字符内容进行加密,还可以用来对文件进行 MD5 校验。
文件进行 MD5 校验即针对每个文件可以计算出一个 MD5 值来作为该文件的唯一编码,如果文件在传输过程中发生了修改,那么最终得到文件的 MD5 值会发生变化。
根据上述 MD5 校验方法可以验证文件的有效性,保证文件在传输过程中不会被篡改。
public static String md5ForFile(String filePath) {
MessageDigest md = null;
byte[] fileBytes = new byte[0];
try {
md = MessageDigest.getInstance("MD5");
fileBytes = Files.readAllBytes(Paths.get(filePath));
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
byte[] md5 = md.digest(fileBytes);
StringBuilder sb = new StringBuilder();
for (byte b : md5) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
在 main 方法中验证 MD5 算法的有效性
public static void main(String[] args) {
String filePath = "C:\桌面\test.jpg";
String fileMd5Str = md5ForFile(filePath);
System.out.println("加密后: " + fileMd5Str);
}
输出结果为
加密后: 75f590a718ee6e8f65c0e7bf780a9e79
文章浏览阅读2.4w次,点赞12次,收藏19次。windows自带的远程连接(mstsc)无法启动某些应用,这里就用雷电模拟器举例通过远程桌面打开雷电模拟器会报错并卡50%进度条造成这个问题的原因是,windows自带的远程连接方式默认走的是当前输出识别的显示驱动远程桌面没有通过独显,如下图所示解决办法新建一个文本文档,名称随便起,扩展名改为cmd然后右键编辑,输入下面代码将代码中最后一行的路径改为自己本..._主机关闭屏幕 远程控制某些软件打不开
文章浏览阅读1.5k次。在docker中搭建xss漏洞靶场首先用Xshell连上自己的虚拟机# 安装docker-composepip install docker-compose# 下载vulstudy项目 如果失败了请往下看git clone https://github.com/c0ny1/vulstudy.git下图是红字是说python版本需要3.5以上,而本机的是2.7.5黄字警告是说pip版本低,但是还可以用,不管它就是了使用docker-compose部署容器安装镜像(快速版)因为GitH_xshell靶场搭建命令
文章浏览阅读2.2k次。在Linux系统中的账户,密码被存放在两个文件中:/etc/passwd和/etc/shadow。/etc/passwd文件上图就是etc/passwd文件中的内容。可以观察到,其中每一行的内容从格式上来看都是一致的。其实,每一行都代表一个帐号,比如上图中的第一行root账号,第二行daemon账号,第三行bin账号,......。这个文件中除了保存root账号,普通用户的账号之外,还保存了系统正常运行所需要的一些账号,比如daemon,bin,sys等系统账号。既然每一行的形式都是一样的._/etc/shadow $6
文章浏览阅读683次。找到数组中出现次数最多的元素_数组元素出现次数最多
文章浏览阅读88次。此为公众号数据分析第三篇,前两篇见乐了:公众号数据分析系列之-caoz的梦呓zhuanlan.zhihu.com乐了:公众号数据分析系列之-占豪zhuanlan.zhihu.com这次要分析的号是最近一两天又被炒上天的“咪蒙”。 嗯,就是那个篇篇10W+的咪蒙。分析理由:最近特火爆(其实一直很火爆),别人多从内容方面去分析,我就提供点数据分析的佐料吧。至于他最近有多火微信指数最直观了。分析文..._级联删除速度很慢
文章浏览阅读1.2w次,点赞12次,收藏51次。介绍锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。锁机制共享锁与排他锁共享锁(读锁):其他事务可以读,但不能写。排他锁(写锁) :其他事务不能读取,也不能写。粒度锁MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的_mysql锁表和解锁语句
文章浏览阅读1.1k次,点赞3次,收藏14次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档**嵌入式内核及驱动开发(初级)**文章目录嵌入式内核及驱动开发(初级)一、设备环境的搭建二、驱动开发![在这里插入图片描述](https://img-blog.csdnimg.cn/20210614165916608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ_嵌入式内核开发
文章浏览阅读1.6w次,点赞5次,收藏13次。在idea中启动/debug按钮呈灰化状态解决教程_idea debug按钮灰色
文章浏览阅读1.9k次。docker 里使用pm2守护多个进程和日志记录使用pm2-logrotate_pm2-runtime
文章浏览阅读312次。基于Live555实现RtspServer及高清高码率视频传输优化_live555
文章浏览阅读2.9k次,点赞2次,收藏8次。本文章将说明如何使用安信可RG-02网关对接TTN平台,实现数据发送与接收。_ttn平台
文章浏览阅读3.7w次,点赞359次,收藏1.3k次。51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部进行完成的。这个其实就是我们前面之前玩的那些硬件就是,比如说独立按键以及数码管和LCD1602 的这些硬件实际上都是单片机的IO口进行控制的一个外设,就像我们单片机都是实实在在的设备。但是我们这个定时器呢?虽说也是一个实在的电路,但这个电路都是在 MCU 单片机的电路内部进行完成的。就是说我们这个单片机 STC89C52 芯片给拿走。而光有这个单片机就可以实现定时器的这个功能,这个定时器就是属于单片机的一个内部资源。.........._51单片机定时器