2015-05-11 46 views
1

我有在Hibernate中@Formula註釋一個問題,當我用鑰匙試圖解密密碼列(PWD_COL)(這是從屬性檢索到的文件)替代品@formula註釋或SQL解密函數

代碼:

@Formula("decrypt(PWD_COL, '" + MyKeys.DECRYPT_KEY + "')") 
private String myPwd; 

我想從另一個屬性文件中DECRYPT_KEY。

我得到一個錯誤:

The value for annotation attribute Formula.value must be a constant expression

或者,有沒有辦法模仿Java中的SQL解密函數?

注意:請將密碼字段只讀爲另一個值。這個練習的最終目的是爲了一些遠不那麼重要但仍然需要加密的東西。

回答

1

註釋@Formula註釋的值必須是有效的SQL,因爲它或多或少直接傳遞到底層數據庫。

這也解釋了爲什麼你的想法不會工作 - 數據庫將沒有MyKeys類的概念。

你可以插入一個數據庫表,並在@Formula但安全明智的關鍵從那裏select它可能不是一個特別明智的想法...

真的應該做的事情(或實際上不這樣做)是爲了避免存儲密碼,而是存儲密碼哈希值,然後將這些哈希值與用戶提供的任何憑據的哈希值進行比較。這將加密/哈希移動到Java /內存,並避免有人竊取數據庫時的尷尬,猜測弱密碼或強制加密並將其全部發布到pastebin上!

乾杯,

+1

欣賞建議,但解密密碼只是一個模擬的想法,我正在玩。最終目的是爲了別的。 –

+0

另外MyKeys.DECRYPT_KEY的作品,當我在java類本身給一個靜態值。 –

+0

另外,如果你能提出一種模擬java中的sql解密函數的方法,我將不勝感激。 –

1

我知道,這是不是你在找什麼,但讓我給你一個關於數據庫存儲的密碼的建議,也許你應該改變你如何與密碼的工作心態。

由於安全原因,您不應該在數據庫上解密密碼,所以如果有人丟失密碼,他們應該創建一個新密碼。

要驗證登錄和相關任務,您應該從表單中提取密碼,對其進行加密並與數據庫中的加密數據進行比較。

如果你真的想繼續這樣做,使用@formula與有效的sql值。

+0

謝謝伊戈爾。但是說它不是密碼字段和其他一些不重要的價值,我們能否克服這個問題? –

+0

當然,我可以比較加密的值,但最初我只是使用sql加密(使用一個鍵)來存儲在數據庫中。現在,我可以在java中模擬這個sql加密函數來從表單中加密密碼,然後比較嗎? –

+0

如果不重要,則不需要對其進行加密。如果你真的需要解密它,但仍然不能使用@formula,你可以編寫你自己的解密函數並將它添加到get中。例如:getMYPwd(){decrypt(); return myPwd;} – Igor