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

自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集。 首先, 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-small

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[译] 2017 年比较 Angular、React、Vue 三剑客

原文地址&#xff1a;Angular vs. React vs. Vue: A 2017 comparison原文作者&#xff1a;Jens Neuhaus译文出自&#xff1a;掘金翻译计划本文永久链接&#xff1a;https://github.com/xitu/gold-miner/blob/master/TODO/angular-vs-react-vs-vue-a-2017-comparison.md译者&…

centos 离线安装mysql_CentOS6离线安装mysql-5.7.25

1.mysql-5.7.25-1.el6.x86_64.rpm-bundle.tar下载百度云资源提取码&#xff1a;ej1y2.把下载的mysql安装包上传到Centos上解压mysql&#xff0c;我这是在Windows上解压的上传到Centos上&#xff0c;我在Centos上解压mysql不知道为什么少了rpm -ivh mysql-community-common-5.7.…

Linux自动化之Cobbler补鞋匠安装

cobbler介绍&#xff1a; 快速网络安装linux操作系统的服务&#xff0c;支持众多的Linux发行版&#xff1a;Red Hat、 Fedora、CentOS、Debian、Ubuntu和SuSE&#xff0c;也可以支持网络安装windows PXE的二次封装&#xff0c;将多种安装参数封装到一个菜单 Python编…

html5中音频的标签,html5中的音频标签安全

有点.Grooveshark向正在流式传输的MP3的服务器端脚本发送POST请求,这使得很难在不自动创建POST请求的情况下访问和欺骗,特别是看到您将不得不尝试存储音频文件那是收集的.但是您可以使用新的AudioContext来帮助大多数现代平台解决这个问题我使用HTML5Rocks.com的一个很好的例子…

如何以10倍速加速Apache Xalan的XPath处理器

一段时间以来&#xff0c; Apache Xalan中存在一个令人尴尬的错误&#xff0c;该错误是XALANJ-2540 。 此错误的后果是Xalan每次XPath表达式求值将内部SPI配置文件加载数千次 &#xff0c;可以很容易地进行如下测量&#xff1a; 这个&#xff1a; Element e (Element)documen…

反射例子(配置文件)

配置文件 className fanshe.Student1 showInfo show1 类student1 public class Student1 {public Student1() {System.out.println("调用了Student1 无参构造函数");}public void show1(){System.out.println("调用了show1()方法");} } 测试类 public cl…

503 Next Greater Element II 下一个更大元素 II

给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c;这意味着你应该循环地搜索它的下一个更…

mysql update nowait_mysql innodb之select for update nowait

作者: 弦乐之花 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明mysql innodb之select for update nowait习惯了oracle数据库的select for update nowait的同学&#xff0c;如果转在mysql环境开发的话&#xff0c;也许会不太适应——目前builtin版本的inn…

使用ant design Pro开发项目的小结

一、关于上手。 1. 关于ant design Pro的介绍&#xff0c;自己看官网&#xff0c;大致上可以理解为ant design&#xff08;组件库&#xff09; ant design Pro &#xff08;完整的项目&#xff09; dva&#xff08;路由 数据流管理&#xff09;的组合拳。总之这个Pro是一个已经…

Activiti中的高级脚本:自定义配置注入

脚本任务可能是Activiti代码库中“最古老的”类之一&#xff0c;但我认为它仍然未被许多人使用。 &#xff08;可以理解的&#xff1f;&#xff09;缺点当然是性能&#xff08;解释还是编译&#xff09;&#xff0c;并且从IDE角度来看支持较少。 但是&#xff0c;好处&#xf…

帆软决策报表嵌入html,在决策报表中使用网页框控件

假设决策报表里有一个网页框控件&#xff0c;控件名为rHIframe0&#xff1b;同时有三个按钮控件&#xff0c;分别给按钮控件添加下面的点击事件&#xff1a;3.1 setValue(String)设置并刷新网页框控件的地址(保留原参数)1)模板路径var Widget this.options.form.getWidgetByNa…

CentOS7.4搭建ftp服务

1.使用yum安装vsftpd yum install vsftpd -y 2.安装完成后&#xff0c;启动 FTP 服务&#xff1a; service vsftpd start 3.配置ftp权限 目前 FTP 服务登陆允许匿名登陆&#xff0c;也无法区分用户访问&#xff0c;为了安全&#xff0c;我们需要设置一下ftp权限 vsftpd 的配置目…

mysql binlog redo_mysql的binlog与redo log

binlogMysql Binlog是二进制格式的日志文件&#xff0c;用来记录Mysql内部对数据库的改动(只记录对数据的修改操作)&#xff0c;主要用于数据库的主从复制以及增量恢复。获取binlog日志列表MariaDB [examples]> show master logs;----------------------| Log_name | File_s…

如何把网址配置为http和https可以同时访问

1.打开iis7 ,找到具体站点 2.点击站点后右侧有个绑定按钮 3.点击绑定&#xff0c;增加https,设置端口&#xff0c;ssl选择 iis证书 4.找到ssl设置&#xff0c;要求证书不勾选&#xff0c;客户证书&#xff0c;忽略 5.如果右侧不显示浏览站点https,点击站点高级设置-已启用协议&…

【前端轶事】Chrome 小恐龙背后的故事

本文转自 FEPulse 公众号&#xff08;微信搜索 FEPulse&#xff0c;精选国内外最新前端资讯&#xff0c;为你把握前端脉搏&#xff09;。 如果你是 Chrome 用户&#xff0c;一定对那萌萌哒的小恐龙不陌生&#xff0c;每当互联网连接断开时&#xff0c;你便能看到那只小恐龙&am…

高起专计算机专业答案,Windows知识题(高起专)答案

WORD格式可编辑.第2章Windows操作系统及其应用(单选题)1.Windows操作系统的主要功能是___B___。A.实现软、硬件转换B.管理计算机系统所有的软、硬件C.把源程序转换为目标程序D.进行数据处理提示&#xff1a;操作系统属于系统软件&#xff0c;它的主要功能是&#xff1a;管理系统…

深浅copy

深浅copy对比 列表赋值 例如&#xff1a;列表a[‘a’, b, c, d, 1, 2, 3]&#xff0c;当执行代码ba&#xff0c;可以得到b[‘a’, b, c, d, 1, 2, 3]&#xff0c;具体实现如下&#xff1a; >>> a[a, b, c, d, 1, 2, 3] >>> ba >>> id(a),id(b) (280…

mysql5 varchar_MYSQL 5.7 VARCHAR 类型实验

MYSQL 的VARCHAR 类型字段的最多能存储多少字符&#xff1f;模糊记得 VARCHAR 最多能存65535个字符&#xff0c;真的吗&#xff1f;理论上&#xff0c;一个字符类型能存的字符数量跟选取的编码字符集和存储长度限制肯定是有关系的&#xff0c;字符编码长度越小&#xff0c;长度…

《React源码解析》系列完结!

前言 距离第一篇《React源码解析(一)》已经过去将近4个月的时间&#xff0c;由于是我第一次进行源码解析相关的写作&#xff0c;思路和文笔还不够成熟。一百多天以来&#xff0c;我基于读者反馈反思这几篇文章中的不足&#xff0c;同时也在不断学习借鉴其他优秀作者的写作方法…

优化Java序列化– Java,XML,JSON,Kryo,POF

也许我很天真&#xff0c;但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快&#xff0c;最有效的方法。 毕竟Java是第7个主要发行版&#xff0c;所以这不是新技术&#xff0c;并且由于每个JDK似乎都比上一个快&#xff0c;因此我错误地认为序列化现在必须非常…