加密数据的检索

自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集。 首先, 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. numpy序列预处理dna序列_【陪你学生信】七、在数据库中检索相似的序列

    一.相似度Similarity 序列的分析离不开相似度这个指标,相似度比较高的序列往往具有相似的结构.执行相似的功能.所以用未知序列blast得到的结果可以对未知序列进行推测. 当两个序列非常相似时, ...

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

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

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

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

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

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

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

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

  7. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

  8. 实战演练 | 数据库中检索奇数或偶数行的简单方法

    从表中仅选择奇数行或偶数行听起来像是你永远不必做的事情,除非你自行这样做.在谷歌快速搜索一下,可以证实这事情是经常有人会做的,但是,很少有数据库从业者知道如何做,他们总是在线数据库社区求助寻找答案.作 ...

  9. java获取word固定位置的值_java 实现保存Word文档中指定位置的数据,又保存整篇文档...

    1:需求 用户在线编辑完word 文档后希望保存整篇文档, 同时把保存文档中指定位置的数据 2:方案 用 pageoffice  实现既保存Word文档中指定位置的数据,又保存整篇文档 4:核心思想及 ...

最新文章

  1. 学习jvm(一)--java内存区域
  2. Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
  3. 中国碳酸氢钠干粉灭火剂市场产量规模与未来竞争走势研究报告2022年
  4. 数据库系统概论期末复习以及知识整理
  5. boost::hana::make_type用法的测试程序
  6. 扩容是元素还是数组_数组是如何随机访问元素?数组下标为什么从0开始,而不是1?...
  7. SAP Material type mapping
  8. PE文件格式详解(二)
  9. 从前端到后台,开发一个完整功能的小程序
  10. 切比雪夫多项式c语言csdn,切比雪夫多项式(Chebyshev polynomials)
  11. oracle用户互信失效,LINUX SSH互信与用户家目录权限
  12. 本地组策略与安全策略的自动导入
  13. 百度阅读赚钱秘法 人人皆可操作
  14. 【WebFace260M】《WebFace260M:A Benchmark Unveiling the Power of Million-Scale Deep Face Recognition》
  15. IOS5短信拦截怎么实现?
  16. Verilog中寄存器和储存器的建模
  17. 深入理解javascript--javascript与DOM【1】mxx
  18. dep和rpm的安装
  19. will-change的使用
  20. 知识点滴 - 喝啤酒吗

热门文章

  1. L2-013 红色警报 并查集
  2. 五分钟轻松了解Hbase面向列的存储
  3. Java IO: FileReader和FileWriter
  4. Java中几种常量池的区分
  5. Java8系列之重新认识HashMap
  6. Mycat - 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件
  7. 程序员如何面对 HR 面试的 40 个问题
  8. Ajax实现动态及时刷新表格数据
  9. 记录程序人生2020.8.11
  10. interface关键字