【问题标题】:Java Storing Encryption string into MySQL DatabaseJava将加密字符串存储到MySQL数据库中
【发布时间】:2014-12-25 19:44:45
【问题描述】:

我正在 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);
}

但是,每当我尝试创建新帐户时,我都会收到由 javax.ConstraintViolationException 引起的 EJBExcepton

我发现 PasswdEncryption.encrypt 正在创建一个大于 256 的字符串,我认为这是导致异常的原因。我首先尝试修改我的原始 SQL 脚本以增加密码条目大小并运行它,但我仍然遇到同样的问题,因为实体类约束仍然是 256。所以我的问题是

  1. 有没有办法改变约束而不必再次自动生成?
  2. 或者创建一个大小为 256 或更小的加密字符串?

【问题讨论】:

  • “我正在尝试加密密码”。停在那儿。密码应该是散列,而不是加密,否则您将失去不可否认性的合法财产,简单地说,这可能会使您的公司破产。不要这样做。另请参阅this question

标签: java mysql jpa encryption netbeans


【解决方案1】:

您应该考虑为此使用 bcrypt。它是密码加密的标准,它会生成少于 256 个字符的字符串。

试试jBCrypt library

请注意,密码加密 是我在这里粗略使用的一个术语:bcrypt 确实对密码进行散列。但这肯定是你应该做的,而不是可逆的加密操作。

有关重要的详细信息,请参阅this question

【讨论】:

  • 它是one密码散列的one标准的一个实现。不是加密,尽管它的名字。
  • @EJP 当然。我认为这就是 OP 可能真正的意思,当然也是 OP 真正想要的。也许我应该更清楚一点。
【解决方案2】:

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

【讨论】:

  • 您将如何更改约束?它在哪里?
  • 约束是您生成的实体 Java 类中的注释。请参阅tutorial。它在您的代码中可能如下所示:@Size(min=2, max=255) private String password
  • @schen 它可能有效,但如果您存储加密密码,您的系统将很容易受到攻击,因此没有必要这样做。请参阅 ursa 的答案以了解原因,以及我的答案以了解您真正应该做的事情。
【解决方案3】:

在将密码存储到数据库之前请三思。甚至加密。它使您的系统非常脆弱。大多数用户在多个系统中使用相同的密码。在您的系统被黑客入侵后 - 所有这些密码都会被泄露。

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

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2013-08-19
    • 1970-01-01
    • 2011-04-26
    • 2017-06-22
    • 1970-01-01
    • 2012-07-04
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多