廖雪峰Java10加密与安全-3摘要算法-1MD5

摘要算法

摘要算法(哈希算法/Hash/数字指纹):

  • 计算任意长度数据的摘要(固定长度)
  • 相同的输入数据始终得到相同的输出
  • 不同的输入尽量得到不同的输出

摘要算法目的:

  • 验证原始数据是否被篡改

输入:任意长度数据(byte[])
输出:固定长度数据(byte[n])
hash("hello") = 0x5e918d2
hash("hello,java") = 0x7a9d88e8
hash("hello,bob") = 0xa0dbae2f
java的Object.hashCode()方法就是一个摘要算法:
输入:任意数据
输出:固定长度数据(int, byte[4])
相同的输入得到相同的输出:equals/hashCode

碰撞:
两个不同的输入得到了相同的输出,仅做示例

    hash("abc") = 0x12345678
    hash("xyz") = 0x12345678

哈希算法是将一个无限的输入集合映射到一个有限的输入集合。碰撞是不能避免的,因为输出的字节长度是固定的,而输入的字节长度是不固定的。所以哈希算法是把一个无限的输入集合映射到一个有限的输出集合。
假设输出2个字节的摘要,1个字节8位,2个字节16位,即所有的输出在16个0到16个1之间,即2^16=65536。将无限的输入映射到输出集合中,肯定有不同的输入获得相同输出的情况,即碰撞。

Hash算法的安全性:

  • 好的Hash算法,碰撞率要低
  • 好的Hash算法,不能根据输入猜测输出
    * 如hashA("java001") = "123456",hashA("java002") = "123457"。可能推出hashA("java003") = "123458"
  • 好的Hash算法,输入的任意一个bit的变化会造成输出完全不同
    * 如hashA("java001") = "123456",hashA("java002") = "580645"。可能推出hashA("java003") = ?
  • 很难从输出反推输入(只能暴力穷举)
    常用的摘要算法:
算法 输出长度:位数 输出长度:字节数
MD5 128 bits 16bytes
SHA-1 160bits 20bytes
SHA-256 256bits 32bytes
PipeMd-160 160bits 20bytes
import java.math.BigInteger;
import java.security.MessageDigest;

public class SplitString {
    public static byte[] toMD5(byte[] input){
        MessageDigest md;
        try{
            md = MessageDigest.getInstance("MD5");
        }catch (Exception e){
            throw new RuntimeException(e);
        }
        md.update(input);
        return md.digest();//返回MD5
    }
    public static void main(String[] args) throws Exception {
        String s = "MD5摘要算法测试";
        byte[] r = toMD5(s.getBytes("UTF-8"));//先将字符串转化为字节数组
        System.out.println(String.format("%032x",new BigInteger(1,r)));
        System.out.println(String.format("%040x",new BigInteger(1,r)));//不足40位,前面补0
        System.out.println(String.format("%40x0",new BigInteger(1,r)));//后面加0
    }
}

import java.math.BigInteger;
import java.security.MessageDigest;

public class SplitString {
    public static byte[] toMD5(byte[] input){
        MessageDigest md;
        try{
            md = MessageDigest.getInstance("MD5");
        }catch (Exception e){
            throw new RuntimeException(e);
        }
        md.update(input);
        return md.digest();//返回MD5
    }
    public static void main(String[] args) throws Exception {
        String s = "helloworld";
        String salt = "Random salt";
        byte[] r = toMD5((salt+s).getBytes("UTF-8"));//先将字符串转化为字节数组
        System.out.println(String.format("%032x",new BigInteger(1,r)));
        System.out.println(String.format("%040x",new BigInteger(1,r)));
        System.out.println(String.format("%40x0",new BigInteger(1,r)));
    }
}

总结:

  • MD5是一种常用的哈希算法,输出128bits/16bytes
  • 常用于验证数据完整性
  • 用于存储口令时要考虑彩虹表攻击

原文地址:https://www.cnblogs.com/csj2018/p/10828688.html

时间: 2024-08-30 17:24:04

廖雪峰Java10加密与安全-3摘要算法-1MD5的相关文章

廖雪峰Java10加密与安全-4加密算法-1对称加密算法

对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,message) -> s 解密:decrypt(key,s) -> message 算法 密钥长度 工作模式(参数) 填充模式(格式的选择) DES 56/64 ECB, CBC, PCBC, CTR... NoPadding, PKCS5Padding AES 128/192/256 ECB,CBC,

廖雪峰Java10加密与安全-2加密算法-1URL编码

1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3 URL编码规则: A-Z, a-z, 0-9以及-_.*保持不变 其他字符以%XX表示 * < -> %3C * (UTF-8: 0xe4b8ad) -> %E4%B8%AD * 空格有2种,一种是+(以前),另一种是%20(现在),目

廖雪峰Git教程学习笔记

廖雪峰git简单教程学习笔记 教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001.可以这样设计目录,在d:\reposisoty\ 在这个目录下面有很多的仓库.mkdir learngitcd learngit>>git init          #这样就把learngit 初始化成了一个仓库>>git status        #说明当前仓库的状态并

git常用命令总结--廖雪峰老师Git教程命令总结

学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西. 如果没有学过,这是传送门 下面这个图很重要 一.git初始化本地仓库和配置 echo "想输入到文件的内容,一般为# 库名字" >> README.md git init  初始化一个仓库 如果没有配置需要配置 git config --list git config --global user.email "[email protected]" git config --gl

廖雪峰的Python3教程: 章节1,章节2,章节3

目录 廖雪峰的Python3教程: 章节1,章节2,章节3 1 python简介 2 安装Python 2-1 Python解释器 3 第一个Python程序 3-1 使用文本编辑器 3-2 Python代码运行助手 3-3 输入和输出 廖雪峰的Python3教程: 章节1,章节2,章节3 教程地址 1 python简介 Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言,解释型语言,高级语言. Python提供

廖雪峰Java6 IO编程-2input和output-4Filter模式

1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 * Socket.getInputStream():从TCP连接读取数据 提供额外附加功能的FilterInputStream * 如果要给FileInputStream添加缓冲功能: BufferedFileInputStream extends FileInputStream * 如果要给Fi

[廖雪峰] Git 分支管理策略

通常,合并分支时,如果可能,Git 会用 Fast forward 模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制 禁用 Fast forward 模式,Git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息. 下面我们实战一下 --no-ff 方式的 git merge: 首先,仍然创建并切换 dev 分支: $ git checkout -b dev Switched to a new branch 'dev' 修改 readme.txt

我的git学习记录------------从廖雪峰老师网站的学习总结

这篇文章只用作自我学习,部分参考来自廖雪峰老师网站 mkdir 路径/文件名(d:/test)  创建文件夹 cd  路径/文件名(cd d:/test)  进入文件夹 pwd   显示当前所出位置的路径   确保全英路径(注意) cd 仓库(repository)文件路径       eg(cd d:/test) git init   初始化空的仓库,把这个目录变成git可以管理的仓库 编写一个readme.txt文件,内容如下: Git is a version control system

自学——廖雪峰和老齐

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/廖雪峰 https://www.douban.com/note/507802449/老齐