发表于: 2017-11-14 22:52:51
1 853
今日完成的事情:
今日首先看了一下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
评论