自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集。 首先, Confitura的组织(欧洲最大的Java开发人员免费会议)参加了我所有的免费晚会,然后在相当紧张的住院期间,我们的第二个儿子出生了。 但是,现在,我将尝试再次定期写博客,请继续关注。

在本文中,我将简要介绍如何使用Jasypt库以一种简单,透明的方式将加密的数据存储在数据库中并检索已解密的数据。 我们的用例将是存储Twitter Api凭据,以便它们在我们的数据库中是安全的,但仍易于检索并用于在我们的时间轴中发布更新。

因此,我们有一个简单的实体来代表我们的设置项:

@Entity
public class SettingsItem implements Serializable {@Id@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)private Integer id;private String name;private String encryptedValue;
}

在此表中,我们将存储Twitter消费者密钥,Twitter访问令牌等的值。

我们想要实现的是,当我们创建具有值作为纯文本的SettingItem对象,然后对其进行持久化时,将自动执行加密,因此在数据库中我们已对String进行了加密。 当然,当我们从数据库中检索数据时,我们希望开箱即用地看到解密的String,而无需付出额外的努力。

Jasypt进行救援

Jasypt是一个用Java编写的简单加密库。 它使开发人员免于处理低级配置细节,并使整个加密过程变得简单而直接。 而且现在最有趣的是,它还与Hibernate很好地集成在一起,可以对存储在数据库中的数据进行无缝加密/解密。

设定

要使用Jasypt及其Hibernate集成模块,我们必须在pom中添加以下两项:

<dependency><groupId>org.jasypt</groupId><artifactId>jasypt</artifactId><version>1.9.0</version></dependency><dependency><groupId>org.jasypt</groupId><artifactId>jasypt-hibernate4</artifactId><version>1.9.0</version></dependency>

自订类型

然后,我们必须在实体中声明自定义的Hibernate类型(@TypeDef):

@TypeDef(name="encryptedString",typeClass=EncryptedStringType.class,parameters= {// value will be used later to register encryptor@Parameter(name="encryptorRegisteredName", value="STRING_ENCRYPTOR")}
)
@Entity
public class SettingsItem implements Serializable {// (...)
}

然后在同一个类中,我们可以标记我们的ActivatedValue字段以使用此自定义类型:

@Type(type="encryptedString")private String encryptedValue;

注册加密器

我们快完成了。 我们要做的最后一件事是在HibernatePBEEncryptorRegistry类中注册加密器。 这可以在我们的应用程序的初始化类(例如ServletContext)中完成,也可以仅在具有main(String [] args)方法的类中完成:

String password = System.getProperty("jasypt.password");StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();strongEncryptor.setPassword(password);HibernatePBEEncryptorRegistry registry =HibernatePBEEncryptorRegistry.getInstance();registry.registerPBEStringEncryptor("STRING_ENCRYPTOR", strongEncryptor);

这里重要的一点是,通过使用System.getProperty()或System.getenv(),我们可以安全地配置我们的加密机制,通过在服务器计算机上设置适当的值在运行时提供密码。

摘要

作为总结,一个简短的通过测试表明我们的解决方案有效:

public class SettingsItemRepositoryShould extends IntegrationTest {@Autowiredprivate SettingsItemRepository repository;@BeforeClasspublic static void init() {StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();strongEncryptor.setPassword("JohnDoe");HibernatePBEEncryptorRegistry registry =HibernatePBEEncryptorRegistry.getInstance();registry.registerPBEStringEncryptor("STRING_ENCRYPTOR", strongEncryptor);}@Testpublic void shouldEncryptAndDecryptValue() {// GivenString settingName = "test";String value = "EncryptMe";// Whenrepository.save(new SettingsItem(settingName, value));// ThenSettingsItem settingsItem = repository.findByName(settingName);assertThat(settingsItem.getEncryptedValue()).isEqualTo(value);}
}
参考:通过Code Hard Go Pro博客从我们的JCG合作伙伴 Tomasz Dziurko 透明地持久存储数据库中的数据并检索加密数据 。

翻译自: https://www.javacodegeeks.com/2013/08/transparently-persist-and-retrieve-encrypted-data-from-database.html

透明地持久保存并从数据库中检索加密的数据相关推荐

  1. 加密数据的检索_透明地持久保存并从数据库中检索加密的数据

    加密数据的检索 自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集. 首先, Confitura的组织(欧洲最大的Java开发人员免费会议)参加了我所有的免费晚会,然后在 ...

  2. C# 创建一个Panel并可以通过鼠标拖动并可以拉动改变大小(可生成多个Panel并保存布局到数据库中)

    C# 创建一个Panel并可以通过鼠标拖动并可以拉动改变大小(可生成多个Panel并保存布局到数据库中) 一个用于绘制视频布局的控件,可在背景Panel上生成新的Panel并可以拖动改变位置以及调整大 ...

  3. oracle中的表怎样保存,怎样保存excel 表格数据库中-如何将excel表格更新oracle数据库中数据...

    如何将excel表格更新oracle数据库中数据 这里以SQL SERVE2008为例.SQLSERVER2008有一个"数据导入导出功能",当然我们也可以打开数据库之后,在数据库 ...

  4. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  5. mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间

    很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(500) , row ...

  6. python更新数据库表的时间字段_python更新数据库中某个字段的数据(方法详解)

    连接数据库基本操作,我把每一步的操作是为什么给大家注释一下,老手自行快进. 请注意这是连接数据库操作,还不是更新. import pymysql #导包 #连接数据库 db = pymysql.con ...

  7. mysql十万条数据_2秒内向数据库中插入十万条数据?

    怎么向数据库中快速插入十万条数据呢,当然得需要对比才能看到效果,今天给大家亲身测了两种方法对比,差别25倍左右 1,数据库用sql server 2008 r2,表结构非常简单,四个字段,建数据表的s ...

  8. android 图片存储读取数据库中,如何在android中存储(位图图像​​)并从sqlite数据库中检索图像?...

    设置数据库public class DatabaseHelper extends SQLiteOpenHelper { // Database Version private static final ...

  9. 后端从数据库中查到的数据怎样返回给前端才合适?

    方式一:封装到Map中 把从数据库中查到的数据根据前端的需要封装到Map中,然后把Map返回给前端 弊端:只能够封装类型单一的数据. 方式二:封装到VO中 注意:实体VO中的属性和实体中的属性是一致的 ...

最新文章

  1. MySQL连接问题: MySQLNonTransientConnectionException:Communications link failure during rollback()
  2. 三极管的耐压与hFE之间是什么关系?
  3. 推荐几个小而美的原创公众号!
  4. Centos7 Docker Jenkins ASP.NET Core 2.0 自动化发布和部署
  5. window下的host路径
  6. BZOJ2732: [HNOI2012]射箭
  7. VC++动态链接库编程之MFC规则DLL
  8. 微信小程序中的列表渲染
  9. Android 自定义和可下载字体
  10. oracle数据库快速查询关键字,数据库分页查询关键字
  11. Spark 高级数据分析(第2版)
  12. Phython是什么?
  13. Timed out waiting for /dev/.coldboot_done
  14. 带有两位小数的元转分
  15. APP跟网址最常见的攻击和防守
  16. 基金经理做场外期权的法律风险分析
  17. 基于人脸识别的考勤系统:Python3 + Qt5 + OpenCV3 + FaceNet + MySQL
  18. Android开发之漫漫长途 XII——Fragment 详解
  19. 计算机程序必须装载哪,计算机程序必须装载到内存中才能执行
  20. gzip和gunzip命令

热门文章

  1. 拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码
  2. html点击弹出iframe,JavaScript:关于跨iframe弹窗
  3. python菱形画法解释_用Python画棱形
  4. ReviewForJob——桶式排序+基数排序(==多次桶式排序)
  5. 分布式 虚拟时间和虚拟同步_分布式虚拟跟踪
  6. skynet.fork_Apache Ant 1.10.6发布–用于junitlauncher的fork模式以及新的jmod和链接任务
  7. java中的hashset_Java中的HashSet
  8. java world_Java World中的GraphQL简介
  9. java 枚举内嵌枚举_高度有用的Java ChronoUnit枚举
  10. 限定通配符和非限定通配符_为什么我不信任通配符以及为什么我们仍然需要通配符...