[JAVA] Gérer le mot de passe haché avec BCryptPasswordEncoder de Spring Security en Perl

Il y a des moments où vous souhaitez utiliser une chaîne telle qu'un mot de passe qui a été hachée avec BCryptPasswordEncoder de Spring Security de Perl pour l'authentification.

Non, je ne sais pas.

supposition

Il y a eu un tel événement.

Valeur de hachage stockée dans DB

$2a$10$Cc6/UiniMuKkyVsVM.FUt.rmgDm0UOQxuhuGSSuL/LzZUGrNeGvxq

Une telle valeur a été enregistrée. Cela semble être l'œuvre de Spring Security. Quel type de valeur est cette valeur de hachage inconnue?

Quand j'étais accro à la situation, j'ai cherché sur Google de diverses manières, mais aucune information n'est sortie.

Mot de passe brut

JscxAX:5[4Q]NYoK

Un certain utilisateur de connexion "C'est mon mot de passe, est-ce correct?" Je me suis demandé en Perl.

Eh bien, vérification de cette étrange chaîne de caractères et de ce mot de passe que Spring Security vient de hacher et de sauvegarder? Je ne sais pas pour Perl?

Non, faisons de notre mieux

C'est étonnamment facile

code

use strict;
use warnings;
use utf8;
use feature qw(say);
use Crypt::Eksblowfish::Bcrypt qw(bcrypt);

my $raw_password = 'JscxAX:5[4Q]NYoK';

my $hashed_password = '$2a$10$Cc6/UiniMuKkyVsVM.FUt.rmgDm0UOQxuhuGSSuL/LzZUGrNeGvxq';

my $salt  = substr($hashed_password, 0, 29); # "$2a$10$" +22 caractères
my $check = bcrypt($raw_password, $salt);

if ($check eq $hashed_password) {
    say "ATTERUYO!";
}
else {
    say "ATTENAIYO!";
}

résultat

ATTERUYO!

C'était bien. Il y avait.

… Eh, est-ce que ça sort avec «ATTERUYO!» À chaque fois?

Si l'utilisateur entre le mauvais mot de passe

my $raw_password = 'JscxAX:4[5Q]NYoK';

Une seule ligne a changé pour un sentiment légèrement faux.

résultat

ATTENAIYO!

C'était bien. Je peux juger correctement l'erreur.

Enregistrez-le depuis Perl de la même manière

Sécurité du printemps "Depuis Perl, changez le mot de passe et créez une fonction pour le sauvegarder." Vous dites.

Ouais, vous utilisez cette valeur pour la validation, non? Dois-je en faire un format que vous pouvez gérer ...?

… Bien sûr, vous devez le faire.

Le Perl détesté devrait pouvoir le faire. Alors fais de ton mieux

Ne dites pas que vous ne pouvez pas le faire en Java, que vous ne pouvez pas le faire en Perl, ou que vous ne pouvez pas le mettre au vent d'un chameau.

code

use strict;
use warnings;
use utf8;
use feature qw(say);
use Crypt::Eksblowfish::Bcrypt qw(bcrypt en_base64);
use Crypt::Random qw(makerandom_octet);

sub gen_salt {
    return en_base64(makerandom_octet(Length => 16));
}

my $raw_password = 'Z86J9_Kr_sDcw#o4'; #nouveau mot de passe

my $salt = '$2a$10$' . gen_salt();
my $hashed_password = bcrypt($raw_password, $salt);

say $hashed_password;

résultat

$2a$10$/IwrxT05tg1ZlmUrV.7eAOsowJsbkVHs6ku54FC0VHBew23HOm61W

Je pourrais faire quelque chose comme ça

Vérifier avec Spring Security

Z86J9_Kr_sDcw#o4 Par le code Perl ci-dessus $2a$10$/IwrxT05tg1ZlmUrV.7eAOsowJsbkVHs6ku54FC0VHBew23HOm61W Il a été converti en une chaîne de caractères comme celle-ci et enregistré dans la base de données. Est-il vraiment possible de vérifier correctement ce hachage avec Java (Spring Security) ...?

code

En effet, je l'ai vérifié avec un code assez approprié qui a un fort sentiment d'être écrit par une personne qui n'écrit généralement pas Java.

package com.example.demo;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

public class DemoApplication {
    public static void main(String[] args) {
        String rawPassword = "Z86Jq_Kr_sDcw#o4";
        String hashedPassword = "$2a$10$/IwrxT05tg1ZlmUrV.7eAOsowJsbkVHs6ku54FC0VHBew23HOm61W";

        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

        if (passwordEncoder.matches(rawPassword, hashedPassword)) {
            System.out.println("ATTERUYO!");
        }
        else {
            System.out.println("ATTENAIYO!");
        }
    }
}

résultat

ATTERUYO!

Je suis content d'avoir pu le faire correctement.

… Eh, est-ce que ça sort avec «ATTERUYO!» À chaque fois?

Si l'utilisateur entre le mauvais mot de passe

        String rawPassword = "Z86Jq_Kr_sDcw#o4";

Une seule ligne a changé pour un sentiment légèrement faux.

résultat

ATTENAIYO!

C'était bien. Je peux juger correctement l'erreur.

Qu'en est-il des autres hachages?

Il y a SCryptPasswordEncoder et Pbkdf2PasswordEncoder, mais à ce stade, ce n'est pas un problème dans mon environnement, donc un jour, quelqu'un devrait le mettre en place.

Recommended Posts

Gérer le mot de passe haché avec BCryptPasswordEncoder de Spring Security en Perl
Hash des mots de passe avec Spring Boot + Spring Security (avec sel, avec étirement)
Appelez votre propre méthode avec PreAuthorize dans Spring Security
Fonction de connexion avec Spring Security
Connectez-vous avec HttpServletRequest # login dans Spring Security dans l'environnement Servlet 3.x
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Certification / autorisation avec Spring Security & Thymeleaf
Gérer les variables d'environnement système dans Spring application.properties
Utiliser les balises JSP Spring Security avec FreeMarker
Comment Spring Security fonctionne avec Hello World
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Testez le contrôleur avec Mock MVC dans Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Implémentez la connexion avec Twitter dans Spring-Boot, Security, Social
Les tests avec @Parameters dans Spring 4.3 ne devraient avoir aucun paramètre
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
Ajoutez vos propres éléments d'authentification avec Spring Security
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Gérez le cross-domain JSON avec Play Framework
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0