Java将加密字符串存储到MySQL数据库中

时间:2014-10-29 22:17:40

标签: java mysql jpa encryption netbeans

我正在使用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.所以我的问题是

  1. 有没有办法在不必再次自动生成的情况下更改约束?
  2. 或创建大小为256或更小的加密字符串?

3 个答案:

答案 0 :(得分:1)

在将密码存储到数据库之前请三思。甚至加密。它会使您的系统极易受到攻击。大多数用户在多个系统中使用相同的密码。系统被黑客入侵后 - 所有这些密码都会受到损害。

通常的做法是存储密码的哈希值,例如: sha1或md5。这也将帮助您解决问题。我建议您修改身份验证方法。

答案 1 :(得分:0)

你应该考虑使用bcrypt。它是密码加密的标准,它可以生成少于256个字符的字符串。

尝试jBCrypt library

请注意,密码加密是我在这里松散使用的术语:真正的bcrypt执行密码哈希。但这肯定是你应该做的,而不是可逆的加密操作。

有关更多详细信息,请参阅this question

答案 2 :(得分:0)

您不需要重新生成实体类。只需更改Java代码中的约束,编译并运行应用程序即可。从DDL生成实体类只是NetBeans提供的便利。您可以手动编写类和SQL脚本,也可以以任何方式从Java代码生成DDL。