·hash的介绍
一:hash的解释:
哈希算法是一种能将不同长度的内容转化为固定长度的输出的算法,也称摘要算法或者散列算法。
二:hash的特点:
1、不同的内容转化的长度固定
2、相同的内容转化的结果一定相同
3、不同的内容转化的结果基本不同
4、无法逆推导除原文
·hash冲突
由于可以进行hash加密的内容是无穷的,但是生成的hash数长度是固定的,所以可能出现不同的内容生成的哈希结果相同,这个现象称之为哈希冲突。
所以:输出的结果越长,碰撞越不容易发生,也就越安全。
·常见的hash算法
常见hash算法有 MD5, SHA1, SHA224, SHA256, SHA384, SHA512。
下面举两个例子说明这些算法的使用方法。
一:MD5
import java.security.MessageDigest;
public class main {
public static void main(String[] args) {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update("Hello".getBytes("UTF-8"));
md.update("World".getBytes("UTF-8"));
byte[] results = md.digest();
StringBuilder sb = new StringBuilder();
for(byte bite : results) {
sb.append(String.format("%02x", bite));
}
System.out.println(sb.toString());
}
}
二:SHA-1
这里只需要把MD5改成SHA-1即可。
import java.security.MessageDigest;
public class main {
public static void main(String[] args) {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update("Hello".getBytes("UTF-8"));
md.update("World".getBytes("UTF-8"));
byte[] results = md.digest();
StringBuilder sb = new StringBuilder();
for(byte bite : results) {
sb.append(String.format("%02x", bite));
}
System.out.println(sb.toString());
}
}
·hash的作用
hash算法根据它的特点:相同的内容加密后的结果一定相同,可以用来进行检验。
有两个用途:
1、对下载软件的完整性进行检验
因为现在的盗版软件或者有毒软件很多,可以通过这种方式检查自己下载的软件是否是被修改过。
2、对账户密码进行检验
将密码存入时进行加密,防止被黑客盗取,然后在用户登录时将输入的密码进行加密,将加密的结果和数据库中存储的结果进行比较,就知道密码是否正确了。
彩虹表
但是,根据相同的内容加密后的结果一定相同的特性,也会衍生出一些问题。
由于大多数用户的密码相对简单,所以黑客可以根据一些常用密码,比如:"123456"等,穷举出他们对应的哈希加密结果,制作成表,这个表就是彩虹表。然后根据彩虹表进行对比,可以反推出简单常用的密码。
而应对的方式则是给每个密码添加随机数,称之为加盐