【问题标题】:In what form to store salt and how to retrieve it later for password validate以什么形式存储盐以及如何在以后检索它以进行密码验证
【发布时间】:2016-11-03 19:32:52
【问题描述】:

我使用 MD5 算法用盐对密码进行哈希处理。注册用户后,我将散列密码和盐值都存储在我的 SQL 数据库中。不幸的是,当我稍后检索它们时,为了将它们与用户的输入进行比较,我解决了盐编码的问题。我将盐存储为 VARCHAR(16),当我尝试从我的数据库中检索它时,它会以不同的形式转换。这是我的代码:

ResultSet rs = stmt.executeQuery("SELECT * FROM users");
String DB_salt1 = rs.getString("Salt");
byte [] DB_salt = DB_salt1.getBytes(); 

我使用了一些System.out.println(); 函数来定位问题,我发现byte [] DB_salt = DB_salt1.getBytes(); 输出了错误的盐,而String DB_salt1 = rs.getString("Salt"); 输出了正确的盐。我的猜测是它会发生字节丢失。

编辑:为了澄清,正确的盐和存储在我的数据库中的盐,假设是 [B@4e25154。 String DB_salt1 = rs.getString("Salt"); 存储此盐;正确的。但是当byte [] DB_salt = DB_salt1.getBytes();被执行时,它会输出一个不同的盐,从而破坏了整个过程。

【问题讨论】:

  • 不要使用 MD5 作为密码,这不是它的设计目的。其他算法(例如 bcrypt)要好得多,并且实际上可以为您处理存储盐。
  • 如果你执行 .getBytes() 你得到字节,如果你执行 getString() 你得到一个字符串。它们都有不同的外观,因为它们是不同的数据类型@stuXnet 不是 MD5 哈希密码的标准和最常用的方法吗?
  • @KJaeg 我不会说它是“标准”™,但是是的,恐怕它是最常用的密码哈希方法,即使它真的应该不是。
  • @stuXnet 好的,感谢您提供的信息。回到大学,我们的 IT 安全教授告诉我们,我们应该使用最常用的算法,因为使用它们的原因是直到现在还没有人想出破解它们。那时,MD5 是顶级算法。

标签: java database hash md5 salt


【解决方案1】:

在数据库中存储密码的最佳方式是使用 Bcrypt。有了这个,你就不需要储存盐了。

以下是使用 Bcrypt 的示例代码。

1) String pw_hash = BCrypt.hashpw("普通密码", BCrypt.gensalt());

2) 将 pw_hash 存储在数据库中

3) if(BCrypt.checkpw("PLAIN PASSWORD", pw_hash)){ System.out.println("成功登录"); }else{ System.out.println("登录失败"); }

用户首次注册密码时,将遵循步骤 1 和 2。如果给定密码与加密密码匹配,则使用第 3 步。

【讨论】:

  • 不幸的是,我想将盐存储为项目的一部分。
  • 如果您将盐存储在数据库中,那么任何有权访问数据库的人都可以看到盐并加密密码。使用它们,他们可以轻松地解密密码。所以它是高度安全的威胁。
  • 盐不是秘密,散列不是加密。 bcrypt 事实上将盐存储为输出的一部分,请参阅Bcrypt。示例 bcrypt 输出:“$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy”,盐部分为“N9qo8uLOickgx2ZMRZoMye”。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2018-03-23
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多