2014-10-29 75 views
0

我正在Netbeans上使用MySQL和Java持久性API開發Web應用程序。該應用程序需要用戶創建一個帳戶才能使用,我試圖在存入數據庫之前加密密碼。問題是,在我的SQL腳本中,我設置了存儲密碼的用戶帳戶表,其大小限制爲256,並自動生成JPA實體類。如果我正常存儲密碼,這不會產生問題,但每當我嘗試加密密碼時都會出現問題。這是我本來有:Java將加密字符串存儲到MySQL數據庫

import org.netbeans.lib.uihandler.PasswdEncryption; 

public void encryptPassword(String password) 
{ 
    String encryptedPassword = PasswdEncryption.encrypt(password); 

    storeIntoDatabase(password); 
} 

但是,每當我試圖創建一個新帳戶,我收到這是由javax.ConstraintViolationException引起EJBExcepton

我發現PasswdEncryption.encrypt創建了一個大於256的字符串,我認爲這是導致異常的原因。我第一次嘗試改變我原來的SQL腳本,以提高密碼輸入的大小和運行它,但我仍然得到同樣的問題,因爲實體類約束仍然是256。所以我的問題是

  1. 有沒有辦法改變約束無需再次自動生成?
  2. 或者創建一個256或更小的加密字符串?
+0

「我正在嘗試加密密碼」。停在那兒。密碼應該是*散列*,不加密,否則你將失去不可否認性的法律屬性,這就使得它簡直可以讓你的公司破產。不要這樣做。另見[這個問題](http://stackoverflow.com/questions/2283937/how-should-i-ethically-approach-user-password-storage-for-later-plaintext-retrie/2287672#2287672)。 – EJP 2014-10-30 00:31:33

回答

0

你不需要重新生成你的實體類。只需更改Java代碼中的約束條件,編譯並運行您的應用程序。從DDL生成實體類只是NetBeans提供的便利。你可以手工編寫你的類和SQL腳本,或者你可以用任何你喜歡的方式從Java代碼中生成DDL。

+0

你會如何改變約束?那個地方在哪裏? – schen 2014-10-29 22:58:48

+0

約束是您生成的實體Java類中的註釋。請參閱[教程](http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html)。它可以在你的代碼中看起來像這樣:'@Size(min = 2,max = 255)private String password' – nolexa 2014-10-29 23:36:53

+0

謝謝,這工作。 – schen 2014-10-29 23:45:25

0

你應該看看使用bcrypt這個。這是密碼加密的標準,它會產生少於256個字符的字符串。

嘗試jBCrypt library

注意密碼加密是我使用鬆散這裏的一個術語:真的bcrypt做密碼散列。但是,這當然是你應該做的,而不是一個可逆的加密操作。

請參閱this question瞭解重要的進一步細節。

+0

它是一個實現*一個*密碼*散列標準。*不加密,儘管它的名字。 – EJP 2014-10-30 00:33:06

+0

@EJP當然。我正在考慮這是OP的真正意義,當然也是OP真正想要的。也許我應該更清楚一點。 – 2014-10-30 02:55:16

1

在將密碼存入數據庫之前要三思。即使加密。它使你的系統極度脆弱。大多數用戶在多個系統中使用相同的密碼。系統遭到黑客攻擊後,所有這些密碼都會被盜用。

通常的做法是存儲密碼的散列,例如, sha1或md5。這也會幫助你解決你的問題。我建議您修改您的身份驗證方法。

相關問題