wake-up-neo.net

Das verschlüsselte Passwort sieht nicht wie BCrypt aus

Ich benutze Spring Boot, Spring Security, oauth2 und jwt, um meine Anwendung zu authentifizieren, aber ich bekomme immer wieder diesen unangenehmen Fehler und habe keine Ahnung, was falsch ist. Hoffe, jemand kann mir helfen.

meine CustomDetailsService-Klasse: 

 @Service
    public class CustomDetailsService implements UserDetailsService {

        private static final Logger logger = LoggerFactory.getLogger(CustomDetailsService.class);

        @Autowired
        private UserBO userBo;

        @Autowired
        private RoleBO roleBo;

        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            AppUsers appUsers = null;
            try {
                appUsers = this.userBo.loadUserByUsername(username);
                System.out.println("========|||=========== "+appUsers.getUsername());
            }catch(IndexOutOfBoundsException e){
                throw new UsernameNotFoundException("Wrong username");
            }catch(DataAccessException e){
                e.printStackTrace();
                throw new UsernameNotFoundException("Database Error");
            }catch(Exception e){
                e.printStackTrace();
                throw new UsernameNotFoundException("Unknown Error");
            }

            if(appUsers == null){
                throw new UsernameNotFoundException("Bad credentials");
            }
            logger.info("Username: "+appUsers.getUsername());
            return buildUserFromUserEntity(appUsers);
        }

        private User buildUserFromUserEntity(AppUsers authUsers) {
            Set<UserRole> userRoles = authUsers.getUserRoles();

            boolean enabled = true;
            boolean accountNotExpired = true;
            boolean credentialsNotExpired = true;
            boolean accountNotLocked = true;

            if (authUsers.getAccountIsActive()) {
                try {
                    if(authUsers.getAccountExpired()){
                        accountNotExpired = true;
                    } else if (authUsers.getAccountIsLocked()) {
                        accountNotLocked = true;
                    } else {
                        if (containsRole((userRoles), roleBo.findRoleByName("FLEX_ADMIN"))){
                            accountNotLocked = false;
                        }
                    }
                }catch(Exception e){
                    enabled = false;
                    e.printStackTrace();
                }
            }else {
                accountNotExpired = false;
            }
            // convert model user to spring security user
            String username = authUsers.getUsername();
            String password = authUsers.getPassword();

            List<GrantedAuthority> authorities = buildUserAuthority(userRoles);

            User springUser = new User(username, password,enabled, accountNotExpired, credentialsNotExpired, accountNotLocked, authorities);
            return springUser;
        }

OAuth2Config:

@Configuration
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Bean
    public JwtAccessTokenConverter tokenConverter() {
        JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
        tokenConverter.setSigningKey(PRIVATE_KEY);
        tokenConverter.setVerifierKey(PUBLIC_KEY);
        return tokenConverter;
    }

    @Bean
    public JwtTokenStore tokenStore() {
        return new JwtTokenStore(tokenConverter());
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpointsConfigurer) throws Exception {
        endpointsConfigurer.authenticationManager(authenticationManager)
                .tokenStore(tokenStore())
                .accessTokenConverter(tokenConverter());
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer securityConfigurer) throws Exception {
        securityConfigurer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient(CLIENT_ID)
                .secret(CLIENT_SECRET)
                .scopes("read","write")
                .authorizedGrantTypes("password","refresh_token")
                .accessTokenValiditySeconds(20000)
                .refreshTokenValiditySeconds(20000);
    }
}

Sicherheitskonfiguration: 

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    CustomDetailsService customDetailsService;

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    @Autowired
    protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(customDetailsService).passwordEncoder(encoder());
        System.out.println("Done...finito");
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.NEVER);
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManagerBean();
    }
}

NEIN Fehlermeldung außer:

Hibernate: select appusers0_.id as id1_2_, appusers0_.account_expired as account_2_2_, appusers0_.account_is_active as account_3_2_, appusers0_.account_is_locked as account_4_2_, appusers0_.bank_acct as bank_acc5_2_, appusers0_.branch_id as branch_i6_2_, appusers0_.bvn as bvn7_2_, appusers0_.create_date as create_d8_2_, appusers0_.created_by as created_9_2_, appusers0_.email as email10_2_, appusers0_.email_verified_code as email_v11_2_, appusers0_.gender as gender12_2_, appusers0_.gravatar_url as gravata13_2_, appusers0_.is_deleted as is_dele14_2_, appusers0_.lastname as lastnam15_2_, appusers0_.middlename as middlen16_2_, appusers0_.modified_by as modifie17_2_, appusers0_.modified_date as modifie18_2_, appusers0_.orgnization_id as orgniza19_2_, appusers0_.password as passwor20_2_, appusers0_.phone_no as phone_n21_2_, appusers0_.surname as surname22_2_, appusers0_.token_expired as token_e23_2_, appusers0_.username as usernam24_2_ from users appusers0_ where appusers0_.username=?
Tinubu
2018-03-31 01:42:03.255  INFO 4088 --- [nio-8072-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-03-31 01:42:03.255  INFO 4088 --- [nio-8072-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2018-03-31 01:42:03.281  INFO 4088 --- [nio-8072-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 26 ms
2018-03-31 01:42:03.489  WARN 4088 --- [nio-8072-exec-2] o.s.s.c.bcrypt.BCryptPasswordEncoder     : Encoded password does not look like BCrypt

Mein Modell sind:

@Entity
@Table(name="USERS")
@DynamicUpdate
public class AppUsers {

    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty(notes = "The user auto generated identity", required = true)
    private Long id;

    @Column(name="username")
    @ApiModelProperty(notes = "The username parameter", required = true)
    private String username;

    @Column(name="password")
    @ApiModelProperty(notes = "The password parameter", required = true)
    private String password;

    @JsonManagedReference
    @OneToMany(mappedBy="appUsers")
    private Set<UserRole> userRoles;

'''''' setters and getters
}

Rollenentität:

@Entity
@Table(name="ROLE")
public class Role {

    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "role_id", unique = true, nullable = false)
    private Long Id;

    @Column(name = "name")
    private String roleName;

   @JsonManagedReference
    @OneToMany(mappedBy="role")
    private Set<UserRole> userRoles;

   //getters and setters

}

User_Rple-Entität:

@Entity
@Table(name="USER_ROLE")
@DynamicUpdate
public class UserRole   implements Serializable {

    private static final long serialVersionUID = 6128016096756071383L;

    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty(notes = "The userrole auto generated identity", required = true)
    private long id;

    @JsonBackReference
    @ManyToOne//(fetch=FetchType.LAZY)
    private AppUsers appUsers;

    @JsonBackReference
    @ManyToOne//(fetch=FetchType.LAZY)
    private Role role;

   // getters and setters
}

Mein Kennwort in der Datenbank ist ordnungsgemäß verschlüsselt. Spring security BCrypt ist der Datentyp Varchar (255), der größer als 60 ist. Vielen Dank im Voraus

11
Kunle Ajiboye

BCryptPasswordEncoder zeigt diese Warnung an, wenn ein Rohkennwort nicht mit einem verschlüsselten Kennwort übereinstimmt. 

Das gehashte Passwort könnte jetzt "$ 2b" oder "$ 2y" sein. 

In Spring Security gibt es einen Fehler, der dazu führt, dass ein Regex nach „$ 2a“ sucht. Setzen Sie einen Debug-Punkt an der Funktion matches() in BCryptPasswordEncoder.class.

7
Nikhil

Können Sie noch einmal überprüfen, ob Ihr Client geheim ist?

@Override
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
    configurer
            .inMemory()
            .withClient(clientId)
            .secret(passwordEncoder.encode(clientSecret))
            .authorizedGrantTypes(grantType)
            .scopes(scopeRead, scopeWrite)
            .resourceIds(resourceIds);
}
14

Als die Abhängigkeit von oauth2 in die Cloud verschoben wurde, begann ich mit diesem Problem zu konfrontieren. Früher war es Teil des Sicherheitsrahmens:

<dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId></dependency>

Jetzt ist es Teil des Cloud-Frameworks:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>

Wenn Sie also die Cloud-Abhängigkeit (Finchley.RELEASE) verwenden, müssen Sie das Geheimnis wie folgt kodieren:

@Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
         clients
                .inMemory()
                .withClient("clientapp")
                .authorizedGrantTypes("password","refresh_token")
                .authorities("USER")
                .scopes("read", "write")
                .resourceIds(RESOURCE_ID)
                .secret(passwordEncoder.encode("SECRET"));
    }
8
PKumar

Der PasswordEncoder sollte so eingestellt sein:

@Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
5
Pascal Joret

Bitte überprüfen Sie, ob Ihre Methode UserDetails loadUserByUsername(String username) ein gültiges UserDetail-Objekt zurückgibt. Wenn das zurückgegebene Objekt Null ist/ein Objekt mit ungültigen Werten, wird auch dieser Fehler angezeigt.

1
sandeep pandey

Der beste Weg, um dieses Problem zu identifizieren "Das verschlüsselte Passwort sieht nicht nach BCrypt aus" ist das Einrichten eines Break Porint in der Klasse org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder. Überprüfen Sie anschließend die Grundursache für die Warnung.

if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
    logger.warn("Encoded password does not look like BCrypt");
    return false;
}
0
Lin Chen

Vermutlich fehlt diese Bean in Ihrer Sicherheitskonfiguration SecurityConfig

@Bean
public DaoAuthenticationProvider getAuthenticationProvider() {
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
    authenticationProvider.setUserDetailsService(customDetailsService);
    authenticationProvider.setPasswordEncoder(encoder());
    return authenticationProvider;
}
0
bitscanbyte

Ab heute tritt dieses Problem mit Spring Boot 2.1.7.RELEASE immer noch auf. Ich habe einige Online-Tools verwendet, die mir Hashes mit den Anfangsbuchstaben $ 2b oder $ 2y gaben, die Spring in BCryptPasswordEncoder nicht zulässt:

public class BCryptPasswordEncoder implements PasswordEncoder {
    private Pattern BCRYPT_PATTERN = Pattern
            .compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");
...

Lösung: Verwenden Sie die Klasse BCryptPasswordEncoder, um das Passwort zu verschlüsseln:

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
System.out.println(encoder.encode("admin"));

Und dann:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception {
    auth.inMemoryAuthentication()
            .withUser("admin")
            .password("{bcrypt}$2a$10$6CW1agMzVzBhxDzK0PcxrO/cQcmN9h8ZriVEPy.6DJbVeyATG5mWe")
            .roles("ADMIN");
}
0
Jan Bodnar

BCryptPasswordEncoder entfernt die {bcrypt} -ID nicht, DelegatingPasswordEncoder dagegen. Wenn ich BCryptPasswordEncoder explizit als Encoder für DaoAuthenticationProvider definiere, ruft er die Matches-Methode für BCryptPasswordEncoder (ohne ID-Strip) auf, jedoch nicht für DelegatingPasswordEncoder (mit ID-Strip).

0
Zagrebin Victor

Ich hatte den gleichen Fehler und es lag am Datentyp der Kennwortspalte. Diese Spalte war leer (CHARACTER). Stellen Sie also sicher, dass Sie einen VARCHAR-Datentyp verwenden, oder ändern Sie die Länge für Ihr Kennwort auf 60 Säule.

benutze noop im geheimen für tests.

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
            .withClient("angular")
            .secret("{noop}@ngular0")
            .scopes("read", "write")
            .authorizedGrantTypes("password")
            .accessTokenValiditySeconds(1800);
}
0
Faqtt0