Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
密码和密码哈希处理实践java web app_Java_Security_Passwords_Password Hash - Fatal编程技术网

密码和密码哈希处理实践java web app

密码和密码哈希处理实践java web app,java,security,passwords,password-hash,Java,Security,Passwords,Password Hash,你好, 我使用纯JDBC用Java创建了一个web应用程序 我有以下体系结构: 域模型-服务层-DAO层 服务层是CRUD操作的中间人 我的用户类具有字段“password”(User.password) 数据库中的我的用户表有列“pass\u hash” 我使用spring.security中的BCrypt,因此不将盐存储为单独的列 问题: 域模型层中需要哪些字段来处理密码?密码字段?密码散列字段?两个领域?还有别的想法吗 在阅读了stack overflow之后,我想到了在创建用户实例时不要

你好,
我使用纯JDBC用Java创建了一个web应用程序
我有以下体系结构: 域模型-服务层-DAO层
服务层是CRUD操作的中间人

我的用户类具有字段“password”(User.password)
数据库中的我的用户表有列“pass\u hash”
我使用spring.security中的BCrypt,因此不将盐存储为单独的列

问题:

  • 域模型层中需要哪些字段来处理密码?密码字段?密码散列字段?两个领域?还有别的想法吗
  • 在阅读了stack overflow之后,我想到了在创建用户实例时不要包含pass_散列,除非出于安全目的确实需要。问题是我应该省略pass\u hash:DAO的哪一层?服务层?AFAIU DAO层应该只负责DB通信,所以我不会在那个里做额外的过滤器,并使用pass_散列从DB中完全读取用户。然后我在服务层中将password设置为null,如下面的read方法所示。
  • 哪一层应该包含散列:DAO/服务?我使用服务(下面的创建方法)
  • 用户服务方法示例

    @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;
    }
    

    谢谢

    只需保存BCrypt密码散列,而不是密码本身。

    我就是这么做的,我在DB中只有“pass\u hash”列。我只保留了散列密码。但是,这是什么意思?我的用户类中需要有两个字段还是只有一个字段?我必须使用哪一层来散列密码?当我从数据库中读取用户记录时,是否应该避免选择密码散列?如果我应该这样做,我该怎么做。注册时,通过BCrypt运行密码,并将散列和用户id一起保存在数据库中。2.登录时,通过BCrypt运行密码,从数据库中的用户id记录中检索哈希值并进行比较。也许您可以很好地告诉我的问题出了什么问题,而不是在没有任何注释的情况下使用“-”