有时在写代码的时候,有这样的需求:要对一个字段进行加密,每次加密出来的字符串要不相同,而且要可以解密!
那我就开始思考:
虽然java内置MD5加密工具,但是MD5是不可解密的。
那使用BASE64可不可以呢?显然不行!因为BASE64对同一个字符串加密出的结果是一样的。不符合需求!
So,懒惰的我开始百度,有结果,但是算法很复杂。但是我现在做的是一个小项目,对安全性的要求不是特别的高,不适合使用太复杂的算法。
那只有开动脑筋了!
先说说我的思路吧:
1,使用BASE64加密方法,但是自己要处理一下.比如说,要对一个编号 "GB6542" 进行加密,那么首先要 对这个编号进行加工,加上一个随机的后缀,例如“abdas”,那么加工后的字符串为:“GB6542abdas”,后边的5位是随机生成的。然后对这个字符串进行BASE64加密,就达到了加密同一个字符串,得到的结果不同的效果!
2,聪明的你肯定想到了解密的方法!没错,就是在生成随机的后缀的时候,把这个后缀最为一个“key”,先对加密后的字符串进行BASE64解密,解密后的字符串,前6位是解密结果,后5位是与key做对照,如果相同,则解密成功,否则失败!
贴出代码:
public static Map<String,String> encrypt(String xmlStr) {
Map<String,String> map = new HashMap<String,String>();
//取得5为随机字符串作为key
String keyStr = getCharAndNumr(5);
map.put("key", keyStr);
xmlStr=xmlStr+keyStr;
byte[] encrypt = null;
try {
// 取需要加密内容的utf-8编码。
encrypt = xmlStr.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 使用Base64加密后返回
String str = new BASE64Encoder().encode(<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">encrypt</span><span style="font-family: Arial, Helvetica, sans-serif;">); </span>
map.put("str", str);
return map;
}
/**
* <li>
* 方法名称:encrypt</li> <li>
* 功能描述:
*
* <pre>
* 解密方法
* </pre>
*
* </li>
*
* @param xmlStr
* 需要解密的消息字符串
* @return 解密后的字符串 ,若keyStr不符,则返回null
* @throws Exception
*/
public static String decrypt(String xmlStr,String keyStr) throws Exception {
// base64解码
BASE64Decoder decoder = new BASE64Decoder();
<span style="white-space:pre"> </span>String str = <span style="white-space:pre">decoder.decodeBuffer(</span>xmlStr<span style="white-space:pre">)</span>;
int length = str.length();
String sub = str.substring(length-5);
if(sub.equals(keyStr)){
int start = 6;
String data = str.substring(start,length-5);
return data;
}else{
return null;
}
}
<span style="white-space:pre"> /**
* java生成随机数字和字母组合
* @param length[生成随机数的长度]
* @return
*/
public static String getCharAndNumr(int length) {
String val = "";
Random random = new Random();
for (int i = 0; i < length; i++) {
// 输出字母还是数字
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
// 字符串
if ("char".equalsIgnoreCase(charOrNum)) {
// 取得大写字母还是小写字母
int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (choice + random.nextInt(26));
} else if ("num".equalsIgnoreCase(charOrNum)) { // 数字
val += String.valueOf(random.nextInt(10));
}
}
return val;
}</span>
</pre><pre name="code" class="java">
PS:本人初学java6个月。技术或者想法有不成熟之处请各位前辈海涵!