1、DES加密算法(对称算法)
2、3DES加密算法(对称算法)
3、单向Hash算法(散列函数):
- MD5(Message Digest Algorithm 5)
- SHA(Secure Hash Algorithm)
- MAC(Message Authentication Code)
- CRC(Cyclic Redundancy Check)
破解方式:彩虹表-->事先生成一套密文与对应的明文存储在表中,然后用密文采取暴力攻击,碰撞出对应明文(例:admin)
4、加盐Hash算法:
在单向Hash算法基础上,与客户端约定好在某个位置加入一个数字、字母或字符(例:在索引10的位置加入一个m 。)
优点:即使通过彩虹表找到了散列后的数值所对应的原始内容,但是由于经过了加盐,插入的字符串扰乱了真正的密码,使得获取真实密码的概率大大降低。
5、PBKDF2算法
该算法原理大致相当于在Hash算法基础上增加随机盐,并进行多次Hash运算,随机盐使得彩虹表的建表难度大幅增加,而多次Hash也使得建表和破解的难度大幅增加。
6、Bcrypt算法
bcrypt是专门为密码存储而设计的算法,实现中bcrypt会使用一个加盐的流程以防御彩虹表攻击,同时bcrypt还是适应性函数,它可以借由增加迭代之次数来抵御日益增进的计算机运算能力透过暴力法破解。
Java中使用bcrypt
public static void main(String[] args) throws NoSuchAlgorithmException { String originalPassword = "漫话编程"; String generatedSecuredPasswordHash = BCrypt.hashpw(originalPassword, BCrypt.gensalt(12)); System.out.println(generatedSecuredPasswordHash); boolean matched = BCrypt.checkpw(originalPassword, generatedSecuredPasswordHash); System.out.println(matched); }
7、scrypt算法
scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用彩虹表进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。
Java中使用scrypt
public static void main(String[] args) { String originalPassword = "漫话编程"; String generatedSecuredPasswordHash = SCryptUtil.scrypt(originalPassword, 16, 16, 16); System.out.println(generatedSecuredPasswordHash); boolean matched = SCryptUtil.check("漫话编程", generatedSecuredPasswordHash); System.out.println(matched); matched = SCryptUtil.check("漫画编程", generatedSecuredPasswordHash); System.out.println(matched); }
总结于Hollis文章:https://mp.weixin.qq.com/s/vbzxYAj6jFc9Hf_fOzxH7w