最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

java的MD5 算法介绍 总结 使用

互联网 admin 1浏览 0评论

java 的 MD5 算法介绍 总结 使用

MD5算法:
01:简单介绍:
MD5的全称是Message-Digest Algorithm,是Hash算法中的一种重要算法,具有单项加密、加密结果唯一、安全性能好等特点。
MD5以512位分组来处理输入的信息 ,且每一分组又被划分为16个 32位子分组,经过了一系列的处理后 ,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

(1)信息填充
首先需要对明文信息进行填充,使其位长度对512求余的结果等于448。因此,信息的位长度(Bits Length)将被扩展至 N512 + 448。然后,再在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理 ,现在的信息字节长度为 N512 + 448 + 64 = (N + 1) *512,即长度恰好是 512的整数倍。

(2)结构初始化
在处理过程中需要定义一个结构。该结构包含了每一次需要处理的一个明文块 (512bit)和计算出来的散列值 (128bit)。在散列的整个过程中,它的作用非常重要 ,各个明文块计算出来的散列值都是通过它来传递的。

(3)分组文件
将填充好的文件进行分组 ,每组 512位 ,共有N组。

(4)处理分组
使用算法处理每组数据。

MD5算法在计算时会用到四个32位被称作链接变量 (Chaining Variable)的整数参数 ,在使用之前要对它们赋初值 ,分别就为 :

A = 0x01234567,B = 0x89abcdef, C = 0xfedcba98,D =0x76543210。

当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。

将上面四个链接变量复制到另外四个变量中 :A到 a,B到 b, C到 c,D到 d。

主循环有四轮,每轮循环都很相似。第一轮进行16次操作。每次操作对 a、b、c和 d中的其中三个作一次非线性函数运算 ,然后将所得结果加上第四个变量,一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上 a、b、c或 d中之一,最后用该结果取代 a、b、c或 d中之一。

(5)输出结果
当全部信息处理完成后 ,将分组处理的结果进行处理,输出计算结果。

所有这些完成之后 ,将 A、B、C、D分别加上 a、b、c、d。然后用下一分组数据继续运行算法 ,最后的输出是 A、B、C和 D的级联。当全部分组处理完成后,将结果级联 ,即得到了 MD5处理的结果。

---->总结: md5算法 无论输入是什么, 得到的结果 只有 128个比特位
我们可以针对 这个 128 个比特位101010 在此基础上 拿到 16进制的 字符串的形式。
单项的 hash算法 , 我们无法使用 拿到的 128个位 来推算出 输出的值 。
有很小的碰撞性质。
为了提高 安全性, 我们可以给他设置盐值。且每次加密的时候 都要提前知道 这个盐值 是多少。

下面是关于Md5算法的类: MessageDigest类

// getInstance() MessageDigest的静态方法
//填入括号中的 参数是 算法的名字
//返回一个 MessageDigest对象。


//可以 在括号中 填入 一个字节, 或者 字节数组的形式。
//我们也可以 针对 填入的字节 数组 , 进行 重新确定, 不过我觉得这个 做法很 没必要!!!

//通过 执行诸如 填充之类 的 最终操作完成 哈希计算。在调用此方法之后, 摘要被重置。

// 使用一次之后 , 里面的一切情况 就会被重置。

//使用指定的 byte 数组对摘要进行最后更新,然后完成摘要计算。

//也就是说,此方法首先调用 update(input),向 update 方法传递 input 数组,然后调用 digest()。 相当于是 多步合为一步的写法。

参数:
buf - 存放计算摘要的输出缓冲区
offset - 输出缓冲区中的偏移量,从此处开始存储摘要。
len - 在 buf 中分配给摘要的字节数
返回:
放到 buf 中的字节数

//返回 算法的名字

//重置摘要以供再次使用。

//返回此 信息 摘要对象 的字符串表示形式
//比如: md5 Message Digest from SUN,

SHA:算法:
安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高;而SHA是FIPS所认证的五种安全散列算法。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):

由消息摘要反推原输入消息,从计算理论上来说是很困难的。
想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说也是很困难的。任何对输入消息的变动,都有很高的机率导致其产生的消息摘要迥异。

SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。

---->推荐使用 sha-2系列算法 , 因为sha-1已经被人破解了。
—>使用的思路 依然是 使用MessageDigest类 , 只要 我们在getInstance()方法中 填入 算法的名字就可以了。

Hmac类库 的使用 , 针对加密解密:
01:这个类库的功能 , 类似于 md5 + 盐 值的形式:
02:因此 我们首先 需要 产生一个盐值, 然后 调用指定的算法。
03:产生盐值:

04:使用到的 算法的 名字:
HMAC 的种类
算法种类 摘要长度
HmacMD5 128
HmacSHA1 160
HmacSHA256 256
HmacSHA384 384
HmacSHA512 512

04:生成密匙 的 类库: KeyGenerator类

public class KeyGenerator extends Object此类提供(对称)密钥生成器的功能。

密钥生成器是 使用此类 的某个 getInstance 类 方法构造的。

KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。


//KeyGenerator 类的静态方法 getInstance() 生成一个 密匙产生器 。
//括号中 填入 算法的名字,参考上边。

//不常用

//KeyGenerator 实例对象的 generateKey()方法 。 生成一个 SecretKey类型的 密匙对象。

//KeyGenerator实例对象的 getAlgorithm()方法 ,返回 所使用的 算法名称。

----->我们生成的 SecretKeySpace密匙对象 的时候 也是使用哈希算法 生成的, 不是瞎弄的。

SecretKeySpec类 :

//我们也可以 使用 SecretKeySpec的构造方法 创造一个密匙对象。
//方法中 填入 的是 要生成 密匙对象的 字节数组。
//这里很重要, 我们 可以使用 KeyGenerator类 生成一个 密匙类, 但是 每次调用的时候 返回的密匙 都不一样。
//为了保持 返回的 密匙 一样 , 我们完全可以 使用 构造方法 来 返回一个密匙类对象。


//返回 这个密匙 对象的 字节 数组的 形式。


// 返回 我们 构建密匙对象的 时候 所使用的 算法的名称。

Mac类 的解释:
public class Mac extends Object implements Cloneable此类提供“消息验证码”(Message Authentication Code,MAC)算法的功能。

MAC 基于秘密密钥提供一种方式来检查在不可靠介质上进行传输或存储的信息的完整性。通常,消息验证码在共享秘密密钥的两个参与者之间使用,以验证这两者之间传输的信息。

基于加密哈希函数的 MAC 机制也叫作 HMAC。结合秘密共享密钥,HMAC 可以用于任何加密哈希函数(如 MD5 或 SHA-1)。HMAC 在 RFC 2104 中指定。

//getInstance()方法 返回Mac 对象。
//填入的是 算法的名字。参考上边。

//不常用。

//这个方法很重要, 作用是 是将 产生的 盐值(或者说是 密匙 将这个Mac对象 混合一下 )

//Mac实例对象的update()方法 不仅仅可以传递 字节数组 也可以传递 单个字节。
//一定要 记住 配合使用。

//Mac实例对象的 doFinal()方法 , 类似上边的 diget()方法。

//处理给定的 byte 数组并完成 MAC 操作。
对此方法的调用将此 Mac 对象重置为上一次调用 init(Key) 或 init(Key, AlgorithmParameterSpec) 初始化的状态。也就是说,该对象被重置,并可通过重新调用 update 和 doFinal(如果需要)从同一个密钥生成另一个 MAC。(若要用不同的密钥重用此 Mac 对象,则必须通过调用 init(Key) 或 init(Key, AlgorithmParameterSpec) 对其重新初始化)。
相当于是 省略掉了 update()系列 方法。

//重置 Mac实例对象中的 内部参数。

java 的 MD5 算法介绍 总结 使用

MD5算法:
01:简单介绍:
MD5的全称是Message-Digest Algorithm,是Hash算法中的一种重要算法,具有单项加密、加密结果唯一、安全性能好等特点。
MD5以512位分组来处理输入的信息 ,且每一分组又被划分为16个 32位子分组,经过了一系列的处理后 ,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

(1)信息填充
首先需要对明文信息进行填充,使其位长度对512求余的结果等于448。因此,信息的位长度(Bits Length)将被扩展至 N512 + 448。然后,再在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理 ,现在的信息字节长度为 N512 + 448 + 64 = (N + 1) *512,即长度恰好是 512的整数倍。

(2)结构初始化
在处理过程中需要定义一个结构。该结构包含了每一次需要处理的一个明文块 (512bit)和计算出来的散列值 (128bit)。在散列的整个过程中,它的作用非常重要 ,各个明文块计算出来的散列值都是通过它来传递的。

(3)分组文件
将填充好的文件进行分组 ,每组 512位 ,共有N组。

(4)处理分组
使用算法处理每组数据。

MD5算法在计算时会用到四个32位被称作链接变量 (Chaining Variable)的整数参数 ,在使用之前要对它们赋初值 ,分别就为 :

A = 0x01234567,B = 0x89abcdef, C = 0xfedcba98,D =0x76543210。

当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。

将上面四个链接变量复制到另外四个变量中 :A到 a,B到 b, C到 c,D到 d。

主循环有四轮,每轮循环都很相似。第一轮进行16次操作。每次操作对 a、b、c和 d中的其中三个作一次非线性函数运算 ,然后将所得结果加上第四个变量,一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上 a、b、c或 d中之一,最后用该结果取代 a、b、c或 d中之一。

(5)输出结果
当全部信息处理完成后 ,将分组处理的结果进行处理,输出计算结果。

所有这些完成之后 ,将 A、B、C、D分别加上 a、b、c、d。然后用下一分组数据继续运行算法 ,最后的输出是 A、B、C和 D的级联。当全部分组处理完成后,将结果级联 ,即得到了 MD5处理的结果。

---->总结: md5算法 无论输入是什么, 得到的结果 只有 128个比特位
我们可以针对 这个 128 个比特位101010 在此基础上 拿到 16进制的 字符串的形式。
单项的 hash算法 , 我们无法使用 拿到的 128个位 来推算出 输出的值 。
有很小的碰撞性质。
为了提高 安全性, 我们可以给他设置盐值。且每次加密的时候 都要提前知道 这个盐值 是多少。

下面是关于Md5算法的类: MessageDigest类

// getInstance() MessageDigest的静态方法
//填入括号中的 参数是 算法的名字
//返回一个 MessageDigest对象。


//可以 在括号中 填入 一个字节, 或者 字节数组的形式。
//我们也可以 针对 填入的字节 数组 , 进行 重新确定, 不过我觉得这个 做法很 没必要!!!

//通过 执行诸如 填充之类 的 最终操作完成 哈希计算。在调用此方法之后, 摘要被重置。

// 使用一次之后 , 里面的一切情况 就会被重置。

//使用指定的 byte 数组对摘要进行最后更新,然后完成摘要计算。

//也就是说,此方法首先调用 update(input),向 update 方法传递 input 数组,然后调用 digest()。 相当于是 多步合为一步的写法。

参数:
buf - 存放计算摘要的输出缓冲区
offset - 输出缓冲区中的偏移量,从此处开始存储摘要。
len - 在 buf 中分配给摘要的字节数
返回:
放到 buf 中的字节数

//返回 算法的名字

//重置摘要以供再次使用。

//返回此 信息 摘要对象 的字符串表示形式
//比如: md5 Message Digest from SUN,

SHA:算法:
安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高;而SHA是FIPS所认证的五种安全散列算法。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):

由消息摘要反推原输入消息,从计算理论上来说是很困难的。
想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说也是很困难的。任何对输入消息的变动,都有很高的机率导致其产生的消息摘要迥异。

SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。

---->推荐使用 sha-2系列算法 , 因为sha-1已经被人破解了。
—>使用的思路 依然是 使用MessageDigest类 , 只要 我们在getInstance()方法中 填入 算法的名字就可以了。

Hmac类库 的使用 , 针对加密解密:
01:这个类库的功能 , 类似于 md5 + 盐 值的形式:
02:因此 我们首先 需要 产生一个盐值, 然后 调用指定的算法。
03:产生盐值:

04:使用到的 算法的 名字:
HMAC 的种类
算法种类 摘要长度
HmacMD5 128
HmacSHA1 160
HmacSHA256 256
HmacSHA384 384
HmacSHA512 512

04:生成密匙 的 类库: KeyGenerator类

public class KeyGenerator extends Object此类提供(对称)密钥生成器的功能。

密钥生成器是 使用此类 的某个 getInstance 类 方法构造的。

KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。


//KeyGenerator 类的静态方法 getInstance() 生成一个 密匙产生器 。
//括号中 填入 算法的名字,参考上边。

//不常用

//KeyGenerator 实例对象的 generateKey()方法 。 生成一个 SecretKey类型的 密匙对象。

//KeyGenerator实例对象的 getAlgorithm()方法 ,返回 所使用的 算法名称。

----->我们生成的 SecretKeySpace密匙对象 的时候 也是使用哈希算法 生成的, 不是瞎弄的。

SecretKeySpec类 :

//我们也可以 使用 SecretKeySpec的构造方法 创造一个密匙对象。
//方法中 填入 的是 要生成 密匙对象的 字节数组。
//这里很重要, 我们 可以使用 KeyGenerator类 生成一个 密匙类, 但是 每次调用的时候 返回的密匙 都不一样。
//为了保持 返回的 密匙 一样 , 我们完全可以 使用 构造方法 来 返回一个密匙类对象。


//返回 这个密匙 对象的 字节 数组的 形式。


// 返回 我们 构建密匙对象的 时候 所使用的 算法的名称。

Mac类 的解释:
public class Mac extends Object implements Cloneable此类提供“消息验证码”(Message Authentication Code,MAC)算法的功能。

MAC 基于秘密密钥提供一种方式来检查在不可靠介质上进行传输或存储的信息的完整性。通常,消息验证码在共享秘密密钥的两个参与者之间使用,以验证这两者之间传输的信息。

基于加密哈希函数的 MAC 机制也叫作 HMAC。结合秘密共享密钥,HMAC 可以用于任何加密哈希函数(如 MD5 或 SHA-1)。HMAC 在 RFC 2104 中指定。

//getInstance()方法 返回Mac 对象。
//填入的是 算法的名字。参考上边。

//不常用。

//这个方法很重要, 作用是 是将 产生的 盐值(或者说是 密匙 将这个Mac对象 混合一下 )

//Mac实例对象的update()方法 不仅仅可以传递 字节数组 也可以传递 单个字节。
//一定要 记住 配合使用。

//Mac实例对象的 doFinal()方法 , 类似上边的 diget()方法。

//处理给定的 byte 数组并完成 MAC 操作。
对此方法的调用将此 Mac 对象重置为上一次调用 init(Key) 或 init(Key, AlgorithmParameterSpec) 初始化的状态。也就是说,该对象被重置,并可通过重新调用 update 和 doFinal(如果需要)从同一个密钥生成另一个 MAC。(若要用不同的密钥重用此 Mac 对象,则必须通过调用 init(Key) 或 init(Key, AlgorithmParameterSpec) 对其重新初始化)。
相当于是 省略掉了 update()系列 方法。

//重置 Mac实例对象中的 内部参数。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论