大家好,闲来无事,经常在优快云上学习前辈大神们写的文章,现在自己想想,也应该自己写点东西,养成良好的记录习惯,将平时自己学习的东西记录下来,同时共享给大家学习,未尝不是一件好事。好了,废话不多说了,下面开始旅程吧!
前段时候有个朋友问我,网站登陆密码存在数据库里面存的是明文,是不是不安全,有没有什么简单易行的方法能将页面提交的密码加密后存在数据库里面?我想说是有的,而且就是jdk自带加密解密功能,那么下面就拿出来给大家学习一下吧。
这里介绍使用的是DES算法加密和解密。DES算法的入口参数为三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作秘钥;Data也为8个字节64位,是要被加密或解密的数据;Mode为DES的工作方式,有两种:加密和解密。
DES算法工作流程如下:若Mode为加密模式,则利用Key对数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密模式,则利用Key对密码形式的数据Data进行解密,还原为Data的明码形式(64位)作为DES的输出结果。
我们可以位于javax.crypto包下面的Cipher类和SecretKey类(有兴趣的可以自己去研究一下源码,这里不再赘述)。为了便于项目的使用,我们首先来写一个工具类DesCipherHelper。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
public class DesCipherHelper {
public static SecretKey loadKey(String fileName) throws Exception {
InputStream in = null;
try {
in = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
in = ClassLoader.getSystemResourceAsStream(fileName);
}
//读取秘钥,转换为SecretKey对象
SecretKey desKey = (SecretKey) new ObjectInputStream(in).readObject();
in.close();
return desKey;
}
/*
* 加密
*/
public static byte[] encryptMsg(SecretKey desKey, byte[] msgBytes)
throws Exception {
Cipher cipher = Cipher.getInstance("DES");
//指定Cipher模式
cipher.init(Cipher.ENCRYPT_MODE, desKey);
return cipher.doFinal(msgBytes);
}
/*
* 解密
*/
public static byte[] decryptMsg(SecretKey desKey, byte[] msgBytes)
throws Exception {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, desKey);
return cipher.doFinal(msgBytes);
}
}
解密加密的工具类已经编写完毕,那么接下来我们需要加密解密数据了,代码如下:
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class CipherTest {
//秘钥文件路径
private static String KEY_FILE_PATH = "d://DesKey.des";
//测试字符串
private static String tstString = "cipherTest";
public static void main(String args[]){
try {
//加载秘钥,转换为SecretKey对象
SecretKey desKey = DesCipherHelper.loadKey(KEY_FILE_PATH);
//将测试字符串转换为bytes数组,使用该秘钥加密
byte[] data1 = DesCipherHelper.encryptMsg(desKey, tstString.getBytes());
//输出加密后的密文
System.out.println("密文:" + new String(data1));
//使用该秘钥解密
byte[] data2 = DesCipherHelper.decryptMsg(desKey, data1);
//输出解密后的明文
System.out.println("明文:" + new String(data2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
且看控制台输出信息:
密文:赐瀬.?雬{nN_?n
明文:cipherTest
至此明文加密成功,那么有童鞋要问了,这个秘钥文件哪来啊?没事儿,可以留下你的邮箱,我会发给你。又有童鞋要问了,这个秘钥文件如何生成,
嘿嘿,这个就是今天给大家的遗留的一个小问题,有兴趣的童鞋可以去稍微研究一下,其实本质还是把一个明文秘钥加密到文件里而已,
那么大家有没有想过这个秘钥能不能被解密呢?欢迎大家去尝试一下!谢谢!