diff --git a/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/Argon2Example.java b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/Argon2Example.java new file mode 100644 index 0000000..594403c --- /dev/null +++ b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/Argon2Example.java @@ -0,0 +1,18 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; + +public class Argon2Example { + + + public String encode(String plainPassword) { + int saltLength = 16; // salt length in bytes + int hashLength = 32; // hash length in bytes + int parallelism = 1; // currently is not supported + int memory = 4096; // memory costs + int iterations = 3; + + Argon2PasswordEncoder argon2PasswordEncoder = new Argon2PasswordEncoder(saltLength, hashLength, parallelism, memory, iterations); + return argon2PasswordEncoder.encode(plainPassword); + } +} diff --git a/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/BCryptExample.java b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/BCryptExample.java new file mode 100644 index 0000000..348f9a3 --- /dev/null +++ b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/BCryptExample.java @@ -0,0 +1,14 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.security.SecureRandom; + +public class BCryptExample { + + public String encode(String plainPassword) { + int strength = 10; + BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(strength, new SecureRandom()); + return bCryptPasswordEncoder.encode(plainPassword); + } +} diff --git a/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/Pbkdf2Example.java b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/Pbkdf2Example.java new file mode 100644 index 0000000..a40b1c9 --- /dev/null +++ b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/Pbkdf2Example.java @@ -0,0 +1,16 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder; + +public class Pbkdf2Example { + + public String encode(String plainPassword) { + + String pepper = "pepper"; // secret key used by password encoding + int iterations = 200000; // number of hash iteration + int hashWidth = 256; // hash with in bits + + Pbkdf2PasswordEncoder pbkdf2PasswordEncoder = new Pbkdf2PasswordEncoder(pepper, iterations, hashWidth); + return pbkdf2PasswordEncoder.encode(plainPassword); + } +} diff --git a/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/SCryptExample.java b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/SCryptExample.java new file mode 100644 index 0000000..2cb9869 --- /dev/null +++ b/spring-boot/password-encoding/src/main/java/io/reflectoring/passwordencoding/encoder/SCryptExample.java @@ -0,0 +1,17 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder; + +public class SCryptExample { + + public String encode(String plainPassword) { + int cpuCost = (int) Math.pow(2, 14); // factor to increase CPU costs + int memoryCost = 8; // factor to increases memory usage + int parallelization = 1; // currently nor supported by Spring Security + int keyLength = 32; // key length in bytes + int saltLength = 64; // salt length in bytes + + SCryptPasswordEncoder sCryptPasswordEncoder = new SCryptPasswordEncoder(cpuCost, memoryCost, parallelization, keyLength, saltLength); + return sCryptPasswordEncoder.encode(plainPassword); + } +} diff --git a/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/Argon2ExampleTest.java b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/Argon2ExampleTest.java new file mode 100644 index 0000000..6c72f7d --- /dev/null +++ b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/Argon2ExampleTest.java @@ -0,0 +1,22 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class Argon2ExampleTest { + + private Argon2Example argon2Example = new Argon2Example(); + + @Test + void encode() { + // given + String plainPassword = "password"; + + // when + String actual = argon2Example.encode(plainPassword); + + // then + assertThat(actual).startsWith("$argon2id$v=19$m=4096,t=3,p=1"); + } +} \ No newline at end of file diff --git a/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/BCryptExampleTest.java b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/BCryptExampleTest.java new file mode 100644 index 0000000..a2b5c45 --- /dev/null +++ b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/BCryptExampleTest.java @@ -0,0 +1,22 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class BCryptExampleTest { + + private BCryptExample bcryptExample = new BCryptExample(); + + @Test + void encode() { + // given + String plainPassword = "password"; + + // when + String encoded = bcryptExample.encode(plainPassword); + + // then + assertThat(encoded).startsWith("$2a$10"); + } +} \ No newline at end of file diff --git a/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/Pbkdf2ExampleTest.java b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/Pbkdf2ExampleTest.java new file mode 100644 index 0000000..e2a68c6 --- /dev/null +++ b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/Pbkdf2ExampleTest.java @@ -0,0 +1,22 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class Pbkdf2ExampleTest { + + private Pbkdf2Example pbkdf2Example = new Pbkdf2Example(); + + @Test + void encode() { + // given + String plainPassword = "plainPassword"; + + // when + String actual = pbkdf2Example.encode(plainPassword); + + // then + assertThat(actual).hasSize(80); + } +} \ No newline at end of file diff --git a/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/SCryptExampleTest.java b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/SCryptExampleTest.java new file mode 100644 index 0000000..e2ebe7f --- /dev/null +++ b/spring-boot/password-encoding/src/test/java/io/reflectoring/passwordencoding/encoder/SCryptExampleTest.java @@ -0,0 +1,23 @@ +package io.reflectoring.passwordencoding.encoder; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class SCryptExampleTest { + + private SCryptExample sCryptExample = new SCryptExample(); + + @Test + void encode() { + // given + String plainPassword = "password"; + + // when + String actual = sCryptExample.encode(plainPassword); + + // then + assertThat(actual).hasSize(140); + assertThat(actual).startsWith("$e0801"); + } +} \ No newline at end of file