Skip to content

Commit 13ccb83

Browse files
committed
Remove java.util.Base64
java.util.Base64 was not added until JDK8, so we should use Spring Security's Base64 in 4.x Issue: gh-5323
1 parent 127d9ee commit 13ccb83

File tree

7 files changed

+21
-62
lines changed

7 files changed

+21
-62
lines changed

crypto/src/main/java/org/springframework/security/crypto/keygen/Base64StringKeyGenerator.java

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package org.springframework.security.crypto.keygen;
1717

18-
import java.util.Base64;
18+
import org.springframework.security.crypto.codec.Base64;
1919

2020
/**
2121
* A StringKeyGenerator that generates base64-encoded String keys. Delegates to a
@@ -28,7 +28,6 @@
2828
public class Base64StringKeyGenerator implements StringKeyGenerator {
2929
private static final int DEFAULT_KEY_LENGTH = 32;
3030
private final BytesKeyGenerator keyGenerator;
31-
private final Base64.Encoder encoder;
3231

3332
/**
3433
* Creates an instance with keyLength of 32 bytes and standard Base64 encoding.
@@ -43,37 +42,16 @@ public Base64StringKeyGenerator() {
4342
* @param keyLength the key length in bytes
4443
*/
4544
public Base64StringKeyGenerator(int keyLength) {
46-
this(Base64.getEncoder(), keyLength);
47-
}
48-
49-
/**
50-
* Creates an instance with keyLength of 32 bytes and the provided encoder.
51-
* @param encoder the encoder to use
52-
*/
53-
public Base64StringKeyGenerator(Base64.Encoder encoder) {
54-
this(encoder, DEFAULT_KEY_LENGTH);
55-
}
56-
57-
/**
58-
* Creates an instance with the provided key length and encoder.
59-
* @param encoder the encoder to use
60-
* @param keyLength the key length to use
61-
*/
62-
public Base64StringKeyGenerator(Base64.Encoder encoder, int keyLength) {
63-
if(encoder == null) {
64-
throw new IllegalArgumentException("encode cannot be null");
65-
}
6645
if(keyLength < DEFAULT_KEY_LENGTH) {
6746
throw new IllegalArgumentException("keyLength must be greater than or equal to" + DEFAULT_KEY_LENGTH);
6847
}
69-
this.encoder = encoder;
7048
this.keyGenerator = KeyGenerators.secureRandom(keyLength);
7149
}
7250

7351
@Override
7452
public String generateKey() {
7553
byte[] key = this.keyGenerator.generateKey();
76-
byte[] base64EncodedKey = this.encoder.encode(key);
54+
byte[] base64EncodedKey = Base64.encode(key);
7755
return new String(base64EncodedKey);
7856
}
7957
}

crypto/src/main/java/org/springframework/security/crypto/password/LdapShaPasswordEncoder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616

1717
package org.springframework.security.crypto.password;
1818

19+
import org.springframework.security.crypto.codec.Base64;
1920
import org.springframework.security.crypto.codec.Utf8;
2021
import org.springframework.security.crypto.keygen.BytesKeyGenerator;
2122
import org.springframework.security.crypto.keygen.KeyGenerators;
2223

2324
import java.security.MessageDigest;
24-
import java.util.Base64;
2525

2626
/**
2727
* This {@link PasswordEncoder} is provided for legacy purposes only and is not considered
@@ -132,13 +132,13 @@ private String encode(CharSequence rawPassword, byte[] salt) {
132132
prefix = forceLowerCasePrefix ? SSHA_PREFIX_LC : SSHA_PREFIX;
133133
}
134134

135-
return prefix + Utf8.decode(Base64.getEncoder().encode(hash));
135+
return prefix + Utf8.decode(Base64.encode(hash));
136136
}
137137

138138
private byte[] extractSalt(String encPass) {
139139
String encPassNoLabel = encPass.substring(6);
140140

141-
byte[] hashAndSalt = Base64.getDecoder().decode(encPassNoLabel.getBytes());
141+
byte[] hashAndSalt = Base64.decode(encPassNoLabel.getBytes());
142142
int saltLength = hashAndSalt.length - SHA_LENGTH;
143143
byte[] salt = new byte[saltLength];
144144
System.arraycopy(hashAndSalt, SHA_LENGTH, salt, 0, saltLength);

crypto/src/main/java/org/springframework/security/crypto/password/Md4PasswordEncoder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@
1515
*/
1616
package org.springframework.security.crypto.password;
1717

18+
import org.springframework.security.crypto.codec.Base64;
1819
import org.springframework.security.crypto.codec.Hex;
1920
import org.springframework.security.crypto.codec.Utf8;
2021
import org.springframework.security.crypto.keygen.Base64StringKeyGenerator;
2122
import org.springframework.security.crypto.keygen.StringKeyGenerator;
2223

23-
import java.util.Base64;
24-
2524
/**
2625
* This {@link PasswordEncoder} is provided for legacy purposes only and is not considered secure.
2726
*
@@ -120,7 +119,7 @@ private String digest(String salt, CharSequence rawPassword) {
120119

121120
private String encode(byte[] digest) {
122121
if (this.encodeHashAsBase64) {
123-
return Utf8.decode(Base64.getEncoder().encode(digest));
122+
return Utf8.decode(Base64.encode(digest));
124123
}
125124
else {
126125
return new String(Hex.encode(digest));

crypto/src/main/java/org/springframework/security/crypto/password/MessageDigestPasswordEncoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
*/
1616
package org.springframework.security.crypto.password;
1717

18+
import org.springframework.security.crypto.codec.Base64;
1819
import org.springframework.security.crypto.codec.Hex;
1920
import org.springframework.security.crypto.codec.Utf8;
2021
import org.springframework.security.crypto.keygen.Base64StringKeyGenerator;
2122
import org.springframework.security.crypto.keygen.StringKeyGenerator;
2223

2324
import java.security.MessageDigest;
24-
import java.util.Base64;
2525

2626
/**
2727
* This {@link PasswordEncoder} is provided for legacy purposes only and is not considered secure.
@@ -126,7 +126,7 @@ private String digest(String salt, CharSequence rawPassword) {
126126

127127
private String encode(byte[] digest) {
128128
if (this.encodeHashAsBase64) {
129-
return Utf8.decode(Base64.getEncoder().encode(digest));
129+
return Utf8.decode(Base64.encode(digest));
130130
}
131131
else {
132132
return new String(Hex.encode(digest));

crypto/src/main/java/org/springframework/security/crypto/password/Pbkdf2PasswordEncoder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717

1818
import java.security.GeneralSecurityException;
1919
import java.security.NoSuchAlgorithmException;
20-
import java.util.Base64;
2120

2221
import javax.crypto.SecretKeyFactory;
2322
import javax.crypto.spec.PBEKeySpec;
2423

24+
import org.springframework.security.crypto.codec.Base64;
2525
import org.springframework.security.crypto.codec.Hex;
2626
import org.springframework.security.crypto.codec.Utf8;
2727
import org.springframework.security.crypto.keygen.BytesKeyGenerator;
@@ -132,7 +132,7 @@ public String encode(CharSequence rawPassword) {
132132

133133
private String encode(byte[] bytes) {
134134
if(this.encodeHashAsBase64) {
135-
return Base64.getEncoder().encodeToString(bytes);
135+
return Utf8.decode(Base64.encode(bytes));
136136
}
137137
return String.valueOf(Hex.encode(bytes));
138138
}
@@ -161,7 +161,7 @@ private static boolean matches(byte[] expected, byte[] actual) {
161161

162162
private byte[] decode(String encodedBytes) {
163163
if(this.encodeHashAsBase64) {
164-
return Base64.getDecoder().decode(encodedBytes);
164+
return Base64.decode(Utf8.encode(encodedBytes));
165165
}
166166
return Hex.decode(encodedBytes);
167167
}

crypto/src/test/java/org/springframework/security/crypto/keygen/Base64StringKeyGeneratorTests.java

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,51 +16,31 @@
1616

1717
package org.springframework.security.crypto.keygen;
1818

19-
import org.junit.Test;
20-
21-
import java.util.Base64;
19+
import static org.assertj.core.api.Assertions.assertThat;
2220

23-
import static org.assertj.core.api.Assertions.*;
21+
import org.junit.Test;
22+
import org.springframework.security.crypto.codec.Base64;
2423

2524
/**
2625
* @author Rob Winch
27-
* @since 5.0
26+
* @since 4.2.6
2827
*/
2928
public class Base64StringKeyGeneratorTests {
3029
@Test(expected = IllegalArgumentException.class)
3130
public void constructorIntWhenLessThan32ThenIllegalArgumentException() {
3231
new Base64StringKeyGenerator(31);
3332
}
3433

35-
@Test(expected = IllegalArgumentException.class)
36-
public void constructorEncoderWhenEncoderNullThenThrowsIllegalArgumentException() {
37-
Base64.Encoder encoder = null;
38-
new Base64StringKeyGenerator(null);
39-
}
40-
4134
@Test
4235
public void generateKeyWhenDefaultConstructorThen32Bytes() {
4336
String result = new Base64StringKeyGenerator().generateKey();
44-
assertThat(Base64.getDecoder().decode(result.getBytes())).hasSize(32);
37+
assertThat(Base64.decode(result.getBytes())).hasSize(32);
4538
}
4639

4740
@Test
4841
public void generateKeyWhenCustomKeySizeThen32Bytes() {
4942
int size = 40;
5043
String result = new Base64StringKeyGenerator(size).generateKey();
51-
assertThat(Base64.getDecoder().decode(result.getBytes())).hasSize(size);
52-
}
53-
54-
@Test
55-
public void generateKeyWhenBase64Then32Bytes() {
56-
String result = new Base64StringKeyGenerator(Base64.getUrlEncoder()).generateKey();
57-
assertThat(Base64.getUrlDecoder().decode(result.getBytes())).hasSize(32);
58-
}
59-
60-
@Test
61-
public void generateKeyWhenBase64AndCustomKeySizeThen32Bytes() {
62-
int size = 40;
63-
String result = new Base64StringKeyGenerator(Base64.getUrlEncoder(), size).generateKey();
64-
assertThat(Base64.getUrlDecoder().decode(result.getBytes())).hasSize(size);
44+
assertThat(Base64.decode(result.getBytes())).hasSize(size);
6545
}
6646
}

crypto/src/test/java/org/springframework/security/crypto/password/Pbkdf2PasswordEncoderTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919

2020
import org.junit.Test;
2121

22+
import org.springframework.security.crypto.codec.Base64;
2223
import org.springframework.security.crypto.codec.Hex;
24+
import org.springframework.security.crypto.codec.Utf8;
2325
import org.springframework.security.crypto.keygen.KeyGenerators;
2426

2527
import static org.assertj.core.api.Assertions.assertThat;
@@ -91,7 +93,7 @@ public void matchWhenBase64ThenSuccess() {
9193
String encodedPassword = "3FOwOMcDgxP+z1x/sv184LFY2WVD+ZGMgYP3LPOSmCcDmk1XPYvcCQ==";
9294

9395
assertThat(this.encoder.matches(rawPassword, encodedPassword)).isTrue();
94-
java.util.Base64.getDecoder().decode(encodedPassword); // validate can decode as Base64
96+
Base64.decode(Utf8.encode(encodedPassword)); // validate can decode as Base64
9597
}
9698

9799
@Test

0 commit comments

Comments
 (0)