Base64用于网络中传输的数据进行编码,严格意义上属于编码的格式,有64个字符的对应的编码,Base64就是将内容按照该格式进行编码。可以对数据编码和解码,是可逆的,安全度较低,不过,也可以作为最基础最简单的加密算法用于加密要求较弱的情况
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
public class Base64{
public static void main(String[] args) {
String src="Hello Base64"; //需要加密的数据
try {
BASE64Encoder encoder=new BASE64Encoder();
String encode = encoder.encode(src.getBytes());
System.out.println("加密: "+encode);
BASE64Decoder decoder=new BASE64Decoder();
String decode=new String(decoder.decodeBuffer(encode));
System.out.println("解密: "+decode);
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
加密: SGVsbG8gQmFzZTY0
解密: Hello Base64
pom.xml中导入依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--guava包中有校验数据合法性的方法,引入后可直接使用-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.0-jre</version>
</dependency>
实现加密:
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import org.apache.shiro.codec.Base64;
public class shiroBase64{
/*Preconditions验证数据是否正确*/
/*加密*/
public static String encrytBase64(String password) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(password), "密码不能为空");
byte[] bytes = password.getBytes();
return Base64.encodeToString(bytes);
}
/*解密*/
public static String decryptBase64(String password) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(password), "密码不能为空");
return Base64.decodeToString(password);
}
public static void main(String[] args) {
String encryt = encrytBase64("123456");
String decrypt = decryptBase64(encryt);
System.out.println("加密后: "+encryt);
System.out.println("解密:" +decrypt);
}
}
运行结果:
加密后: MTIzNDU2
解密:123456
shiro框架自带的HEX 16进制加解密
import org.apache.shiro.codec.Hex;
import org.junit.Test;
public class HEX16 {
/*16进制加密*/
public static String encrytHex(String password) {
byte[] bytes = password.getBytes();
return Hex.encodeToString(bytes);
}
/*16进制解密*/
public static String decryptHex(String password) {
return new String(Hex.decode(password));
}
@Test
public void Hex_Test(){
String encryt = encrytHex("123456");
String decrypt = decryptHex(encryt);
System.out.println("16进制加解密");
System.out.println("加密后: "+encryt);
System.out.println("解密:" +decrypt);
}
}
运行结果:
加密后: 313233343536
解密:123456
散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容。
常用的散列算法有MD5、SHA。
一般散列算法需要提供一个salt(盐)与原始内容生成摘要信息,这样做的目的是为了安全性,当盐的值不同时,加密后的数据也不同,防止通过撞库来实现MD5解密;
shiro框架自带的Md5Hash散列算法和SimpleHash加密:
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.junit.Test;
public class MD5_salt {
@Test
public void test1(){
String password_md5=new Md5Hash("111111").toString();
System.out.println("MD5加密不加盐: "+password_md5);
String password_md5_salt_1=new Md5Hash("111111","hhh",1).toString();
System.out.println("MD5加密加盐一次散列: "+password_md5_salt_1);
String password_md5_salt_2=new Md5Hash("111111","hhh",2).toString();
//两次散列相当于 md5(md5(加密内容))
System.out.println("MD5加密加盐二次散列: "+password_md5_salt_2);
String simpleHash=new SimpleHash("MD5","111111","hhh",1).toString();
System.out.println("使用SimpleHash加密: "+simpleHash);
}
}
运行结果:
MD5加密不加盐: 96e79218965eb72c92a549dd5a330112
MD5加密加盐一次散列: 78c247d5a8c436e028fccd6972f93c31
MD5加密加盐二次散列: 737d18e71a77f3c6f01e435a9193b563
使用SimpleHash加密: 78c247d5a8c436e028fccd6972f93c31
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
public class randomNum {
public static void main(String[] args) {
SecureRandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
randomNumberGenerator.setSeed("abc123".getBytes());
String hex = randomNumberGenerator.nextBytes().toHex();
System.out.println(hex);
//输出结果6691484ea6b50ddde1926a220da01fa9
}
}
每次数据加密后生成的密钥都不一样,但是解密后只对应加密前的数据
import org.apache.shiro.codec.Hex;
import org.apache.shiro.crypto.AesCipherService;
import java.security.Key;
public class AES {
public static void main(String[] args) {
AesCipherService aesCipherService = new AesCipherService();
aesCipherService.setKeySize(128); //设置key长度
Key key = aesCipherService.generateNewKey();
String text = "helloworld";
//加密
String encText = aesCipherService.encrypt(text.getBytes(), key.getEncoded()).toHex();
System.out.println("加密: "+encText);
//解密
String decText = new String(aesCipherService.decrypt(Hex.decode(encText), key.getEncoded()).getBytes());
System.out.println("解密: "+decText);
}
}
运行结果:
加密: 0c7384afaeb5c5e7e8c04605d6e4a48456173a74e4390c93db4b401b6a76d96f
解密: helloworld
评论