发表于: 2017-11-14 22:52:51

1 854


今日完成的事情:

今日首先看了一下md5和des加密,两者的区别是:MD5加密生成的密钥是固定的32位,而Base64加密和DES加密,生成的密钥不是固定。另外des加密可逆,而md5加密不可逆。把昨天写的那个des加密进行了修改,说是修改,其实就是把别人的代码看了一下,然后自己拿来用了。

首先是md5加密,由于md5加密是不可逆的,所以只需要加密就行了:

public class Md5Util {
   //根据输入的字符串生成固定的32位MD5码
   public final static String getMd5(String str){
       MessageDigest mdInst=null;
       try {
           //获得MD5摘要算法的 MessageDigest 对象
           mdInst=MessageDigest.getInstance("MD5");
           //使用指定的字节更新摘要
           mdInst.update(str.getBytes());
           //获得密文
           byte[] md=mdInst.digest();
           return StrConvertUtil.byteArrToHexStr(md);
       } catch (NoSuchAlgorithmException e) {
           e.printStackTrace();
           return null;
       }
   }
}

其次是des加密:

des加密是可逆的,所以就分为加密和解密两个过程:

public class DesUtil {
   private static final String ENCRYPT_TYPE="DES";
   private static String defaultKey = "";//字符串默认键值
   private Cipher encryptCipher=null;//加密工具
   private Cipher decryptCipher=null;//解密工具

   public DesUtil() throws Exception{
       this(defaultKey);
   }
   //指定密钥构造方法
   public DesUtil(String strKey) throws Exception {
       Security.addProvider(new com.sun.crypto.provider.SunJCE());
       Key key=getKey(strKey.getBytes());
       encryptCipher=Cipher.getInstance(ENCRYPT_TYPE);
       encryptCipher.init(Cipher.ENCRYPT_MODE,key);
       decryptCipher=Cipher.getInstance(ENCRYPT_TYPE);
       decryptCipher.init(Cipher.DECRYPT_MODE,key);
   }
   //加密字节数组
   private byte[] encryptStr(byte[] arr) throws BadPaddingException, IllegalBlockSizeException {
       return encryptCipher.doFinal(arr);
   }
   //加密字符串
   public String encrypt(String str) throws BadPaddingException, IllegalBlockSizeException {
       return StrConvertUtil.byteArrToHexStr(encryptStr(str.getBytes()));
   }
   //解密字节数组
   private byte[] decryptStr(byte[] arr) throws BadPaddingException, IllegalBlockSizeException {
       return decryptCipher.doFinal(arr);
   }
   //解密字符串
   public String decrypt(String str) throws BadPaddingException, IllegalBlockSizeException {
       return new String(decryptStr(StrConvertUtil.hexStrToByteArr(str)));
   }

   //从指定字符串生成密钥,密钥所需的字节数组长度为8位,不足8位时后面补0,超出8位只取前8位
   private Key getKey(byte[] arrTmp){
       byte[] arrB=new byte[8];//创建一个空的8位字节数组
       for(int i=0;i<arrTmp.length&&i<arrB.length;i++){
           arrB[i]=arrTmp[i];
       }
       Key key=new javax.crypto.spec.SecretKeySpec(arrB,ENCRYPT_TYPE);
       return key;
   }

还写了一个工具转换类,可以把byte数组转换为16进制的字符串,把16进制字符串转换成byte数组:

public class StrConvertUtil {
   //将byte数组转换为表示16进制的字符串
   public static String byteArrToHexStr(byte[] arr){
       //获得byte数组的长度
       int length=arr.length;
       //每个byte(8位)用两个(16)进制字符,所以字符串的长度是数组长度的两倍
       StringBuffer stringBuffer=new StringBuffer(length*2);
       for(int i=0;i<length;i++){
           //把每个字节转换成int类型
           int intTmp=arr[i];
           while (intTmp<0){
               intTmp=intTmp+256;//把负数转换为正数
           }
           if(intTmp<16){
               stringBuffer.append("0");//小于0F的数,在前面补0
           }
           stringBuffer.append(Integer.toString(intTmp,16));
       }
       return stringBuffer.toString();
   }
   //将16进制字符串转换为byte[]数组
   public static byte[] hexStrToByteArr(String str){
       //16进制字符串转换为数组
       byte[] arr=str.getBytes();
       //字节数组长度
       int length=arr.length;
       //两个16进制字符表示一个字节,所以字节数组长度是字符串的一半
       byte[] arrOut=new byte[length/2];
       for(int i=0;i<length;i=i+2){
           String strTmp=new String(arr,i,2);
           arrOut[i/2]=(byte)Integer.parseInt(strTmp,16);
       }
       return arrOut;
   }
}

进行了测试:

public static void main(String[] args){
   try {
       DesUtil des=new DesUtil("java");
       String src="对我进行加密";
       String src1=des.encrypt(src);
       String src2=des.decrypt(src1);
       String src3=Md5Util.getMd5(src);
       System.out.println("DES加密前的字符串:"+src+",长度:"+src.length());
       System.out.println("DES加密后的字符串:"+src1+",长度:"+src1.length());
       System.out.println("DES解密后的字符串:"+src2+",长度:"+src2.length());
       System.out.println("MD5加密后的字符串:"+src3+",长度:"+src3.length());
   } catch (Exception e) {
       e.printStackTrace();
   }
}

测试结果:

加密,解密写完了之后,就没有了思路。不知道该如何下手,然后和师兄讨论了一下,大概知道了思路。

接下来写了两个页面,一个登陆,一个注册:

<form>
<table>
   <tr>
       <td><label>用户名:</label></td>
       <td><input type="text" id="name" name="name"></td>
   </tr>
   <tr>
       <td><label>密码:</label></td>
       <td><input type="password" id="passWord" name="passWord"></td>
   </tr>
   <tr>
       <td><input type="submit" value="登陆"></td>
       <td><input type="reset"></td>
   </tr>
</table>
</form>

另外一个页面和这个类似,就不再重复贴了。然后今天还看了一下拦截器,我的感觉就是拦截器和Spring AOP很相似。

拦截器已经写了个大概,在spring-mvc.xml中也已经配置了。没有写完,等到明天再贴吧。

明日计划的事情:

今天已经大体的代码部分完成了大部分,明天把剩下的代码和逻辑理顺,这个任务并不难,最难的就是逻辑部分了。

遇到的问题:

逻辑还是有点混乱,在师兄提示下,知道了写的这么多工具类都是用来干什么的。

收获:

对字段加密,还有拦截器的作用和配置。

任务开始时间:2017/11/14

预计完成时间:2017/11/18

延期:无

禅道:http://task.ptteng.com/zentao/my-task.html



返回列表 返回列表
评论

    分享到