【问题标题】:Password and passhash handling practices java web app密码和密码处理实践 java web app
【发布时间】:2017-06-11 03:47:10
【问题描述】:

美好的一天,
我使用普通 JDBC 在 Java 中创建了一个 Web 应用程序
我有以下架构: 领域模型 - 服务层 - DAO 层
服务层是 CRUD 操作的中间人

我的用户类有字段“密码”(User.password)
我在数据库中的用户表有列“pass_hash”
我使用 spring.security 中的 BCrypt,因此不将盐存储为不同的列

问题:

  1. 我需要在域模型层中有哪些字段来处理密码?密码字段? passHash 字段?两个领域?其他想法?
  2. 阅读堆栈溢出后,我发现在创建用户实例时不包含 pass_hash,除非出于安全目的确实需要。问题是我应该省略哪一层 pass_hash: DAO?服务层? AFAIU DAO 层应该只负责数据库通信,所以我不会在那里制作额外的过滤器并使用 pass_hash 从 db 完全读取用户。然后我在服务层中将密码设置为空,如下面的读取方法所示。
  3. 哪一层应该包含散列:DAO/Service?我使用服务(下面的创建方法)

UserService 方法示例

@Override
public Long create(User user) {
    String hashedPassword = BCrypt.hashpw(user.getPassword(),
        BCrypt.gensalt(BCRYPT_SALT_LOG_ROUNDS));
    user.setPassword(hashedPassword);
    return userDao.create(user);
}

@Override
public User read(Long id) {
    User user = userDao.read(id);
    if (user != null) {
        user.setPassword(null);
    }
    return user;
}

谢谢

【问题讨论】:

  • 也许你可以很好地告诉我的问题出了什么问题,而不是在没有任何评论的情况下加上“-”

标签: java security passwords password-hash


【解决方案1】:

只需保存 BCrypt 密码哈希,而不是密码本身。

【讨论】:

  • 这就是我所做的,我在数据库中只有“pass_hash”列。我在那里只保留散列密码。
  • 但是,这是什么意思?我需要在我的用户类中有两个字段还是只有一个字段?我必须使用哪一层来散列密码?当我从数据库读取用户记录时,我应该避免选择密码哈希吗?如果我应该怎么做?
  • 1.注册时通过 BCrypt 运行密码并将哈希值与用户 ID 一起保存在数据库中。 2. 登录时通过 BCrypt 运行密码,从数据库中的用户 id 记录中检索哈希值并进行比较。
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 2014-03-05
  • 2010-10-21
  • 2011-03-21
  • 2011-07-26
  • 1970-01-01
  • 2012-11-26
  • 2014-12-18
相关资源
最近更新 更多