这是一个字符串加密的工具类。里面有加密方法,还有验证方法。
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Component;
/**
* 加密的工具类
* @author
*/
@Component("encryptUtil")
public class EncryptUtil
{
/**
* 加密字符串
*
* 加密算法$随机数$密文(加密算法加密(明文+随机数))
*
* sha256$abcd$sha256(11111abcd)
*
* @param souStr
* @return
*/
public String encodeStr(String souStr)
{
/* 分隔符 */
String split = "$";
/* 加密算法 */
String encType = "sha256" ;
/* 随机数
* 生成指定位数的随机数(字母+数字)
* */
RegexUtil regexUtil = new RegexUtil() ;
String randStr = regexUtil.randStr(32);
String jiamaHead = encType + split + randStr + split ;
/* 加密字符串 */
String jiamiStr = DigestUtils.sha256Hex(souStr + randStr);
return jiamaHead + jiamiStr;
}
/**
* (验证)对比加密字符串
*
* 拿着明文再加密一次,比对密文
*
* 加密算法$随机数$密文(加密算法加密(明文+随机数))
* @param souStr
* @return
*/
public boolean checkStr(String souStr,String encodeStr)
{
/* 分隔符 */
String split = "$";
/* 加密算法 */
String encType = "sha256" ;
/* 取随机数
* 按照$拆分
* 0:加密算法
* 1:随机数
* 2:加密后的部分字符串(用不到)
* */
String[] encodeStrs = encodeStr.split("\\"+split);
/* 拆分后的字符串我只使用了第2个 */
if(encodeStrs.length == 3)
{
/* 传入的密码必须含$ */
/* 拼装结果的部分字符串 */
String jiamaHead = encType + split + encodeStrs[1] + split ;
/* 加密字符串 */
String jiamiStr = DigestUtils.sha256Hex(souStr + encodeStrs[1]);
/* 拼装最终的字符串
* 加密算法$随机数$密文(加密算法加密(明文+随机数)) */
String finalStr = jiamaHead + jiamiStr ;
/* 验证明文是否一致 */
return finalStr.equalsIgnoreCase(encodeStr);
}
return false ;
}
/**
* 生成随机字符串(a-zA-Z0-9)
* @param len 长度
* @return
*/
public String randStr(int len)
{
String ALL_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ;
/* 4~ 存储结果 */
StringBuffer sb = new StringBuffer() ;
/* 3~随机生成0-100的数 */
Random random = new Random() ;
for (int i = 0; i < len; i++)
{
/* 1~让charAt中的数字,随机:范围是? */
int randInt = random.nextInt(ALL_STR.length());
/* 2~指定位置上的char字符 */
char ch = ALL_STR.charAt(randInt);
//System.out.println(ch + "---" + randInt);
sb.append(ch);
}
return sb.toString() ;
}
public static void main(String[] args)
{
EncryptUtil encryptUtil = new EncryptUtil() ;
// String res = encryptUtil.encodeStr("111111");
boolean checkStr = encryptUtil.checkStr("111111", "sha256$yw6Ey5XHYeMahaNhbXENLB4SBt9gXdmf$9993c49cab6dc101869b54f0de98dff05c4b4c82584ac65f31c9e2797e069b18");
System.out.println(checkStr);
testenc();
}
/**
* 测试一些常见的加密算法
*/
private static void testenc()
{
String souStr = "1login12345678910";
/*
* md5加密 DigestUtils:一定得apache包下面的 文摘
*
* 明文:111111 密码:96e79218965eb72c92a549dd5a330112
*
* Hex是16进制
*/
String md5Str = DigestUtils.md5Hex(souStr);
System.out.println("==md5Str==" + md5Str + "--->length:" + md5Str.length());
/* sha256 */
String sha256Str = DigestUtils.sha256Hex(souStr);
System.out.println("==sha256Str==" + sha256Str + "--->length:" + sha256Str.length());
/*
* sha512
*/
String sha512Str = DigestUtils.sha512Hex(souStr);
System.out.println("==sha512Str==" + sha512Str + "--->length:" + sha512Str.length());
/*
* Base64 Base64可以加密,也可以解密
*/
try
{
byte[] souceByte = souStr.getBytes("UTF-8");
byte[] encodeByte = Base64.encodeBase64(souceByte);
System.out.println("Base64==souceByte==" + Arrays.toString(souceByte));
System.out.println("Base64==encodeByte==" + Arrays.toString(encodeByte));
String encodeStr = new String(encodeByte);
System.out.println("Base64==encodeStr==" + encodeStr);
/* 解密 */
byte[] decodeByte = Base64.decodeBase64(encodeByte);
System.out.println("Base64==decodeByte==" + Arrays.toString(decodeByte));
String decodeStr = new String(decodeByte);
System.out.println("Base64==decodeStr==" + decodeStr);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
/*
* URL加密和解密,不需要codec的包 只能对url里面的特殊字符加密:如://?& 如果是非url,无能
*/
String url = "http://www.baidu.com?id=1&a=10&b=20";
try
{
String encodeUrl = URLEncoder.encode(url, "UTF-8");
System.out.println("==URLEncoder===" + encodeUrl);
String decodeUrl = URLDecoder.decode(encodeUrl, "UTF-8");
System.out.println("==decodeUrl===" + decodeUrl);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
/*
* 明文(公钥):key:(参数1) 盐(私钥):value:(参数2) hex:16进制
*
* 加密参数:公钥大家都知道(客户端和服务器端),并且还在http请求头传输 盐:不在请求头传输;
*
* 返回值:就是加密的字符串
*/
String key = "111111";
String value = "test";
String result = HmacUtils.hmacSha256Hex(key, value);
System.out.println(key + "==hmacSha256Hex====>" + result);
}
}