透明地持久保存并从数据库中检索加密的数据
自從我在這里發(fā)表上一個帖子以來已經(jīng)有兩個多月了,但是今年六月和七月非常忙碌而密集。 首先, Confitura的組織(歐洲最大的Java開發(fā)人員免費(fèi)會議)參加了我所有的免費(fèi)晚會,然后在相當(dāng)緊張的住院期間,我們的第二個兒子出生了。 但是,現(xiàn)在,我將嘗試再次定期寫博客,請繼續(xù)關(guān)注。
在本文中,我將簡要介紹如何使用Jasypt庫以一種簡單,透明的方式將加密的數(shù)據(jù)存儲在數(shù)據(jù)庫中并檢索已解密的數(shù)據(jù)。 我們的用例將是存儲Twitter Api憑據(jù),以便它們在我們的數(shù)據(jù)庫中是安全的,但仍易于檢索并用于在我們的時間軸中發(fā)布更新。
因此,我們有一個簡單的實(shí)體來代表我們的設(shè)置項:
@Entity public class SettingsItem implements Serializable {@Id@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)private Integer id;private String name;private String encryptedValue; }在此表中,我們將存儲Twitter消費(fèi)者密鑰,Twitter訪問令牌等的值。
我們想要實(shí)現(xiàn)的是,當(dāng)我們創(chuàng)建具有值作為純文本的SettingItem對象,然后對其進(jìn)行持久化時,將自動執(zhí)行加密,因此在數(shù)據(jù)庫中我們已對String進(jìn)行了加密。 當(dāng)然,當(dāng)我們從數(shù)據(jù)庫中檢索數(shù)據(jù)時,我們希望開箱即用地看到解密的String,而無需付出額外的努力。
Jasypt進(jìn)行救援
Jasypt是一個用Java編寫的簡單加密庫。 它使開發(fā)人員免于處理低級配置細(xì)節(jié),并使整個加密過程變得簡單而直接。 而且現(xiàn)在最有趣的是,它還與Hibernate很好地集成在一起,可以對存儲在數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行無縫加密/解密。
設(shè)定
要使用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>自訂類型
然后,我們必須在實(shí)體中聲明自定義的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 {// (...) }然后在同一個類中,我們可以標(biāo)記我們的ActivatedValue字段以使用此自定義類型:
@Type(type="encryptedString")private String encryptedValue;注冊加密器
我們快完成了。 我們要做的最后一件事是在HibernatePBEEncryptorRegistry類中注冊加密器。 這可以在我們的應(yīng)用程序的初始化類(例如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);這里重要的一點(diǎn)是,通過使用System.getProperty()或System.getenv(),我們可以安全地配置我們的加密機(jī)制,通過在服務(wù)器計算機(jī)上設(shè)置適當(dāng)?shù)闹翟谶\(yùn)行時提供密碼。
摘要
作為總結(jié),一個簡短的通過測試表明我們的解決方案有效:
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 透明地持久存儲數(shù)據(jù)庫中的數(shù)據(jù)并檢索加密數(shù)據(jù) 。翻譯自: https://www.javacodegeeks.com/2013/08/transparently-persist-and-retrieve-encrypted-data-from-database.html
總結(jié)
以上是生活随笔為你收集整理的透明地持久保存并从数据库中检索加密的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10版本1809无法安装升级190
- 下一篇: 电脑上主板看不到型号吗(电脑不开机怎么查