Java加密解密介绍,java⾯试笔试题⼤汇总
3、Hash加密算法(MD5)
MD5全称是Message-Digest Algorithm 5(信息摘要算法5),单向的算法不可逆(被MD5加密的数据不能被解密)。MD5加密后的数据长度要⽐加密数据⼩的多,且长度固定,且加密后的串是唯⼀的。
适⽤场景:常⽤在不可还原的密码存储、信息完整性校验等。
信息完整性校验:典型的应⽤是对⼀段信息产⽣信息摘要,以防⽌被篡改。如果再有⼀个第三⽅的认证机构,⽤MD5还可以防⽌⽂件作者的“抵赖”,这就是所谓的数字签名应⽤。
4、混合加密
java源代码加密由于以上加密算法都有各⾃的缺点(RSA加密速度慢、AES密钥存储问题、MD5加密不可逆),因此实际应⽤时常将⼏种加密算法混合使⽤。
例如:RSA+AES:
采⽤RSA加密AES的密钥,采⽤AES对数据进⾏加密,这样集成了两种加密算法的优点,既保证了数据加密的速度,⼜实现了安全⽅便的密钥管理。
那么,采⽤多少位的密钥合适呢?⼀般来讲密钥长度越长,安全性越⾼,但是加密速度越慢。所以密钥长度也要合理的选择,⼀般RSA建议采⽤1024位的数字,AES建议采⽤128位即可。
5、Base64
严格意义讲,Base64并不能算是⼀种加密算法,⽽是⼀种编码格式,是⽹络上最常见的⽤于传输8bid字节代码的编码⽅式之⼀。
Base64编码可⽤于在HTTP环境下传递较长的标识信息,Base编码不仅不仅⽐较简单,同时也据有不可读性(编码的数据不会被⾁眼直接看到)。
部分代码实现
====================================================================
package com.util;
pto.Cipher;
pto.KeyGenerator;
pto.Mac;
pto.SecretKey;
pto.spec.SecretKeySpec;
import s.internal.impl.dv.util.Base64;
import java.security.MessageDigest;
import java.security.SecureRandom;
public class EncryptUtil {
public static final String MD5 = “MD5”;
public static final String SHA1 = “SHA1”;
public static final String HmacMD5 = “HmacMD5”;
public static final String HmacSHA1 = “HmacSHA1”;
public static final String DES = “DES”;
public static final String AES = “AES”;
/*编码格式;默认使⽤uft-8/
public String charset = “utf-8”;
/*DES/
public int keysizeDES = 0;
/*AES/
public int keysizeAES = 128;
public static EncryptUtil me;
private EncryptUtil(){
//单例
}
//双重锁
public static EncryptUtil getInstance(){
if (me==null) {
synchronized (EncryptUtil.class) {
if(me == null){
me = new EncryptUtil();
}
}
}
return me;
}
/**
使⽤MessageDigest进⾏单向加密(⽆密码)
@param res 被加密的⽂本
@param algorithm 加密算法名称
@return
*/
private String messageDigest(String res,String algorithm){
try {
MessageDigest md = Instance(algorithm);
byte[] resBytes = charset==Bytes():Bytes(charset);
return base64(md.digest(resBytes));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
使⽤KeyGenerator进⾏单向/双向加密(可设密码)
@param res 被加密的原⽂
@param algorithm 加密使⽤的算法名称
@param key 加密使⽤的秘钥
@return
*/
private String keyGeneratorMac(String res,String algorithm,String key){ try {
SecretKey sk = null;
if (key==null) {
KeyGenerator kg = Instance(algorithm);
sk = kg.generateKey();
}else {
byte[] keyBytes = charset==Bytes():Bytes(charset); sk = new SecretKeySpec(keyBytes, algorithm);
}
Mac mac = Instance(algorithm);
mac.init(sk);
byte[] result = mac.Bytes());
return base64(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
使⽤KeyGenerator双向加密,DES/AES,注意这⾥转化为字符串的时候是将2进制转为16进制格式的字符串,不是直接转,因为会出错
@param res 加密的原⽂
@param algorithm 加密使⽤的算法名称
@param key 加密的秘钥
@param keysize
@param isEncode
@return
*/
private String keyGeneratorES(String res,String algorithm,String key,int keysize,boolean isEncode){
try {
KeyGenerator kg = Instance(algorithm);
if (keysize == 0) {
byte[] keyBytes = charset==Bytes():Bytes(charset);
kg.init(new SecureRandom(keyBytes));
}else if (key==null) {
kg.init(keysize);
}else {
byte[] keyBytes = charset==Bytes():Bytes(charset);
kg.init(keysize, new SecureRandom(keyBytes));
}
SecretKey sk = kg.generateKey();
SecretKeySpec sks = new Encoded(), algorithm);
Cipher cipher = Instance(algorithm);
if (isEncode) {
cipher.init(Cipher.ENCRYPT_MODE, sks);
byte[] resBytes = charset==Bytes():Bytes(charset);
return parseByte2HexStr(cipher.doFinal(resBytes));
}else {
cipher.init(Cipher.DECRYPT_MODE, sks);
return new String(cipher.doFinal(parseHexStr2Byte(res)));
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String base64(byte[] res){
de(res);
}
/**将⼆进制转换成16进制 */
public static String parseByte2HexStr(byte buf[]) { StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = HexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = ‘0’ + hex;
}
sb.UpperCase());
}
String();
}
/*将16进制转换为⼆进制/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i2, i2+1), 16); int low = Integer.parseInt(hexStr.substring(i2+1, i2+2), 16); result[i] = (byte) (high * 16 + low);
}
return result;
}
/**
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论