restful实现的登录注册DES加密和解密的实现

本文档介绍了如何使用Java实现DES加密和解密,包括加密类`Des`和实用工具类`DesUtil`的详细代码。同时,展示了随机字符串生成的方法,用于盐值的生成。在登录和注册功能中应用了加密,优化了用户体验,并解决了DES加密中key值必须为8字节的问题。
摘要由CSDN通过智能技术生成

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

今天完成加密

参考文档(cnblogs.com/james0/p/70)

先是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);

}

}

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

运行查看效果

v2-10233be61201b1306e34c6744454c4dd_b.jpg


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

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

参考文档jb51.net/article/125200

package com.fuwei.des;


import java.util.Random;

public class CharacterUtils {

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

public static String getRandomString(int length){

//定义一个字符串(A-Z,a-z,0-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-z,A-Z,0-9三种可能

int number=random.nextInt(3);

long result=0;

switch(number){

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

case 0:

//产生A-Z的ASCII码

result=Math.round(Math.random()*25+97);//Math.random()*25+65 产生A-Z的ASCII码

//将ASCII码转换成字符

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

break;

case 1:

//产生a-z的ASCII码

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


v2-f45b7b3048e60bce25ae289630f7f85f_b.jpg


看看控制台的打印


v2-eaad55add6cd484282b85a574aea37da_b.jpg


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

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

注册的部分实行的代码


v2-a649947a1e4232a3127276144659ae3e_b.jpg


接下来是登录部分的代码


v2-edb4587816002c42f80c494847098f94_b.jpg


最后的实现的效果


v2-a18936a201f80f419f501116cfa4b3bd_b.jpg


今天的加密完成

数据的信息对比


v2-b76151abad6f0a6755f625e9e49bf70d_b.jpg


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


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


v2-56d4cd169358ee89af6b713e34d160ed_b.jpg


这样提高用户体验

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


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


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值