1.最近在写项目时牵扯到了数据库加密问题,因此就趁机把数据库加密这块简单了解了下.
2.mysql 数据库加密方式好像有四五种方式,我用的是AES_DECRYPT函数对相关字段进行加密
3.加密用的函数是AES_ENCRYPT(‘’,‘’),解密用的函数是AES_DECRYPT(‘’,‘’);
其中这两个函数的第一个参数是你加密的字段名称,第二个参数是这该参数定义的key名称.类似于key-value形式
4,下面是我写的一个小demo
4.1 实体类如下(在数据库中定义相对应的数据表)
4.2dao层添加数据方法如下
public void addTest(User user) throws SQLException, ClassNotFoundException {
//连接数据库(连接数据库代码过于简单在这里就省略了);
Connection con = Db.con();
String sql = "INSERT INTO ENCRYPT(username,PASSWORD,number) VALUES (?,HEX(AES_ENCRYPT(?,'password')),?)";
PreparedStatement statement = con.prepareStatement(sql);
statement.setString(1, user.getUsername());
statement.setString(2, user.getPassword());
statement.setString(3, user.getNumber());
statement.executeUpdate();
}
备注:其中sql语句中的意思就是:将password字段进行加密,加密的名字是"password"(名字是自定义的),需要记住,解密的时候还需要用到.
运行该方法后数据库中的内容如下所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191021193419593.png)
到这一步加密就成功了.
5.接下来就是进行解密了
在这里我用了查询你方法来进行解密,代码如下:
public User selectUser(String username) throws SQLException, ClassNotFoundException {
User user = null;
Connection con = Db.con();
String sql = “SELECT *,AES_DECRYPT(UNHEX(PASSWORD), ‘password’) FROM ENCRYPT WHERE username=?”;
PreparedStatement pr = con.prepareStatement(sql);
pr.setString(1, username);
ResultSet resultSet = pr.executeQuery();
while (resultSet.next()) {
user = new User();
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("AES_DECRYPT(UNHEX(PASSWORD), 'password')"));
user.setNumber(resultSet.getString("number"));
}
return user;
}
备注:其中sql语句的意思是,查询ENCRYPT 中所有的内容包括解密后的密码,AES_DECRYPT(UNHEX(PASSWORD), 'password') 这段代码的意思是把key(也就是加密时自定义命名的)为passwrod的PASSWORD字段:
进行解密
效果如下:![在这里插入图片描述](https://img-blog.csdnimg.cn/20191021193929278.png)
到这里解密就成功了.
我当时写到这里的时候也碰到了疑问,就是怎么把解密后的密码赋值给password这个字段,答案就是: user.setPassword(resultSet.getString("AES_DECRYPT(UNHEX(PASSWORD),
直接把解密后的字段名称赋值给password这个字段就行了.
到这里加密解密就全部展示完了,有什么不懂的地方可以评论区留言,大家一块儿进行讨论.