2014-10-29 113 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。这也会帮助你解决你的问题。我建议您修改您的身份验证方法。

相关问题