mirror of
https://bitbucket.org/wisemapping/wisemapping-open-source.git
synced 2024-11-15 11:07:57 +01:00
Copy Sha1 implementationo
This commit is contained in:
parent
11c6ce1004
commit
2576ad325c
@ -19,21 +19,37 @@
|
|||||||
package com.wisemapping.security;
|
package com.wisemapping.security;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.security.crypto.codec.Base64;
|
||||||
|
import org.springframework.security.crypto.codec.Hex;
|
||||||
|
import org.springframework.security.crypto.codec.Utf8;
|
||||||
import org.springframework.security.crypto.password.MessageDigestPasswordEncoder;
|
import org.springframework.security.crypto.password.MessageDigestPasswordEncoder;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
import org.springframework.security.crypto.codec.Base64;
|
||||||
|
import org.springframework.security.crypto.codec.Hex;
|
||||||
|
import org.springframework.security.crypto.codec.Utf8;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class LegacyPasswordEncoder implements PasswordEncoder {
|
public class LegacyPasswordEncoder implements PasswordEncoder {
|
||||||
final private static Logger logger = Logger.getLogger("com.wisemapping.security.LegacyPasswordEncoder");
|
final private static Logger logger = Logger.getLogger("com.wisemapping.security.LegacyPasswordEncoder");
|
||||||
|
|
||||||
private static final String ENC_PREFIX = "ENC:";
|
private static final String ENC_PREFIX = "ENC:";
|
||||||
private static final PasswordEncoder sha1Encoder = new MessageDigestPasswordEncoder("SHA-1");
|
private final ShaPasswordEncoder sha1Encoder = new ShaPasswordEncoder();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String encode(CharSequence rawPassword) {
|
public String encode(CharSequence rawPassword) {
|
||||||
|
|
||||||
logger.info("LegacyPasswordEncoder encode executed.");
|
logger.info("LegacyPasswordEncoder encode executed.");
|
||||||
return ENC_PREFIX + sha1Encoder.encode(rawPassword);
|
return ENC_PREFIX + sha1Encoder.encode(rawPassword.toString(), "");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +57,101 @@ public class LegacyPasswordEncoder implements PasswordEncoder {
|
|||||||
public boolean matches(CharSequence rawPassword, String encodedPassword) {
|
public boolean matches(CharSequence rawPassword, String encodedPassword) {
|
||||||
|
|
||||||
final String encode = encode(rawPassword);
|
final String encode = encode(rawPassword);
|
||||||
logger.info("LegacyPasswordEncoder encode executed ->" + encode + ":" + encodedPassword);
|
|
||||||
return encode.equals(encodedPassword);
|
return encode.equals(encodedPassword);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just copied to keep compatibility with Spring 3.
|
||||||
|
*/
|
||||||
|
class ShaPasswordEncoder {
|
||||||
|
|
||||||
|
private final String algorithm;
|
||||||
|
private boolean encodeHashAsBase64;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The digest algorithm to use
|
||||||
|
* Supports the named <a href="http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html#AppA">
|
||||||
|
* Message Digest Algorithms</a> in the Java environment.
|
||||||
|
**/
|
||||||
|
ShaPasswordEncoder() {
|
||||||
|
|
||||||
|
this("SHA-1", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience constructor for specifying the algorithm and whether or not to enable base64 encoding
|
||||||
|
*
|
||||||
|
* @param algorithm
|
||||||
|
* @param encodeHashAsBase64
|
||||||
|
* @throws IllegalArgumentException if an unknown
|
||||||
|
*/
|
||||||
|
private ShaPasswordEncoder(String algorithm, boolean encodeHashAsBase64) throws IllegalArgumentException {
|
||||||
|
this.algorithm = algorithm;
|
||||||
|
this.encodeHashAsBase64 = encodeHashAsBase64;
|
||||||
|
getMessageDigest();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes the rawPass using a MessageDigest.
|
||||||
|
* If a salt is specified it will be merged with the password before encoding.
|
||||||
|
*
|
||||||
|
* @param rawPass The plain text password
|
||||||
|
* @param salt The salt to sprinkle
|
||||||
|
* @return Hex string of password digest (or base64 encoded string if encodeHashAsBase64 is enabled.
|
||||||
|
*/
|
||||||
|
public String encode(String rawPass, Object salt) {
|
||||||
|
String saltedPass = mergePasswordAndSalt(rawPass, salt, false);
|
||||||
|
|
||||||
|
MessageDigest messageDigest = getMessageDigest();
|
||||||
|
|
||||||
|
byte[] digest = messageDigest.digest(Utf8.encode(saltedPass));
|
||||||
|
|
||||||
|
if (getEncodeHashAsBase64()) {
|
||||||
|
return Utf8.decode(Base64.encode(digest));
|
||||||
|
} else {
|
||||||
|
return new String(Hex.encode(digest));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a MessageDigest instance for the given algorithm.
|
||||||
|
* Throws an IllegalArgumentException if <i>algorithm</i> is unknown
|
||||||
|
*
|
||||||
|
* @return MessageDigest instance
|
||||||
|
* @throws IllegalArgumentException if NoSuchAlgorithmException is thrown
|
||||||
|
*/
|
||||||
|
private final MessageDigest getMessageDigest() throws IllegalArgumentException {
|
||||||
|
try {
|
||||||
|
return MessageDigest.getInstance(algorithm);
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new IllegalArgumentException("No such algorithm [" + algorithm + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Methods ========================================================================================================
|
||||||
|
|
||||||
|
private boolean getEncodeHashAsBase64() {
|
||||||
|
return encodeHashAsBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String mergePasswordAndSalt(String password, Object salt, boolean strict) {
|
||||||
|
if (password == null) {
|
||||||
|
password = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strict && (salt != null)) {
|
||||||
|
if ((salt.toString().lastIndexOf("{") != -1)
|
||||||
|
|| (salt.toString().lastIndexOf("}") != -1)) {
|
||||||
|
throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((salt == null) || "".equals(salt)) {
|
||||||
|
return password;
|
||||||
|
} else {
|
||||||
|
return password + "{" + salt.toString() + "}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user