[JAVA] Behandeln Sie das gehashte Passwort mit BCryptPasswordEncoder von Spring Security in Perl

Es gibt Zeiten, in denen Sie eine Zeichenfolge wie das Kennwort verwenden möchten, das mit BCryptPasswordEncoder von Spring Security von Perl zur Authentifizierung gehasht wurde.

Nein, ich weiß es nicht.

Annahme

Es gab so ein Ereignis.

In der DB gespeicherter Hash-Wert

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

Ein solcher Wert wurde gespeichert. Es scheint die Arbeit von Spring Security zu sein. Was für ein Wert ist dieser unbekannte Hash-Wert?

Als ich von der Situation abhängig war, googelte ich auf verschiedene Weise, aber es kamen keine Informationen heraus.

Rohes Passwort

JscxAX:5[4Q]NYoK

Ein bestimmter Login-Benutzer "Das ist mein Passwort, ist es richtig?" Ich habe mich in Perl gefragt.

Nun, die seltsame Zeichenfolge, die Spring Security gerade gehasht und gespeichert hat, und die Überprüfung dieses Passworts? Ich weiß nichts über Perl?

Nein, lass uns unser Bestes geben

Es ist überraschend einfach

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 Zeichen
my $check = bcrypt($raw_password, $salt);

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

Ergebnis

ATTERUYO!

War gut. Dort war.

… Eh, kommt das jedes Mal mit ATTERUYO heraus?

Wenn der Benutzer das falsche Passwort eingibt

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

Nur eine Zeile änderte sich zu einem etwas falschen Gefühl.

Ergebnis

ATTENAIYO!

War gut. Ich kann den Fehler richtig beurteilen.

Speichern Sie es auf die gleiche Weise aus Perl

Frühlingssicherheit "Ändern Sie in Perl das Passwort und erstellen Sie eine Funktion zum Speichern." Du sagst.

Ja, Sie verwenden diesen Wert zur Validierung, oder? Muss ich es zu einem Format machen, mit dem Sie umgehen können ...?

… Natürlich musst du das tun.

Der verhasste Perl sollte dazu in der Lage sein. Also tu dein Bestes

Sagen Sie nicht, dass Sie es nicht in Java tun können, Sie können es nicht in Perl tun oder Sie können es nicht gegen den Wind eines Kamels stellen.

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'; #Neues Kennwort

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

say $hashed_password;

Ergebnis

$2a$10$/IwrxT05tg1ZlmUrV.7eAOsowJsbkVHs6ku54FC0VHBew23HOm61W

Ich könnte so etwas tun

Überprüfen Sie dies mit Spring Security

Z86J9_Kr_sDcw#o4 Durch den obigen Perl-Code $2a$10$/IwrxT05tg1ZlmUrV.7eAOsowJsbkVHs6ku54FC0VHBew23HOm61W Es wurde in eine solche Zeichenfolge konvertiert und in der Datenbank gespeichert. Ist es wirklich möglich, diesen Hash mit Java (Spring Security) korrekt zu überprüfen ...?

Code

In der Tat habe ich es mit einem ziemlich geeigneten Code überprüft, der das starke Gefühl hat, von einer Person geschrieben zu werden, die normalerweise kein Java schreibt.

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!");
        }
    }
}

Ergebnis

ATTERUYO!

Ich bin froh, dass ich es richtig gemacht habe.

… Eh, kommt das jedes Mal mit ATTERUYO heraus?

Wenn der Benutzer das falsche Passwort eingibt

        String rawPassword = "Z86Jq_Kr_sDcw#o4";

Nur eine Zeile änderte sich zu einem etwas falschen Gefühl.

Ergebnis

ATTENAIYO!

War gut. Ich kann den Fehler richtig beurteilen.

Was ist mit anderem Hashing?

Es gibt SCryptPasswordEncoder und Pbkdf2PasswordEncoder, aber zu diesem Zeitpunkt ist dies kein Problem in meiner Umgebung, daher sollte es eines Tages jemand zusammenstellen.

Recommended Posts

Behandeln Sie das gehashte Passwort mit BCryptPasswordEncoder von Spring Security in Perl
Hash-Passwörter mit Spring Boot + Spring Security (mit Salt, mit Stretching)
Rufen Sie Ihre eigene Methode mit PreAuthorize in Spring Security auf
Anmeldefunktion mit Spring Security
Melden Sie sich mit HttpServletRequest # in Spring Security in der Servlet 3.x-Umgebung an
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ①
Zertifizierung / Autorisierung mit Spring Security & Thymeleaf
Behandeln Sie Systemumgebungsvariablen in Spring application.properties
Verwenden Sie Spring Security JSP-Tags mit FreeMarker
Wie Spring Security mit Hello World funktioniert
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Testen Sie den Controller mit Mock MVC im Spring Boot
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Implementieren Melden Sie sich mit Twitter in Spring-Boot, Sicherheit, Soziales an
Tests mit @Parameters in Spring 4.3 sollten keine Parameter haben
Versuchen Sie die LDAP-Authentifizierung mit Spring Security (Spring Boot) + OpenLDAP
Fügen Sie mit Spring Security Ihre eigenen Authentifizierungselemente hinzu
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Behandeln Sie JSON domänenübergreifend mit Play Framework
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit