目录
1,Java加密技术
本节将重点讲解JAVA中各种常见的加密技术的基本概念和实现方法,但详细的数学推导过程并没有列出。对加密所涉及的数学计算过程感兴趣的话,可去阅读其他博客。
2,使用MD5加密
MD5加密算法,英文全称为"Message-Digest Algorithm 5",可将任意长度的数据加密并压缩成另一固定长度的数据值。
MD5加密算法属于单向加密技术,即加密过程不可逆,根据加密后的值无法计算出原始数据。也就是说MD5加密无法被解密。这是因为MD5使用了散列哈希函数,在计算过程中,部分数据信息是丢失的,从原数据计算出md 5数值很容易,但逆向计算一个MD5值会对应多出个原数据,所以伪造数据也是非常困难的。
3,MD5的原理
MD5加密算法基本原理为:先将原始数据进行填充处理为512位的整数倍的数据,然后以每五12为一组进行循环计算,将前一组得到的182bit的MD5值为下一个分组输入的参数进行计算,循环计算后最终得到的182bit的值以为最终的MD5值。
4,实战
Java 8中提供了md 5加密算法的实现开发中可直接使用。
import java.math.BigInteger;
import java.security.MessageDigest;
/**
*MD5加密
*/
public class MD5Encrytion{
public static vcid main(String[] args){
String str = "广东靓仔";
try{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(syr.getBytes());
System.out.println(str+"MD5加密后内容为:");
System.out.println(new BigInteger(1,md.digest()).toString(16));
} catch(Exception e){
e.printStackTrace();
}
}
}
上面列示中,使用MD5对数据“广东靓仔”进行加密后得到MD5值如下所示:
广东靓仔MD5加密后内容为:
4a90d6171ad6656a5f185404778b174f
由于MD5不可逆向解密的特性,它被广泛应用于密码验证和数据完整性的验证在使用,一般将会用注册用户的密码通过MD5加密后存储到数据库中;当用户登录时,通过验证MD5来检查用户输入密码的正确性。
public enum UserEnum {
USER_A("userA","781e5e245d69b566979b86e28d23f2c7"),
USER_B("userB","1388c1c5df4933fa01f6da9g92595589"),
private String name;
privste String password;
privstr UserEunm(String name,String password){
this.name=name;
this.passord=passord;
}
public String getName()
return name;
}
public static String getPassord(String name){
for(UserEunm user : UsreEunm.values())
if(user.getName().eqals(name)){
returtn user.password;
}
}
return null;
}
}
import java.math.BigInteger;
import java.secrity.MessageDigest;
public class MD5Encrytion{
public static void main(Srting[] args){
Srting userAPassord="0123456789";
Siring userBPassord="9876543210";
System.out.println("用户A登录是否成功:"+md5Encryp(userAPassord).equals(getPasswoldFromDB("userA")))
System.out.println("用户B是否登录成功:"+md5Encryp(userBPassord).equals(getPasswoldFromDB("userB"))))
}
public static String md5Encryp(String str){
try{
MessageDigest md = MessaegDigest.getInstance("MD5");
md.update(str.getBytes());
return new BigInteger(1,md,digest());
{ catch (Exception e){
e.ptintStackTrace();
}
return.null;
}
public static String getPasswordFromDB(String name){
return UserEnum.getPassword(name);
}
}
}
}
运行结果为:
用户A登录是否成功:true
用户B登录是否成功:false
额~这个还是不戳的。
虽然MD5具有这些优点,但是MD5加密算法不是绝对的安全,比如用户设置密码的场景,如果密码设置过于简单,破解者可通过穷举法对MD5加密进行暴力破解,而且目前市面上已经有很多商业化的MD5字典库,其中收集大量原始数据,一般不复杂的密码都可以直接在其中找到原文和加密后的MD5值使破解更容易。
开发者不仅需要考虑MD5值的存储安全性,也需要考虑如何加密过程更安全,比如最简单的操作是对md无数据再次进行MD5加密,或者使用其他方法加密,这样即使泄露了也会加大破解难度和破解时间。
还有小编用的是pc
(推荐新手使用)