Mit dem Password Encoder von Spring Security können Sie auf einfache Weise gesalzene und gestreckte Hashwerte generieren. Dieser Artikel ist ein Beispiel.
JDK:1.8 Spring Boot:1.5.3.RELEASE Spring Security:4.2.2.RELEASE
Spring Security PasswordEncoder Class Diagram Es ist möglicherweise schwer zu erkennen, aber das Klassendiagramm von PasswordEncoder in Spring Security 4.2.2.RELEASE lautet wie folgt.
Es gibt sechs Implementierungsklassen für die PasswordEncoder-Schnittstelle.
PasswordEncoder-Implementierungsklasse | Überblick |
---|---|
AbstractPasswordEncoder | - |
NoOpPasswordEncoder | Encoder ohne Hashing(zum Test) |
Pbkdf2PasswordEncoder | Implementierung von PasswordEncoder mit PBKDF2 mit konfigurierbarer Anzahl von Iterationen und zufälligem 8-Byte-Zufallssalzwert |
StandardPasswordEncoder | SHA-256 Algorithmen+Encoder, der mit 1024 Strecken hascht |
BCryptPasswordEncoder | Encoder, der Hashing mit dem bcrypt-Algorithmus durchführt |
SCryptPasswordEncoder | Encoder, der Hashing mit dem Verschlüsselungsalgorithmus ausführt |
In diesem Artikel werde ich versuchen, Hashing mit BCryptPasswordEncoder durchzuführen.
Fügen Sie eine Spring Security-Abhängigkeit hinzu.
pom.xml
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
Dieses Mal ist CommandLineRunner als CLI implementiert.
SpringBootEncodeApplication.java
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@SpringBootApplication
public class SpringBootEncodeApplication implements CommandLineRunner {
@Autowired
PasswordEncoder passwordEncoder;
public static void main(String[] args) {
SpringApplication.run(SpringBootEncodeApplication.class, args);
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
public void run(String... args) {
String password = "#fe?3d31";
String digest = passwordEncoder.encode(password);
System.out.println("Hashwert= " + digest);
if (passwordEncoder.matches(password, digest)) {
System.out.println("Es stimmte überein");
return;
}
System.out.println("Es passte nicht zusammen");
}
}
Hash das einfache Passwort (Passwort) mit der Codierungsmethode von PasswordEncoder. Das Ergebnis von Hashing ist Digest. Verwenden Sie dann die Übereinstimmungsmethode von PasswordEncoder, um das einfache Kennwort (Kennwort) mit dem von der Codierungsmethode erhaltenen Hashwert (Digest) abzugleichen.
Ausführungsergebnis.
Hashwert= $2a$10$im98CLRwtWohvPE6wZkYk.Os.RXZVF0iROJXL8vUn7TGrfWoixTdq
Es stimmte überein
Der oben generierte Hashwert ist wie folgt.
$2a$10$im98CLRwtWohvPE6wZkYk.Os.RXZVF0iROJXL8vUn7TGrfWoixTdq
Die Ansicht ist wie folgt.
Zeichenposition | String | Überblick |
---|---|---|
1. bis 3. Zeichen | $2a | Die Versionsnummer von bcrypt. |
4. bis 6. Zeichen | $10 | Stretching zählen(Anzahl der Wiederholungen des Hashing-Vorgangs)Wird sein. Die Häufigkeit ist 2 nach der n-ten Potenz. Daher in diesem Beispiel 2^10=Es wird 1024 mal sein. |
7. bis 29. Zeichen | $im98CLRwtWohvPE6wZkYk. | Salzwert. |
30. bis zum letzten | Os.RXZVF0iROJXL8vUn7TGrfWoixTdq | Passwortkörper. |
Wie oben erwähnt, können Sie mit dem PasswordEncoder von Spring Security Salt + Stretched-Hash-Werte generieren und diese einfach mit einfachen Passwörtern abgleichen.