You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/11/11 10:48:31 UTC

wicket git commit: WICKET-5756 Allow to use custom ciphers when using SunJceCrypt class

Repository: wicket
Updated Branches:
  refs/heads/5756-improve-crypt [created] 776c42dc0


WICKET-5756 Allow to use custom ciphers when using SunJceCrypt class


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/776c42dc
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/776c42dc
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/776c42dc

Branch: refs/heads/5756-improve-crypt
Commit: 776c42dc06ed40c1356859f3c4a81eaafdc4649b
Parents: e850af6
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Nov 11 11:47:56 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Nov 11 11:47:56 2014 +0200

----------------------------------------------------------------------
 .../crypt/KeyInSessionSunJceCryptFactory.java   |  2 +-
 .../wicket/settings/def/SecuritySettings.java   | 17 ++-----
 .../apache/wicket/util/crypt/AbstractCrypt.java |  8 +--
 .../wicket/util/crypt/ClassCryptFactory.java    | 15 +++---
 .../crypt/CryptFactoryCachingDecorator.java     | 10 ++--
 .../wicket/util/crypt/NoCryptFactory.java       | 10 +---
 .../apache/wicket/util/crypt/SunJceCrypt.java   | 53 +++++++++++++++++---
 .../apache/wicket/util/crypt/TrivialCrypt.java  | 11 ----
 8 files changed, 64 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/KeyInSessionSunJceCryptFactory.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/KeyInSessionSunJceCryptFactory.java b/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/KeyInSessionSunJceCryptFactory.java
index d3b137b..b6d25be 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/KeyInSessionSunJceCryptFactory.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/KeyInSessionSunJceCryptFactory.java
@@ -36,7 +36,7 @@ import org.apache.wicket.util.crypt.SunJceCrypt;
 public class KeyInSessionSunJceCryptFactory implements ICryptFactory
 {
 	/** metadata-key used to store crypto-key in session metadata */
-	private static MetaDataKey<String> KEY = new MetaDataKey<String>()
+	private static final MetaDataKey<String> KEY = new MetaDataKey<String>()
 	{
 		private static final long serialVersionUID = 1L;
 	};

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-core/src/main/java/org/apache/wicket/settings/def/SecuritySettings.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/def/SecuritySettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/def/SecuritySettings.java
index 3b7f8ad..5e4aa10 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/def/SecuritySettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/def/SecuritySettings.java
@@ -25,6 +25,7 @@ import org.apache.wicket.authorization.UnauthorizedInstantiationException;
 import org.apache.wicket.settings.ISecuritySettings;
 import org.apache.wicket.util.crypt.CachingSunJceCryptFactory;
 import org.apache.wicket.util.crypt.ICryptFactory;
+import org.apache.wicket.util.lang.Args;
 
 /**
  * @author Jonathan Locke
@@ -80,9 +81,6 @@ public class SecuritySettings implements ISecuritySettings
 		return authorizationStrategy;
 	}
 
-	/**
-	 * @see org.apache.wicket.settings.ISecuritySettings#getCryptFactory()
-	 */
 	@Override
 	public synchronized ICryptFactory getCryptFactory()
 	{
@@ -117,23 +115,14 @@ public class SecuritySettings implements ISecuritySettings
 	@Override
 	public void setAuthorizationStrategy(IAuthorizationStrategy strategy)
 	{
-		if (strategy == null)
-		{
-			throw new IllegalArgumentException("authorization strategy cannot be set to null");
-		}
+		Args.notNull(strategy, "authorization strategy");
 		authorizationStrategy = strategy;
 	}
 
-	/**
-	 * @see org.apache.wicket.settings.ISecuritySettings#setCryptFactory(org.apache.wicket.util.crypt.ICryptFactory)
-	 */
 	@Override
 	public void setCryptFactory(ICryptFactory cryptFactory)
 	{
-		if (cryptFactory == null)
-		{
-			throw new IllegalArgumentException("cryptFactory cannot be null");
-		}
+		Args.notNull(cryptFactory, "Crypt factory");
 		this.cryptFactory = cryptFactory;
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-util/src/main/java/org/apache/wicket/util/crypt/AbstractCrypt.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/crypt/AbstractCrypt.java b/wicket-util/src/main/java/org/apache/wicket/util/crypt/AbstractCrypt.java
index 4d2c7e2..e28db30 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/AbstractCrypt.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/AbstractCrypt.java
@@ -86,7 +86,9 @@ public abstract class AbstractCrypt implements ICrypt
 		try
 		{
 			byte[] encrypted = encryptStringToByteArray(plainText);
-			return new String(new Base64(-1, null, true).encode(encrypted), CHARACTER_ENCODING);
+			Base64 base64 = new Base64(-1, null, true);
+			byte[] encoded = base64.encode(encrypted);
+			return new String(encoded, CHARACTER_ENCODING);
 		}
 		catch (GeneralSecurityException e)
 		{
@@ -142,7 +144,7 @@ public abstract class AbstractCrypt implements ICrypt
 	 *            byte array to decrypt
 	 * @return the decrypted text
 	 */
-	private final byte[] decryptByteArray(final byte[] encrypted)
+	private byte[] decryptByteArray(final byte[] encrypted)
 	{
 		try
 		{
@@ -163,7 +165,7 @@ public abstract class AbstractCrypt implements ICrypt
 	 * @return the string encrypted
 	 * @throws GeneralSecurityException
 	 */
-	private final byte[] encryptStringToByteArray(final String plainText)
+	private byte[] encryptStringToByteArray(final String plainText)
 		throws GeneralSecurityException
 	{
 		try

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-util/src/main/java/org/apache/wicket/util/crypt/ClassCryptFactory.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/crypt/ClassCryptFactory.java b/wicket-util/src/main/java/org/apache/wicket/util/crypt/ClassCryptFactory.java
index a144ecc..b2e260c 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/ClassCryptFactory.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/ClassCryptFactory.java
@@ -57,30 +57,27 @@ public class ClassCryptFactory implements ICryptFactory
 		this.encryptionKey = encryptionKey;
 	}
 
-	/**
-	 * @see org.apache.wicket.util.crypt.ICryptFactory#newCrypt()
-	 */
 	@Override
 	public ICrypt newCrypt()
 	{
 		try
 		{
 			ICrypt crypt = (ICrypt)(cryptClass.get()).newInstance();
-			log.info("using encryption/decryption object " + crypt);
+			log.info("using encryption/decryption object {}", crypt);
 			crypt.setKey(encryptionKey);
 			return crypt;
 		}
 		catch (Exception e)
 		{
 			log.warn("************************** WARNING **************************");
-			log.warn("As the instantion of encryption/decryption class:");
+			log.warn("As the instantiation of encryption/decryption class:");
 			log.warn("\t" + cryptClass);
 			log.warn("failed, Wicket will fallback on a dummy implementation");
 			log.warn("\t(" + NoCrypt.class.getName() + ")");
-			log.warn("This is not recommended for production systems.");
+			log.warn("This is NOT recommended for production systems.");
 			log.warn("Please override method org.apache.wicket.Application.newCrypt()");
-			log.warn("to provide a custom encryption/decryption implementation");
-			log.warn("The cause of the instantion failure: ");
+			log.warn("to provide a custom encryption/decryption implementation.");
+			log.warn("The cause of the instantiation failure: ");
 			log.warn("\t" + e.getMessage());
 			if (log.isDebugEnabled())
 			{
@@ -88,7 +85,7 @@ public class ClassCryptFactory implements ICryptFactory
 			}
 			else
 			{
-				log.warn("set log level to DEBUG to display the stack trace.");
+				log.warn("Set log level to DEBUG to display the stack trace.");
 			}
 			log.warn("*************************************************************");
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-util/src/main/java/org/apache/wicket/util/crypt/CryptFactoryCachingDecorator.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/crypt/CryptFactoryCachingDecorator.java b/wicket-util/src/main/java/org/apache/wicket/util/crypt/CryptFactoryCachingDecorator.java
index 3a8be90..9fc7142 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/CryptFactoryCachingDecorator.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/CryptFactoryCachingDecorator.java
@@ -17,6 +17,8 @@
 package org.apache.wicket.util.crypt;
 
 
+import org.apache.wicket.util.lang.Args;
+
 /**
  * {@link ICryptFactory} decorator that caches the call to {@link ICryptFactory#newCrypt()}
  * 
@@ -35,16 +37,10 @@ public class CryptFactoryCachingDecorator implements ICryptFactory
 	 */
 	public CryptFactoryCachingDecorator(final ICryptFactory delegate)
 	{
-		if (delegate == null)
-		{
-			throw new IllegalArgumentException("delegate cannot be null");
-		}
+		Args.notNull(delegate, "delegate");
 		this.delegate = delegate;
 	}
 
-	/**
-	 * @see org.apache.wicket.util.crypt.ICryptFactory#newCrypt()
-	 */
 	@Override
 	public final ICrypt newCrypt()
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCryptFactory.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCryptFactory.java b/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCryptFactory.java
index a7baba5..f33efce 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCryptFactory.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCryptFactory.java
@@ -26,18 +26,10 @@ public class NoCryptFactory implements ICryptFactory
 {
 	private static final ICrypt crypt = new NoCrypt();
 
-	/**
-	 * Construct.
-	 */
-	public NoCryptFactory()
-	{
-
-	}
-
 	@Override
 	public ICrypt newCrypt()
 	{
 		return crypt;
 	}
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-util/src/main/java/org/apache/wicket/util/crypt/SunJceCrypt.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/crypt/SunJceCrypt.java b/wicket-util/src/main/java/org/apache/wicket/util/crypt/SunJceCrypt.java
index 2af21f4..45642fb 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/SunJceCrypt.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/SunJceCrypt.java
@@ -20,7 +20,9 @@ import java.security.GeneralSecurityException;
 import java.security.NoSuchAlgorithmException;
 import java.security.Provider;
 import java.security.Security;
+import java.security.spec.AlgorithmParameterSpec;
 import java.security.spec.InvalidKeySpecException;
+import java.security.spec.KeySpec;
 
 import javax.crypto.Cipher;
 import javax.crypto.SecretKey;
@@ -28,6 +30,8 @@ import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.PBEKeySpec;
 import javax.crypto.spec.PBEParameterSpec;
 
+import org.apache.wicket.util.lang.Args;
+
 
 /**
  * Provide some simple means to encrypt and decrypt strings such as passwords. The whole
@@ -44,19 +48,35 @@ public class SunJceCrypt extends AbstractCrypt
 	 */
 	private final static int COUNT = 17;
 
-	/** Name of encryption method */
+	/** Name of the default encryption method */
 	private static final String CRYPT_METHOD = "PBEWithMD5AndDES";
 
 	/** Salt */
 	private final static byte[] salt = { (byte)0x15, (byte)0x8c, (byte)0xa3, (byte)0x4a,
 			(byte)0x66, (byte)0x51, (byte)0x2a, (byte)0xbc };
 
+	/** Name of encryption method */
+	private final String cryptMethod;
+
 	/**
 	 * Constructor
 	 */
 	public SunJceCrypt()
 	{
-		if (Security.getProviders("Cipher." + CRYPT_METHOD).length > 0)
+		this(CRYPT_METHOD);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cryptMethod
+	 *              the name of encryption method
+	 */
+	public SunJceCrypt(String cryptMethod)
+	{
+		this.cryptMethod = Args.notNull(cryptMethod, "Crypt method");
+
+		if (Security.getProviders("Cipher." + cryptMethod).length > 0)
 		{
 			return; // we are good to go!
 		}
@@ -77,7 +97,7 @@ public class SunJceCrypt extends AbstractCrypt
 	 * Crypts the given byte array
 	 * 
 	 * @param input
-	 *            byte array to be crypted
+	 *            byte array to be encrypted
 	 * @param mode
 	 *            crypt mode
 	 * @return the input crypted. Null in case of an error
@@ -88,8 +108,8 @@ public class SunJceCrypt extends AbstractCrypt
 		throws GeneralSecurityException
 	{
 		SecretKey key = generateSecretKey();
-		PBEParameterSpec spec = new PBEParameterSpec(salt, COUNT);
-		Cipher ciph = Cipher.getInstance(CRYPT_METHOD);
+		AlgorithmParameterSpec spec = createParameterSpec();
+		Cipher ciph = Cipher.getInstance(cryptMethod);
 		ciph.init(mode, key, spec);
 		return ciph.doFinal(input);
 	}
@@ -106,10 +126,27 @@ public class SunJceCrypt extends AbstractCrypt
 	 * @throws InvalidKeySpecException
 	 *             invalid encryption key
 	 */
-	private final SecretKey generateSecretKey() throws NoSuchAlgorithmException,
+	private SecretKey generateSecretKey() throws NoSuchAlgorithmException,
 		InvalidKeySpecException
 	{
-		final PBEKeySpec spec = new PBEKeySpec(getKey().toCharArray());
-		return SecretKeyFactory.getInstance(CRYPT_METHOD).generateSecret(spec);
+		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(cryptMethod);
+		KeySpec spec = createKeySpec();
+		return keyFactory.generateSecret(spec);
+	}
+
+	/**
+	 * @return the parameter spec to be used for the configured crypt method
+	 */
+	protected AlgorithmParameterSpec createParameterSpec()
+	{
+		return new PBEParameterSpec(salt, COUNT);
+	}
+
+	/**
+	 * @return the key spec to be used for the configured crypt method
+	 */
+	protected KeySpec createKeySpec()
+	{
+		return new PBEKeySpec(getKey().toCharArray());
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/776c42dc/wicket-util/src/main/java/org/apache/wicket/util/crypt/TrivialCrypt.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/crypt/TrivialCrypt.java b/wicket-util/src/main/java/org/apache/wicket/util/crypt/TrivialCrypt.java
index 300fb7c..5aab8e7 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/TrivialCrypt.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/TrivialCrypt.java
@@ -25,17 +25,6 @@ import java.security.GeneralSecurityException;
  */
 public class TrivialCrypt extends AbstractCrypt
 {
-	/**
-	 * Constructor
-	 */
-	public TrivialCrypt()
-	{
-		super();
-	}
-
-	/**
-	 * @see org.apache.wicket.util.crypt.AbstractCrypt#crypt(byte[], int)
-	 */
 	@Override
 	protected byte[] crypt(final byte[] input, final int mode) throws GeneralSecurityException
 	{