发表于: 2020-07-25 21:54:19
1 1458
项目上传服务器后,图片和css无法加载
因为路径问题.
上传服务器后项目路径发生了变化,
<link href="/Task4/other/css/bootstrap.min.css" rel="stylesheet" type="text/css">
数字签名、信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。
1. 数字签名
数字签名,简单来说就是通过提供可鉴别的数字信息验证自身身份的一种方式。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。分别由发送者持有能够代表自己身份的私钥(私钥不可泄露),由接受者持有与私钥对应的公钥,能够在接受到来自发送者信息时用于验证其身份。
2. 加密和解密
2.1. 加密
数据加密的基本过程,就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”。通过这样的途径,来达到 保护数据不被非法人窃取、阅读的目的。
2.2. 解密
加密的逆过程为解密,即将该编码信息转化为其原来数据的过程。
3. 对称加密和非对称加密
加密算法分对称加密和非对称加密,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外还有一类不需要密钥的散列算法。
常见的对称加密算法主要有DES、3DES、AES 等,常见的非对称算法主要有 RSA、DSA 等,散列算法主要有 SHA-1、MD5 等。
DES工具类
/**
* DES 加密工具类
*/
@Component
public class DesUtil {
private static final Logger log= LogManager.getLogger(DesUtil.class);
//定义加密类型
private static final String ENCRYPT_TYPE = "DES";
private static String defaultKey = "";// 字符串默认键值
//Cipher 此类为加密和解密提供密码功能。
private Cipher encryptCipher = null;// 加密工具
private Cipher decryptCipher = null;// 解密工具
public DesUtil() throws Exception {
this(defaultKey);
}
/**
* 指定密钥构造方法
*
* @param strKey
* 指定的密钥
* @throws Exception
*/
public DesUtil(String strKey) throws Exception {
//java.security,Java中为安全框架提供类和接口。Security.addProvider(Provider provider)
// 将提供者添加到下一个可用位置。
Security.addProvider(new com.sun.crypto.provider.SunJCE());
//生成密钥 getBytes()将字符串变成一个byte数组
Key key = getKey(strKey.getBytes());
//getInstance得到的加密对象
encryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
//初始化加密对象,当Cipher对象被初始化时,它将失去以前得到的所有状态。
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
//getInstance得到的解密对象
decryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
//初始化解密对象
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 加密字节数组
*
* @param arr
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
private byte[] encryptStr(byte[] arr) throws BadPaddingException, IllegalBlockSizeException {
return encryptCipher.doFinal(arr);
}
/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return StrConvertUtil.byteArrToHexStr(encryptStr(strIn.getBytes()));
}
/**
* 解密字节数组
*
* @param arr
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
private byte[] decryptStr(byte[] arr) throws Exception {
return decryptCipher.doFinal(arr);
}
/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
String token= new String(decryptStr(StrConvertUtil.hexStrToByteArr(strIn)));
return token;
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位。不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @return 生成的密钥
*/
private Key getKey(byte[] arrBTmp) {
byte[] arrB = new byte[8];// 创建一个空的8位字节数组(默认值为0)
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
return new javax.crypto.spec.SecretKeySpec(arrB, ENCRYPT_TYPE);
}
public static void main(String[] args) throws Exception {
Token_util token_util = new Token_util();
DesUtil desUtil = new DesUtil();
int id = 15;
String token = id+"/"+System.currentTimeMillis();
String token_en = desUtil.encrypt(token);
String token_de = desUtil.decrypt(token_en);
log.error(token_en);
log.error(desUtil.decrypt(token_en));
// log.error(desUtil.decrypt(token_de));
log.error(token_de.indexOf("/"));
log.error(token_de.substring(0,token_de.indexOf("/")));
log.error(Integer.parseInt(token_en.substring(0,token_en.indexOf("/"))));
}
}
明日计划 完成登录
今日问题 暂无
评论