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.
Il y a eu un tel événement.
$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.
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?
C'est étonnamment facile
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!";
}
ATTERUYO!
C'était bien. Il y avait.
… Eh, est-ce que ça sort avec «ATTERUYO!» À chaque fois?
my $raw_password = 'JscxAX:4[5Q]NYoK';
Une seule ligne a changé pour un sentiment légèrement faux.
ATTENAIYO!
C'était bien. Je peux juger correctement l'erreur.
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.
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.
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;
$2a$10$/IwrxT05tg1ZlmUrV.7eAOsowJsbkVHs6ku54FC0VHBew23HOm61W
Je pourrais faire quelque chose comme ça
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) ...?
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!");
}
}
}
ATTERUYO!
Je suis content d'avoir pu le faire correctement.
… Eh, est-ce que ça sort avec «ATTERUYO!» À chaque fois?
String rawPassword = "Z86Jq_Kr_sDcw#o4";
Une seule ligne a changé pour un sentiment légèrement faux.
ATTENAIYO!
C'était bien. Je peux juger correctement l'erreur.
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.