我正在使用Netbeans上的MySQL和Java Persistence API开发一个Web应用程序。该应用程序要求用户创建一个要使用的帐户,我试图在存储到数据库之前加密密码。问题在于,在我的SQL脚本中,我设置了用户帐户表,该表将密码存储为大小限制为256的字符串,并自动生成JPA实体类。如果我正常存储密码,这不会产生问题,但只要我尝试加密密码就会出现问题。这就是我最初的所作所为:
import org.netbeans.lib.uihandler.PasswdEncryption;
public void encryptPassword(String password)
{
String encryptedPassword = PasswdEncryption.encrypt(password);
storeIntoDatabase(password);
}
但是,每当我尝试创建新帐户时,都会收到由EJBExcepton
引起的javax.ConstraintViolationException
。
我发现PasswdEncryption.encrypt
创建的字符串大小超过256,我认为这导致异常。我首先尝试修改我的原始SQL脚本以增加密码条目大小并运行它,但我仍然得到相同的问题,因为实体类约束仍然是256.所以我的问题是
答案 0 :(得分:1)
在将密码存储到数据库之前请三思。甚至加密。它会使您的系统极易受到攻击。大多数用户在多个系统中使用相同的密码。系统被黑客入侵后 - 所有这些密码都会受到损害。
通常的做法是存储密码的哈希值,例如: sha1或md5。这也将帮助您解决问题。我建议您修改身份验证方法。
答案 1 :(得分:0)
你应该考虑使用bcrypt。它是密码加密的标准,它可以生成少于256个字符的字符串。
请注意,密码加密是我在这里松散使用的术语:真正的bcrypt执行密码哈希。但这肯定是你应该做的,而不是可逆的加密操作。
有关更多详细信息,请参阅this question。
答案 2 :(得分:0)
您不需要重新生成实体类。只需更改Java代码中的约束,编译并运行应用程序即可。从DDL生成实体类只是NetBeans提供的便利。您可以手动编写类和SQL脚本,也可以以任何方式从Java代码生成DDL。