利用简单的技术手段实现不简单的加密解密!

有时在写代码的时候,有这样的需求:要对一个字段进行加密,每次加密出来的字符串要不相同,而且要可以解密! 

那我就开始思考:

虽然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个月。技术或者想法有不成熟之处请各位前辈海涵!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值