发表于: 2018-02-11 00:09:03

3 733


昨天完成登录和注册的逻辑

今天完成加密

参考文档(https://www.cnblogs.com/james0/p/7063941.html)

先是des加密类的编写

package com.fuwei.des;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

public class Des {

/**

* 加密

* @param data

* @param sKey

* @return

*/

public static byte[] encrypt(byte[] data, String sKey) {

try {

byte[] key = sKey.getBytes();

// 初始化向量

IvParameterSpec iv = new IvParameterSpec(key);

DESKeySpec desKey = new DESKeySpec(key);

// 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey securekey = keyFactory.generateSecret(desKey);

// Cipher对象实际完成加密操作

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

// 用密匙初始化Cipher对象

cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);

// 现在,获取数据并加密

// 正式执行加密操作

return cipher.doFinal(data);

} catch (Throwable e) {

e.printStackTrace();

}

return null;

}

/**

* 解密

* @param src

* @param sKey

* @return

* @throws Exception

*/

public static byte[] decrypt(byte[] src, String sKey) throws Exception {

byte[] key = sKey.getBytes();

// 初始化向量

IvParameterSpec iv = new IvParameterSpec(key);

// 创建一个DESKeySpec对象

DESKeySpec desKey = new DESKeySpec(key);

// 创建一个密匙工厂

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

// DESKeySpec对象转换成SecretKey对象

SecretKey securekey = keyFactory.generateSecret(desKey);

// Cipher对象实际完成解密操作

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

// 用密匙初始化Cipher对象

cipher.init(Cipher.DECRYPT_MODE, securekey, iv);

// 真正开始解密操作

return cipher.doFinal(src);

}

/**

* 将二进制转换成16进制

*

* @param buf

* @return

*/

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/**

* 16进制转换为二进制

*

* @param hexStr

* @return

*/

public static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1) return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

}

------------------分割线---------------------

接下来是连接的util的类的编写

package com.fuwei.des;

import java.nio.charset.Charset;

public class DesUtil {

/**

* 加密

* @param srcStr

* @param charset

* @param sKey

* @return

*/

public static String encrypt(String srcStr, Charset charset, String sKey) {

byte[] src = srcStr.getBytes(charset);

byte[] buf = Des.encrypt(src, sKey);

return Des.parseByte2HexStr(buf);

}

 

/**

* 解密

*

* @param hexStr

* @param sKey

* @return

* @throws Exception

*/

public static String decrypt(String hexStr, Charset charset, String sKey) throws Exception {

byte[] src = Des.parseHexStr2Byte(hexStr);

byte[] buf = Des.decrypt(src, sKey);

return new String(buf, charset);

}

}

------------------分割线---------------------

先来测试一下看看可以实现功能不

一个测试的类(测试)

package com.fuwei.test;

 

import com.fuwei.des.DesUtil;

 

import java.nio.charset.Charset;

 

public class MainApp {

private static final String SKEY = "abcdefgh";

private static final Charset CHARSET = Charset.forName("gb2312");

 

public static void main(String[] args) {

// 待加密内容

String str = "测试内容,今天周四";

String encryptResult = DesUtil.encrypt(str, CHARSET, SKEY);

System.out.println(encryptResult);

// 直接将如上内容解密

String decryResult = "";

try {

decryResult = DesUtil.decrypt(encryptResult, CHARSET, SKEY);

} catch (Exception e1) {

e1.printStackTrace();

}

System.out.println(decryResult);

}

}

------------------分割线---------------------

运行查看效果

                                             

为了确保salt每次都是随机的

编写一个随机的类生产随机数(两种方法)

参考文档http://www.jb51.net/article/125200.htm

package com.fuwei.des;

 

import java.util.Random;

public class CharacterUtils {

//方法1length为产生的位数

public static String getRandomString(int length){

//定义一个字符串(A-Za-z0-9)即62位;

String str="zxcvbnmlkjhgfdsaqwertyuiop1234567890";//QWERTYUIOPASDFGHJKLZXCVBNM

//Random生成随机数

Random random=new Random();

StringBuffer sb=new StringBuffer();

//长度为几就循环几次

for(int i=0; i<length; ++i){

//产生0-61的数字

int number=random.nextInt(62);

//将产生的数字通过length次承载到sb

sb.append(str.charAt(number));

}

//将承载的字符转换成字符串

return sb.toString();

}

/**

* 第二种方法

*/

public static String getRandomString2(int length){

//产生随机数

Random random=new Random();

StringBuffer sb=new StringBuffer();

//循环length

for(int i=0; i<length; i++){

//产生0-2个随机数,既与a-zA-Z0-9三种可能

int number=random.nextInt(3);

long result=0;

switch(number){

//如果number产生的是数字0

case 0:

//产生A-ZASCII

result=Math.round(Math.random()*25+97);//Math.random()*25+65 产生A-ZASCII

//ASCII码转换成字符

sb.append(String.valueOf((char)result));

break;

case 1:

//产生a-zASCII

result=Math.round(Math.random()*25+97);

sb.append(String.valueOf((char)result));

break;

case 2:

//产生0-9的数字

sb.append(String.valueOf

(new Random().nextInt(10)));

break;

}

}

return sb.toString();

}

public static void main(String[] args) {

System.out.println(CharacterUtils.getRandomString2(8));

}

 

}

但是遇到一点bug

看看控制台的打印

开始还没有注意一直有bug,后面终于发现啦

接下来准备在登录和注册上面实现加密和解密

注册的部分实行的代码

接下来是登录部分的代码

最后的实现的效果

今天的加密完成

数据的信息对比

还有后面优化了一下登录注册的提示

实现的逻辑判断和重复判断

这样提高用户体验

今天完成的事情:把用户的登录和注册加密的方式完成了,顺便还优化了一下登录和注册的友好提示

 

今天遇到的困难:就是在随机数salt的生成的时候那个des里面的key值必须要求是8个字节,开始一直以为是随机数的生成有问题,结果是它类封装的时候必须要8个字节,最后还是解决了这个问题

 

明天的计划:准备完成taken的实现还有Cookie的拦截判断,Cookie的有效性

 



返回列表 返回列表
评论

    分享到