博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data JPA 数据加密存储
阅读量:2503 次
发布时间:2019-05-11

本文共 1449 字,大约阅读时间需要 4 分钟。

数据安全永远是个大问题。用户数据存储到数据库中,如果不采取加密手段,那么只要有权限访问数据库的人,都能直接明了的看到用户所有的隐私数据,尤其在中小型公司中,对于数据库权限的管理基本上都是由开发人员直接进行维护管理,这样对于数据安全并不是一个好事,因此如果能将用户私密数据加密存储到数据库中,那么就能稍微提升一些数据安全性。本文讨论的是在

Spring Data JPA 中使用 AES 加解密来存储用户隐私数据,使用的数据库是 mysql。

首先,mysql 提供直接的加解密函数 aes_encrypt() 和 aes_decrypt() ,我们就是直接使用这两个函数。方法比较简单,在需要加解密的字段上,使用 @ColumnTransformer 注解,来调用aes_encrypt() 和 aes_decrypt() 函数。但需要注意的是,aes_encrypt() 加密之后是二进制数据,因此数据库字段类型需要使用 blob,如果你的应用是全新开发的,那么问题不大,但是如果需要在已有的项目中加上数据加密特性,那么你需要修改现有数据库的库表结构,这样代价就比较大了,因此我们可以使用 mysql 的 hex() 函数,将这个二进制的数据,转换为十六进制字符串存储入数据库中。同理,读取时先用 unhex() 函数将十六进制字符串重新转换为二进制数据,再进行解密操作得到最终结果。

@Column(name = "user_name")    @ColumnTransformer(              read = "AES_DECRYPT(UNHEX(user_name), 'ankon')",            write = "HEX(AES_ENCRYPT(?, 'ankon'))"    )    private String userName;

上述方式解决了我们的基本问题,那么,中文呢?经测试,这种方式解析中文完全不OK,因此我们还需要加点料:

@Column(name = "user_name")    @ColumnTransformer(              read = "CAST(AES_DECRYPT(UNHEX(user_name), 'ankon') as char(128))",            write = "HEX(AES_ENCRYPT(?, 'ankon'))"    )    private String userName;

使用 cast ,将解析结果强制转换成字符格式。

愿意猜想:因为没有去查看源码(找起来实在是太麻烦了),所以就猜测下:当我们不使用 cast 时,JPA 从 mysql 获取到的 userName 是一个解密后的二进制数据,但是那个字段本身声明为 String, 那么它应该有默认的转换方法将 byte[] 转换为 String,毕竟是老外写的,那么应该不会去考虑多种乱七八糟的字符编码,毕竟他们用 ISO-8859-1 就够了,所以你看到的结果就是中文乱码,英文OK。加上 cast 之后,在 mysql 层面将结果处理为字符串格式,mysql 的字符编码格式为 utf-8 的话,那么就跟代码层面需要的字符编码格式一致了,因此就正常解析出来了。

转发来自https://blog.csdn.net/zxcvqwer19900720/article/details/87189593

你可能感兴趣的文章
SQL中on条件与where条件的区别
查看>>
Ubuntu下查看软件版本及安装位置
查看>>
安装IIS
查看>>
动态加载JS(转)
查看>>
SWUST OJ(961)
查看>>
js换空格为别的元素
查看>>
Recommendation Systems
查看>>
shell脚本 inotify + rsync 同步脚本
查看>>
maven pom 引入本地jar包
查看>>
QVT之The Relations Language(Part 二)
查看>>
python--dict和set类型--4
查看>>
快速实现Magento多语言的设置和产品数据的多语言方法
查看>>
python操作数据库
查看>>
Django的ORM基本操作补充一对多
查看>>
A - Oil Deposits(搜索)
查看>>
E - Phone List(字典序,string类型使用)
查看>>
自定义SeekBar三步
查看>>
"Coding Interview Guide" -- 设计一个有getMin功能的栈
查看>>
Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)
查看>>
PHP笔记09:PHP之 MVC理解
查看>>