Eclipse中Base64Encoder中找不到包的解决办法
Eclipse中写方法遇到Base64Encoder找不到包
解决的方法:
选中项目右键build path->Configure Build Path…,打开Java Build Path操作界面图如下:
然后在java build path中点击library,点击JRE System Library左侧小图标,展开选择Access rules,然后编辑Edit…
在弹框中选择增加Access Rule,Resolution中选择Accessible,Rule Pattern填**
一路OK保存,然后便可以导入Base64Encoder的包
AES128位加密解密的demo
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class AESUtil {
/**
*
* @param content 需要加密的字符串
* @param flagStr 标志性字符串,在明文前拼接字符串以及一个标志字符串进行加密,解密后将拼接字符串截取掉
* @return
*/
public static String AESEncode(String content,String flagStr){
try {
content = String.valueOf(System.currentTimeMillis())+flagStr+content;
KeyGenerator ******=KeyGenerator.getInstance("AES");//1.构造**生成器,指定为AES算法,不区分大小写
******.init(128, new SecureRandom("[email protected]#[email protected]#$#@KJdjklj;D../dSF.,".getBytes()));//2.根据ecnodeRules规则初始化**生成器//生成一个128位的随机源,根据传入的字节数组
SecretKey original_key=******.generateKey();//3.产生原始对称**
byte [] raw=original_key.getEncoded();//4.获得原始对称**的字节数组
SecretKey key=new SecretKeySpec(raw, "AES");//5.根据字节数组生成AES**
Cipher cipher=Cipher.getInstance("AES");//6.根据指定算法AES自成密码器
cipher.init(Cipher.ENCRYPT_MODE, key);//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
byte [] byte_encode=content.getBytes("utf-8");//8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
byte [] byte_AES=cipher.doFinal(byte_encode);//9.根据密码器的初始化方式--加密:将数据加密
String AES_encode=new String(new BASE64Encoder().encode(byte_AES));//10.将加密后的数据转换为字符串
//这里用Base64Encoder中会找不到包
//解决办法:
//在项目的Build path中先编辑JRE System Library下的Access rules,选择add,在Resolution下拉列表框中选择Accessible,Rule Pattern 选择**,依次点击ok
return AES_encode;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String AESDncode(String content,String flagStr){
try {
KeyGenerator ******=KeyGenerator.getInstance("AES");//1.构造**生成器,指定为AES算法,不区分大小写
******.init(128, new SecureRandom("[email protected]#[email protected]#$#@KJdjklj;D../dSF.,".getBytes()));//2.根据ecnodeRules规则初始化**生成器//生成一个128位的随机源,根据传入的字节数组
SecretKey original_key=******.generateKey(); //3.产生原始对称**
byte [] raw=original_key.getEncoded();//4.获得原始对称**的字节数组
SecretKey key=new SecretKeySpec(raw, "AES");//5.根据字节数组生成AES**
Cipher cipher=Cipher.getInstance("AES");//6.根据指定算法AES自成密码器
cipher.init(Cipher.DECRYPT_MODE, key);//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
byte [] byte_content= new BASE64Decoder().decodeBuffer(content);//8.将加密并编码后的内容解码成字节数组
/*解密*/
byte [] byte_decode=cipher.doFinal(byte_content);
String AES_decode=new String(byte_decode,"utf-8");
return AES_decode.substring(String.valueOf(System.currentTimeMillis()).length()+flagStr.length());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (java.io.IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 测试是按照系统毫秒生成一个密文,时间不一致生成密文不一致,再进行解密验证
*/
public static void main(String[] args) {
String flagStr = "mdl";
Scanner scanner=new Scanner(System.in);
while(true){
/*加密*/
System.out.println("请输入要加密的内容:");
String content = scanner.next();
System.out.println("加密后的密文是:"+AESEncode(content,flagStr));
/*解密*/
System.out.println("请输入要解密的内容(密文):");
content = scanner.next();
System.out.println("解密后的明文是:"+AESDncode(content,flagStr));
}
}
}
demo中对明文进行AES加密(秘钥支持为128比特)处理,加密时在明文前拼接上当前系统时间戳以及标志字符串(示例:用户名/手机号码等),同一用户不同时间/不同用户同一时间加密返回的密文均不一样。解密后将得到的密文前部分的时间戳以及标志字符串截取掉,得到我们需要的信息。
用户登录时可将数据库中存储的密码密文解密截取与传入密文解密截取进行对比验证。