Java加密与安全 (2)

  摘要算法(哈希算法/Hash/Digst/数字指纹),计算任意长度数据的摘要(固定长度),相同数据的输入始终得到相同的输出,不同的输入数据尽量得到不同的输出,目的是为了验证原始数据是否被篡改。如果我们的输入是任意长度的数据,而输出的是固定长度的数据,我们就可以称之为摘要算法。Java中Object的hashCode()方法就是一个摘要算法。什么是碰撞呢?碰撞是指两个不同的输入得到了相同的输出,而且碰撞是不能避免的,这是因为输出的字节长度是固定的,而输入的字节的长度是不固定的,所以hash算法实际上是将一个无限的输入集合映射到一个有限的输出集合。
Hash算法的安全性:

碰撞率低

不能猜测输出

输入的任意一个bit的变化会造成输出完全不同

很难以从输出反推输入(只能依靠暴力穷举)

常用的摘要算法

算法   输出长度  
MD5   128 bits   16 bytes  
SHA-1   160 bits   20 bytes  
SHA-256   256 bits   32 bytes  
RipeMD-160   160 bits   20 bytes  
MD5算法

在Java中使用MD5:

public static void main(String[] args) throws Exception { MessageDigest digest1 = MessageDigest.getInstance("MD5"); digest1.update("helloworld".getBytes("UTF-8")); byte[] result1 = digest1.digest(); for (byte b : result1) { System.out.print(b + "\t"); // -4 94 3 -115 56 -91 112 50 8 84 65 -25 -2 112 16 -80 } System.out.println(); //输入的数据可以分片输入,得到的结果是一样的 MessageDigest digest2 = MessageDigest.getInstance("MD5"); digest2.update("hello".getBytes("UTF-8")); digest2.update("world".getBytes("UTF-8")); byte[] result2 = digest2.digest(); for (byte b : result2) { System.out.print(b + "\t"); // -4 94 3 -115 56 -91 112 50 8 84 65 -25 -2 112 16 -80 } }

  MD5用途:可以用来验证文件的完整性,比如我们在MySQL网站下载mysql时,mysql网站会给出每一个下载文件的MD5值,在下完文件后,通过计算MD5和网站给出的MD5对比,就可以计算出文件在下载过程中是否出现错误。

Java加密与安全


  MD5存储用户口令,由于系统不存储用户原始口令(例如数据库中存储的密码),系统存储用户原始口令的MD5。如何判断用户口令是否正确?系统计算用户输入的原始口令的MD5和数据库存储的MD5进行对比,相同则口令正确,不相同则口令错误。使用MD5要避免彩虹表攻击,什么是彩虹表呢?彩虹表就是预先计算好的常用口令。为了抵御彩虹表攻击,通常我们需要对每个口令额外添加随机数salt。

SAH-1算法

  SAH-1算法是一种哈希算法,输出160 bits / 20 bytes,美国国家安全局开发,常见的有SHA-1 / SHA-256 / SHA-512。SAH-1算法是比MD5更安全的哈希算法。

BouncyCastle算法

  BouncyCastle是第三方提供的一组加密/哈希算法,提供JDK没有提供的算法(RipeMD160 算法),如何使用第三方提供的算法?先添加第三方jar至classpath,注册第三方算法提供方(通过Security.addProvider()注册),正常使用JDK提供的接口。

Hmac算法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpypfg.html