加密数据的检索_透明地持久保存并从数据库中检索加密的数据
加密數據的檢索
自從我在這里發表上一個帖子以來已經有兩個多月了,但是今年六月和七月非常忙碌而密集。 首先, 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
加密數據的檢索
總結
以上是生活随笔為你收集整理的加密数据的检索_透明地持久保存并从数据库中检索加密的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Spring Security
- 下一篇: 用于SaaS和NoSQL的Jdbi