Java加密解密介绍

  1. 数据加密过程:发送者用公钥加密,接收者用私钥解密(只有拥有私钥的接收者才能解读加密的内容)

  2. 数字签名过程:甲方用私钥加密,乙方用公钥解密(乙方解密成功说明就是甲方加的密,甲方就不可以抵赖)

  • 3、Hash加密算法(MD5)

MD5全称是Message-Digest Algorithm 5(信息摘要算法5),单向的算法不可逆(被MD5加密的数据不能被解密)。MD5加密后的数据长度要比加密数据小的多,且长度固定,且加密后的串是唯一的。

适用场景:常用在不可还原的密码存储、信息完整性校验等。

信息完整性校验:典型的应用是对一段信息产生信息摘要,以防止被篡改。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

  • 4、混合加密

由于以上加密算法都有各自的缺点(RSA加密速度慢、AES密钥存储问题、MD5加密不可逆),因此实际应用时常将几种加密算法混合使用。

例如:RSA+AES:

采用RSA加密AES的密钥,采用AES对数据进行加密,这样集成了两种加密算法的优点,既保证了数据加密的速度,又实现了安全方便的密钥管理。

那么,采用多少位的密钥合适呢?一般来讲密钥长度越长,安全性越高,但是加密速度越慢。所以密钥长度也要合理的选择,一般RSA建议采用1024位的数字,AES建议采用128位即可。

  • 5、Base64

严格意义讲,Base64并不能算是一种加密算法,而是一种编码格式,是网络上最常见的用于传输8bid字节代码的编码方式之一。

Base64编码可用于在HTTP环境下传递较

必看视频!获取2024年最新Java开发全套学习资料 备注Java

长的标识信息,Base编码不仅不仅比较简单,同时也据有不可读性(编码的数据不会被肉眼直接看到)。

部分代码实现

====================================================================

package com.util;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.Mac;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

import java.security.MessageDigest;

import java.security.SecureRandom;

public class EncryptUtil {

public static final String MD5 = “MD5”;

public static final String SHA1 = “SHA1”;

public static final String HmacMD5 = “HmacMD5”;

public static final String HmacSHA1 = “HmacSHA1”;

public static final String DES = “DES”;

public static final String AES = “AES”;

/*编码格式;默认使用uft-8/

public String charset = “utf-8”;

/*DES/

public int keysizeDES = 0;

/*AES/

public int keysizeAES = 128;

public static EncryptUtil me;

private EncryptUtil(){

//单例

}

//双重锁

public static EncryptUtil getInstance(){

if (me==null) {

synchronized (EncryptUtil.class) {

if(me == null){

me = new EncryptUtil();

}

}

}

return me;

}

/**

  • 使用MessageDigest进行单向加密(无密码)

  • @param res 被加密的文本

  • @param algorithm 加密算法名称

  • @return

*/

private String messageDigest(String res,String algorithm){

try {

MessageDigest md = MessageDigest.getInstance(algorithm);

byte[] resBytes = charset==null?res.getBytes():res.getBytes(charset);

return base64(md.digest(resBytes));

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

  • 使用KeyGenerator进行单向/双向加密(可设密码)

  • @param res 被加密的原文

  • @param algorithm 加密使用的算法名称

  • @param key 加密使用的秘钥

  • @return

*/

private String keyGeneratorMac(String res,String algorithm,String key){

try {

SecretKey sk = null;

if (key==null) {

KeyGenerator kg = KeyGenerator.getInstance(algorithm);

sk = kg.generateKey();

}else {

byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);

sk = new SecretKeySpec(keyBytes, algorithm);

}

Mac mac = Mac.getInstance(algorithm);

mac.init(sk);

byte[] result = mac.doFinal(res.getBytes());

return base64(result);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

  • 使用KeyGenerator双向加密,DES/AES,注意这里转化为字符串的时候是将2进制转为16进制格式的字符串,不是直接转,因为会出错

  • @param res 加密的原文

  • @param algorithm 加密使用的算法名称

  • @param key 加密的秘钥

  • @param keysize

  • @param isEncode

  • @return

*/

private String keyGeneratorES(String res,String algorithm,String key,int keysize,boolean isEncode){

try {

KeyGenerator kg = KeyGenerator.getInstance(algorithm);

if (keysize == 0) {

byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);

kg.init(new SecureRandom(keyBytes));

}else if (key==null) {

kg.init(keysize);

}else {

byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);

kg.init(keysize, new SecureRandom(keyBytes));

}

SecretKey sk = kg.generateKey();

SecretKeySpec sks = new SecretKeySpec(sk.getEncoded(), algorithm);

Cipher cipher = Cipher.getInstance(algorithm);

if (isEncode) {

cipher.init(Cipher.ENCRYPT_MODE, sks);

byte[] resBytes = charset==null?res.getBytes():res.getBytes(charset);

return parseByte2HexStr(cipher.doFinal(resBytes));

}else {

cipher.init(Cipher.DECRYPT_MODE, sks);

return new String(cipher.doFinal(parseHexStr2Byte(res)));

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

private String base64(byte[] res){

return Base64.encode(res);

}

/**将二进制转换成16进制 */

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进制转换为二进制/

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(i2, i2+1), 16);

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

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

}

return result;

}

/**

  • md5加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @return

*/

public String MD5(String res) {

return messageDigest(res, MD5);

}

/**

  • md5加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @param key 秘钥

  • @return

*/

public String MD5(String res, String key) {

return keyGeneratorMac(res, HmacMD5, key);

}

/**

  • 使用SHA1加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @return

*/

public String SHA1(String res) {

return messageDigest(res, SHA1);

}

/**

  • 使用SHA1加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @param key 秘钥

  • @return

*/

public String SHA1(String res, String key) {

return keyGeneratorMac(res, HmacSHA1, key);

}

/**

  • 使用DES加密算法进行加密(可逆)

  • @param res 需要加密的原文

  • @param key 秘钥

  • @return

*/

public String DESencode(String res, String key) {

return keyGeneratorES(res, DES, key, keysizeDES, true);

}

/**

  • 对使用DES加密算法的密文进行解密(可逆)

  • @param res 需要解密的密文

  • @param key 秘钥

  • @return

*/

public String DESdecode(String res, String key) {

return keyGeneratorES(res, DES, key, keysizeDES, false);

}

/**

  • 使用AES加密算法经行加密(可逆)

  • @param res 需要加密的密文

  • @param key 秘钥

  • @return

*/

public String AESencode(String res, String key) {

return keyGeneratorES(res, AES, key, keysizeAES, true);

}

/**

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

BAT面试经验

实战系列:Spring全家桶+Redis等

其他相关的电子书:源码+调优

面试真题:


, keysizeAES, true);

}

/**

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

[外链图片转存中…(img-B17VYWZm-1716454866035)]

BAT面试经验

实战系列:Spring全家桶+Redis等

[外链图片转存中…(img-bTeZo4YO-1716454866036)]

其他相关的电子书:源码+调优

[外链图片转存中…(img-UL9DpHb0-1716454866037)]

面试真题:

[外链图片转存中…(img-5q3drE7G-1716454866037)]

[外链图片转存中…(img-mFjL4OID-1716454866038)]

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值