消息摘要算法:
MD(Message Digest) 消息摘要
SHA(Secure Hash Algorithm) 安全散列
MAC(Message Authentication Code) 消息认证码
作用:(验证数据完整性、数字签名核心算法)
将输入的任意长度序列数据映射为128bit的输出序列,一般来说只要输入的内容不同,映射出来的序列就不相同,就可以用来验证数据的完整性。(比如从一个网站下载了一个文件,而这个网站又留下了该文件的消息摘要,我们只要计算下这个文件的消息摘要再和网站上的比对下,就可以知道这个文件是否下载完整。)还有一个功能就是数据的机密性,保存密码到数据库时,不直接保存密码的明文,而是保存密码的消息摘要,在验证密码的时候,将密码的消息摘要和保存在数据库内容进行比较,就可以检测密码的正确性,同时保证了机密性。
数据库明文存储密码的后果:网站六百万用户信息外泄、推特用户密码被明文泄漏
结合消息摘要算法的一种安全的登录验证方式:
消息摘要算法——MD
MD家族(128位摘要信息)(MD2、MD4、MD5)
Commons Codec & Bouncy Castle 下载
JDK实现:
package practice; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Hex; public class MD5Test { private static String str = "test text"; public static void main(String[] args) { MessageDigest md; try { md = MessageDigest.getInstance("MD5"); // 得到MD5的加密对象 byte[] strOut = md.digest(str.getBytes()); System.out.println(Hex.encodeHex(strOut)); // Hex由Commons Codec提供,将byte数组转为16进制 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } }Bouncy Castle实现:
package practice; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.MD5Digest; import org.bouncycastle.util.encoders.Hex; public class MD5Test { private static String str = "test text"; public static void main(String[] args) { Digest digest = new MD5Digest(); digest.update(str.getBytes(), 0, str.getBytes().length); // 处理的数据、开始的位置、处理的长度 byte[] md5Bytes = new byte[digest.getDigestSize()]; digest.doFinal(md5Bytes, 0); // 输出内容和偏移量 System.out.println(Hex.toHexString(md5Bytes)); // Hex由BouncyCastle提供 } }Commons Codec实现:
package practice; import org.apache.commons.codec.digest.DigestUtils; public class MD5Test { private static String str = "test text"; public static void main(String[] args) { System.out.println(DigestUtils.md5Hex(str.getBytes())); } }有没有通过上述程序发现MD5 加密之后的长度是一样的,不管原本的信息有多长?这是因为 MD5 是摘要算法,有点类似于从你要加密的信息中选取一部分信息出来加密,所以即使你得到了 MD5 加密之后的结果,也很难从一部分信息中反推出原本的完整信息。另外,MD5 也是存在被破解的情况,那就是最传统的破解方法,从一堆数据中一个个去试。所以, MD5 可以设置一个盐值,类似于干扰信息,可以降低被破解的概率。
消息摘要算法——SHA
留坑待填
消息摘要算法——MAC
留坑待填