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