You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Martin Grigorov <mg...@apache.org> on 2014/11/19 21:42:55 UTC

Re: wicket git commit: WICKET-5768 Improve class hierarchy of package org.apache.wicket.util.crypt

On Wed, Nov 19, 2014 at 10:08 PM, <ad...@apache.org> wrote:

> Repository: wicket
> Updated Branches:
>   refs/heads/WICKET-5768-improve-crypt [created] 1ffc984ca
>
>
> WICKET-5768 Improve class hierarchy of package
> org.apache.wicket.util.crypt
>
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/1ffc984c
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/1ffc984c
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/1ffc984c
>
> Branch: refs/heads/WICKET-5768-improve-crypt
> Commit: 1ffc984ca1a8c897a91afc05a83f0793dadb14d4
> Parents: 1cb35a0
> Author: Andrea Del Bene <ad...@apache.org>
> Authored: Tue Nov 18 22:23:09 2014 +0100
> Committer: Andrea Del Bene <ad...@apache.org>
> Committed: Wed Nov 19 21:05:40 2014 +0100
>
> ----------------------------------------------------------------------
>  .../AbstractKeyInSessionJceCryptFactory.java    |  88 ++++++++++++
>  .../crypt/KeyInSessionSunJceCryptFactory.java   |  44 ++----
>  .../markup/html/form/encryption/CryptTest.java  |   3 +-
>  .../CryptedUrlWebRequestCodingStrategyTest.java |   8 +-
>  .../apache/wicket/util/crypt/AbstractCrypt.java | 136 +++++++++----------
>  .../util/crypt/CachingSunJceCryptFactory.java   |   2 +-
>  .../wicket/util/crypt/ClassCryptFactory.java    |  46 +++++--
>  .../org/apache/wicket/util/crypt/ICrypt.java    |   9 --
>  .../org/apache/wicket/util/crypt/NoCrypt.java   |  16 +--
>  .../apache/wicket/util/crypt/SunJceCrypt.java   |  35 ++++-
>  .../apache/wicket/util/crypt/TrivialCrypt.java  |  38 ------
>  ...UnlimitedStrengthJurisdictionPolicyTest.java |   4 +-
>  12 files changed, 238 insertions(+), 191 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/AbstractKeyInSessionJceCryptFactory.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/AbstractKeyInSessionJceCryptFactory.java
> b/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/AbstractKeyInSessionJceCryptFactory.java
> new file mode 100644
> index 0000000..77ffa27
> --- /dev/null
> +++
> b/wicket-core/src/main/java/org/apache/wicket/core/util/crypt/AbstractKeyInSessionJceCryptFactory.java
> @@ -0,0 +1,88 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.core.util.crypt;
> +
> +
> +import java.io.Serializable;
> +
> +import org.apache.wicket.MetaDataKey;
> +import org.apache.wicket.Session;
> +import org.apache.wicket.util.crypt.ICrypt;
> +
> +/**
> + * Base class to implement crypt factories that store crypt into user
> session.
> + * Note that the use of this crypt factory will result in an immediate
> creation of a http session.
> + *
> + * @author andrea del bene
> + *
> + * @param <T>
> + *                             the type for the secret key.
> + */
> +public abstract class AbstractKeyInSessionJceCryptFactory<T extends
> Serializable>
>

Remove Jce from the name. One can use bcrypt or any other provider.


> +{
> +       /** metadata-key used to store crypto-key in session metadata */
>


> +       static final MetaDataKey<Serializable> KEY = new
> MetaDataKey<Serializable>()
>

private ?
Isn't it possible to use <T> instead ?



> +       {
> +               private static final long serialVersionUID = 1L;
> +       };
> +
> +       public AbstractKeyInSessionJceCryptFactory()
> +       {
> +               super();
> +       }
> +
> +       /**
> +        * Creates a new crypt for the current user session. If no user
> session is
> +        * available, a new one is created.
> +        *
> +        * @return
> +        */
> +       @SuppressWarnings("unchecked")
> +       public ICrypt newCrypt()
> +       {
> +               Session session = Session.get();
> +               session.bind();
> +
> +               // retrieve or generate encryption key from session
> +               Serializable key = session.getMetaData(KEY);
> +               if (key == null)
> +               {
> +                       // generate new key
> +                       key = generateKey(session);
> +                       session.setMetaData(KEY, key);
> +               }
> +
> +               // build the crypt based on session key
> +               ICrypt crypt = createCrypt((T)key);
> +               return crypt;
> +       }
> +
> +       /**
> +        * Generates the secret key for a new crypt.
> +        *
> +        * @param session
> +        *                              the current user session where
> crypt will be stored
> +        * @return
> +        *                              the secret key for a new crypt
> +        */
> +       protected abstract T generateKey(Session session);
> +
> +       /**
> +        * @return the {@link org.apache.wicket.util.crypt.ICrypt} to use
> +        */
> +       protected abstract ICrypt createCrypt(T key);
> +}
> \ No newline at end of file
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/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 5b3bae6..9158edd 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
> @@ -18,7 +18,6 @@ package org.apache.wicket.core.util.crypt;
>
>  import java.util.UUID;
>
> -import org.apache.wicket.MetaDataKey;
>  import org.apache.wicket.Session;
>  import org.apache.wicket.util.crypt.ICrypt;
>  import org.apache.wicket.util.crypt.ICryptFactory;
> @@ -34,15 +33,9 @@ import org.apache.wicket.util.lang.Args;
>   *
>   * @author igor.vaynberg
>   */
> -public class KeyInSessionSunJceCryptFactory implements ICryptFactory
> -{
> -       /** metadata-key used to store crypto-key in session metadata */
> -       private static final MetaDataKey<String> KEY = new
> MetaDataKey<String>()
> -       {
> -               private static final long serialVersionUID = 1L;
> -       };
> -
> -       private final String cryptMethod;
> +public class KeyInSessionSunJceCryptFactory extends
> AbstractKeyInSessionJceCryptFactory<String> implements ICryptFactory
> +{
> +       final String cryptMethod;
>
>         /**
>          * Constructor using {@link javax.crypto.Cipher} {@value
> org.apache.wicket.util.crypt.SunJceCrypt#DEFAULT_CRYPT_METHOD}
> @@ -62,33 +55,16 @@ public class KeyInSessionSunJceCryptFactory implements
> ICryptFactory
>         {
>                 this.cryptMethod = Args.notNull(cryptMethod, "Crypt
> method");
>         }
> -
> +
>         @Override
> -       public ICrypt newCrypt()
> +       protected String generateKey(Session session)
>         {
> -               Session session = Session.get();
> -               session.bind();
> -
> -               // retrieve or generate encryption key from session
> -               String key = session.getMetaData(KEY);
> -               if (key == null)
> -               {
> -                       // generate new key
> -                       key = session.getId() + "." +
> UUID.randomUUID().toString();
> -                       session.setMetaData(KEY, key);
> -               }
> -
> -               // build the crypt based on session key
> -               ICrypt crypt = createCrypt();
> -               crypt.setKey(key);
> -               return crypt;
> +               return session.getId() + "." +
> UUID.randomUUID().toString();
>         }
> -
> -       /**
> -        * @return the {@link org.apache.wicket.util.crypt.ICrypt} to use
> -        */
> -       protected ICrypt createCrypt()
> +
> +       @Override
> +       protected ICrypt createCrypt(String key)
>         {
> -               return new SunJceCrypt(cryptMethod);
> +               return new SunJceCrypt(cryptMethod, key);
>         }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-core/src/test/java/org/apache/wicket/markup/html/form/encryption/CryptTest.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/encryption/CryptTest.java
> b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/encryption/CryptTest.java
> index 72024c6..052f6ef 100644
> ---
> a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/encryption/CryptTest.java
> +++
> b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/encryption/CryptTest.java
> @@ -31,8 +31,7 @@ public class CryptTest extends WicketTestCase
>         @Test
>         public void crypt()
>         {
> -               final ICrypt crypt = new SunJceCrypt();
> -               crypt.setKey("someStableKey");
> +               final ICrypt crypt = new
> SunJceCrypt(SunJceCrypt.DEFAULT_CRYPT_METHOD, "someStableKey");
>
>                 try
>                 {
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategyTest.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategyTest.java
> b/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategyTest.java
> index eab676d..2ff14be 100644
> ---
> a/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategyTest.java
> +++
> b/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategyTest.java
> @@ -17,12 +17,12 @@
>  package org.apache.wicket.protocol.http.request;
>
>  import org.apache.wicket.WicketTestCase;
> +import org.apache.wicket.core.request.mapper.CryptoMapper;
>  import org.apache.wicket.markup.html.WebPage;
>  import org.apache.wicket.markup.html.basic.SimplePage;
>  import org.apache.wicket.mock.MockApplication;
>  import org.apache.wicket.protocol.http.WebApplication;
>  import org.apache.wicket.request.mapper.CompoundRequestMapper;
> -import org.apache.wicket.core.request.mapper.CryptoMapper;
>  import org.apache.wicket.util.crypt.Base64;
>  import org.apache.wicket.util.crypt.ICrypt;
>  import org.apache.wicket.util.crypt.ICryptFactory;
> @@ -118,12 +118,6 @@ public class CryptedUrlWebRequestCodingStrategyTest
> extends WicketTestCase
>                                 {
>                                         return new String(new
> Base64(true).encode(plainText.getBytes()));
>                                 }
> -
> -                               @Override
> -                               public void setKey(String key)
> -                               {
> -                               }
> -
>                         };
>                 }
>         }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/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 9daa2dd..5f68192 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
> @@ -16,12 +16,13 @@
>   */
>  package org.apache.wicket.util.crypt;
>
> +import java.io.Serializable;
>  import java.io.UnsupportedEncodingException;
>  import java.security.GeneralSecurityException;
> -import java.util.UUID;
>
>  import javax.crypto.Cipher;
>
> +import org.apache.wicket.util.lang.Args;
>  import org.slf4j.Logger;
>  import org.slf4j.LoggerFactory;
>
> @@ -31,7 +32,7 @@ import org.slf4j.LoggerFactory;
>   *
>   * @author Juergen Donnerstag
>   */
> -public abstract class AbstractCrypt implements ICrypt
> +public abstract class AbstractCrypt<T extends Serializable> implements
> ICrypt
>  {
>         /** Encoding used to convert java String from and to byte[] */
>         private static final String CHARACTER_ENCODING = "UTF-8";
> @@ -40,90 +41,30 @@ public abstract class AbstractCrypt implements ICrypt
>         private static final Logger log =
> LoggerFactory.getLogger(AbstractCrypt.class);
>
>         /** Key used to de-/encrypt the data */
> -       private String encryptionKey;
> -
> +       private final T encryptionKey;
> +
>         /**
>          * Constructor
> -        */
> -       public AbstractCrypt()
> -       {
> -               this.encryptionKey = UUID.randomUUID().toString();
> -       }
> -
> -       /**
> -        * Decrypts a string into a string.
>          *
> -        * @param text
> -        *            text to decrypt
> -        * @return the decrypted text
> +        * @param encryptionKey
> +        *                              the encryption key to use
>          */
> -       @Override
> -       public final String decryptUrlSafe(final String text)
> +       public AbstractCrypt(final T encryptionKey)
>         {
> -               try
> -               {
> -                       byte[] decoded = new Base64(true).decode(text);
> -                       return new String(decryptByteArray(decoded),
> CHARACTER_ENCODING);
> -               }
> -               catch (Exception ex)
> -               {
> -                       log.debug("Error decoding text: " + text, ex);
> -                       return null;
> -               }
> +               this.encryptionKey = Args.notNull(encryptionKey,
> "encryptionKey");
>         }
> -
> -       /**
> -        * Encrypt a string into a string using URL safe Base64 encoding.
> -        *
> -        * @param plainText
> -        *            text to encrypt
> -        * @return encrypted string
> -        */
> -       @Override
> -       public final String encryptUrlSafe(final String plainText)
> -       {
> -               try
> -               {
> -                       byte[] encrypted =
> encryptStringToByteArray(plainText);
> -                       Base64 base64 = new Base64(-1, null, true);
> -                       byte[] encoded = base64.encode(encrypted);
> -                       return new String(encoded, CHARACTER_ENCODING);
> -               }
> -               catch (GeneralSecurityException e)
> -               {
> -                       log.error("Unable to encrypt text '" + plainText +
> "'", e);
> -                       return null;
> -               }
> -               catch (UnsupportedEncodingException e)
> -               {
> -                       log.error("Unable to encrypt text '" + plainText +
> "'", e);
> -                       return null;
> -               }
> -       }
> -
> +
>         /**
>          * Get encryption private key
>          *
>          * @return encryption private key
>          */
> -       public String getKey()
> +       public T getKey()
>         {
>                 return encryptionKey;
>         }
>
>         /**
> -        * Set encryption private key
> -        *
> -        * @param key
> -        *            private key to make de-/encryption unique
> -        */
> -       @Override
> -       public void setKey(final String key)
> -       {
> -               encryptionKey = key;
> -       }
> -
> -       /**
>          * Crypts the given byte array
>          *
>          * @param input
> @@ -143,7 +84,7 @@ public abstract class AbstractCrypt implements ICrypt
>          *            byte array to decrypt
>          * @return the decrypted text
>          */
> -       private byte[] decryptByteArray(final byte[] encrypted)
> +       protected final byte[] decryptByteArray(final byte[] encrypted)
>         {
>                 try
>                 {
> @@ -164,7 +105,7 @@ public abstract class AbstractCrypt implements ICrypt
>          * @return the string encrypted
>          * @throws GeneralSecurityException
>          */
> -       private byte[] encryptStringToByteArray(final String plainText)
> +       protected final byte[] encryptStringToByteArray(final String
> plainText)
>                 throws GeneralSecurityException
>         {
>                 try
> @@ -176,4 +117,55 @@ public abstract class AbstractCrypt implements ICrypt
>                         throw new RuntimeException(ex.getMessage());
>                 }
>         }
> +
> +       /**
> +        * Decrypts a string into a string.
> +        *
> +        * @param text
> +        *            text to decrypt
> +        * @return the decrypted text
> +        */
> +       @Override
> +       public String decryptUrlSafe(final String text)
> +       {
> +               try
> +               {
> +                       byte[] decoded = new Base64(true).decode(text);
> +                       return new String(decryptByteArray(decoded),
> CHARACTER_ENCODING);
> +               }
> +               catch (Exception ex)
> +               {
> +                       log.debug("Error decoding text: " + text, ex);
> +                       return null;
> +               }
> +       }
> +
> +       /**
> +        * Encrypt a string into a string using URL safe Base64 encoding.
> +        *
> +        * @param plainText
> +        *            text to encrypt
> +        * @return encrypted string
> +        */
> +       @Override
> +       public String encryptUrlSafe(final String plainText)
> +       {
> +               try
> +               {
> +                       byte[] encrypted =
> encryptStringToByteArray(plainText);
> +                       Base64 base64 = new Base64(-1, null, true);
> +                       byte[] encoded = base64.encode(encrypted);
> +                       return new String(encoded, CHARACTER_ENCODING);
> +               }
> +               catch (GeneralSecurityException e)
> +               {
> +                       log.error("Unable to encrypt text '" + plainText +
> "'", e);
> +                       return null;
> +               }
> +               catch (UnsupportedEncodingException e)
> +               {
> +                       log.error("Unable to encrypt text '" + plainText +
> "'", e);
> +                       return null;
> +               }
> +       }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-util/src/main/java/org/apache/wicket/util/crypt/CachingSunJceCryptFactory.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-util/src/main/java/org/apache/wicket/util/crypt/CachingSunJceCryptFactory.java
> b/wicket-util/src/main/java/org/apache/wicket/util/crypt/CachingSunJceCryptFactory.java
> index 65db9e4..b521403 100644
> ---
> a/wicket-util/src/main/java/org/apache/wicket/util/crypt/CachingSunJceCryptFactory.java
> +++
> b/wicket-util/src/main/java/org/apache/wicket/util/crypt/CachingSunJceCryptFactory.java
> @@ -32,6 +32,6 @@ public class CachingSunJceCryptFactory extends
> CryptFactoryCachingDecorator
>          */
>         public CachingSunJceCryptFactory(final String encryptionKey)
>         {
> -               super(new ClassCryptFactory(SunJceCrypt.class,
> encryptionKey));
> +               super(new ClassCryptFactory(SunJceCrypt.class,
> SunJceCrypt.DEFAULT_CRYPT_METHOD, encryptionKey));
>         }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/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 b2e260c..d1aaca8 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
> @@ -17,6 +17,7 @@
>  package org.apache.wicket.util.crypt;
>
>  import java.lang.ref.WeakReference;
> +import java.lang.reflect.Constructor;
>
>  import org.apache.wicket.util.lang.Args;
>  import org.slf4j.Logger;
> @@ -33,38 +34,40 @@ public class ClassCryptFactory implements ICryptFactory
>  {
>         private static final Logger log =
> LoggerFactory.getLogger(ClassCryptFactory.class);
>
> -       private final WeakReference<Class<?>> cryptClass;
> -       private final String encryptionKey;
> +       private final WeakReference<Class<? extends ICrypt>> cryptClass;
> +       private final Object[] constructorArgs;
>
>         /**
>          * Construct.
>          *
>          * @param cryptClass
>          *            class that will be instantiated to represent the
> ICrypt object
> -        * @param encryptionKey
> -        *            encryption key
> +        * @param constructorArgs
> +        *            the arguments to instantiate the crypt class.
>          */
> -       public ClassCryptFactory(final Class<?> cryptClass, final String
> encryptionKey)
> +       public ClassCryptFactory(final Class<? extends ICrypt> cryptClass,
> final Object... constructorArgs)
>         {
>                 Args.notNull(cryptClass, "cryptClass");
> +               Args.notNull(constructorArgs, "constructorArgs");
>
>                 if (!ICrypt.class.isAssignableFrom(cryptClass))
>                 {
>                         throw new IllegalArgumentException("cryptClass
> must implement ICrypt interface");
>                 }
>
> -               this.cryptClass = new WeakReference<Class<?>>(cryptClass);
> -               this.encryptionKey = encryptionKey;
> +               this.cryptClass = new WeakReference<Class<?extends
> ICrypt>>(cryptClass);
> +               this.constructorArgs = constructorArgs;
>         }
> -
> +
>         @Override
>         public ICrypt newCrypt()
>         {
>                 try
>                 {
> -                       ICrypt crypt =
> (ICrypt)(cryptClass.get()).newInstance();
> -                       log.info("using encryption/decryption object {}",
> crypt);
> -                       crypt.setKey(encryptionKey);
> +                       Constructor<? extends ICrypt> constructor =
> +                               findConstructor(cryptClass.get(),
> constructorArgs);
> +                       ICrypt crypt =
> constructor.newInstance(constructorArgs);
> +                       log.info("using encryption/decryption object {}",
> crypt);
>                         return crypt;
>                 }
>                 catch (Exception e)
> @@ -93,4 +96,25 @@ public class ClassCryptFactory implements ICryptFactory
>                         return new NoCrypt();
>                 }
>         }
> +
> +       private Constructor<? extends ICrypt> findConstructor(final
> Class<? extends ICrypt> clazz, final Object... constructorArgs)
> +               throws NoSuchMethodException, SecurityException
> +       {
> +               Class<?>[] argsType =
> getArrayElementsType(constructorArgs);
> +
> +               return clazz.getConstructor(argsType);
> +       }
> +
> +       private Class<?>[] getArrayElementsType(Object[] array)
> +       {
> +               Class<?>[] elementsClass = new Class[array.length];
> +
> +               for (int i = 0; i< array.length; i++)
> +               {
> +                       Object element = array[i];
> +                       elementsClass[i] = element.getClass();
> +               }
> +
> +               return elementsClass;
> +       }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-util/src/main/java/org/apache/wicket/util/crypt/ICrypt.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-util/src/main/java/org/apache/wicket/util/crypt/ICrypt.java
> b/wicket-util/src/main/java/org/apache/wicket/util/crypt/ICrypt.java
> index 7f28ad3..079d257 100644
> --- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/ICrypt.java
> +++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/ICrypt.java
> @@ -54,13 +54,4 @@ public interface ICrypt
>          * @since 1.2
>          */
>         String encryptUrlSafe(final String plainText);
> -
> -       /**
> -        * Sets private encryption key. It depends on the implementation
> if a default key is applied or
> -        * an exception is thrown, if no private key has been provided.
> -        *
> -        * @param key
> -        *            private key
> -        */
> -       void setKey(final String key);
>  }
> \ No newline at end of file
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCrypt.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCrypt.java
> b/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCrypt.java
> index be16986..7c14aa0 100644
> --- a/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCrypt.java
> +++ b/wicket-util/src/main/java/org/apache/wicket/util/crypt/NoCrypt.java
> @@ -16,6 +16,7 @@
>   */
>  package org.apache.wicket.util.crypt;
>
> +import java.security.GeneralSecurityException;
>
>  /**
>   * Due to legal reasons in some countries the JRE is shipped without a
> security provider. As a
> @@ -25,13 +26,11 @@ package org.apache.wicket.util.crypt;
>   *
>   * @author Juergen Donnerstag
>   */
> -public class NoCrypt implements ICrypt
> +public class NoCrypt extends AbstractCrypt<String>
>  {
> -       /**
> -        * Constructor
> -        */
>         public NoCrypt()
>         {
> +               super("");
>         }
>
>         /**
> @@ -60,14 +59,9 @@ public class NoCrypt implements ICrypt
>                 return plainText;
>         }
>
> -       /**
> -        * Set encryption private key
> -        *
> -        * @param key
> -        *            private key to make de-/encryption unique
> -        */
>         @Override
> -       public void setKey(final String key)
> +       protected byte[] crypt(byte[] input, int mode) throws
> GeneralSecurityException
>         {
> +               return input;
>         }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/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 934f586..941ffe9 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
> @@ -23,6 +23,7 @@ import java.security.Security;
>  import java.security.spec.AlgorithmParameterSpec;
>  import java.security.spec.InvalidKeySpecException;
>  import java.security.spec.KeySpec;
> +import java.util.UUID;
>
>  import javax.crypto.Cipher;
>  import javax.crypto.SecretKey;
> @@ -41,7 +42,7 @@ import org.apache.wicket.util.lang.Args;
>   *
>   * @author Juergen Donnerstag
>   */
> -public class SunJceCrypt extends AbstractCrypt
> +public class SunJceCrypt extends AbstractCrypt<String>
>  {
>         /**
>          * Iteration count used in combination with the salt to create the
> encryption key.
> @@ -76,8 +77,25 @@ public class SunJceCrypt extends AbstractCrypt
>          */
>         public SunJceCrypt(String cryptMethod)
>         {
> -               this.cryptMethod = Args.notNull(cryptMethod, "Crypt
> method");
> +               this(cryptMethod, generateRandomKey());
> +       }
>
> +       public SunJceCrypt(String cryptMethod, String key)
> +       {
> +               super(key);
> +               this.cryptMethod = Args.notNull(cryptMethod, "Crypt
> method");
> +
> +               checkChiperIsSupported(cryptMethod);
>

s/Chiper/Cipher/


> +       }
> +
> +       /**
> +        * Check if the current cipher is supported by the underlying JVM.
> +        *
> +        * @param cryptMethod
> +        *                              the name of encryption method (the
> cipher)
> +        */
> +       private void checkChiperIsSupported(String cryptMethod)
>

s/Chiper/Cipher/

+       {
>                 if (Security.getProviders("Cipher." + cryptMethod).length
> > 0)
>                 {
>                         return; // we are good to go!
> @@ -94,7 +112,7 @@ public class SunJceCrypt extends AbstractCrypt
>                         throw new RuntimeException("Unable to load SunJCE
> service provider", ex);
>                 }
>         }
> -
> +
>         /**
>          * Crypts the given byte array
>          *
> @@ -105,7 +123,6 @@ public class SunJceCrypt extends AbstractCrypt
>          * @return the input crypted. Null in case of an error
>          * @throws GeneralSecurityException
>          */
> -       @Override
>         protected byte[] crypt(final byte[] input, final int mode)
>                 throws GeneralSecurityException
>         {
> @@ -169,4 +186,14 @@ public class SunJceCrypt extends AbstractCrypt
>         {
>                 return new PBEKeySpec(getKey().toCharArray());
>         }
> +
> +       /**
> +        * Generate a random string key using {@code
> java.util.UUID.generateRandomKey()}.
> +        *
> +        * @return the random string key
> +        */
> +       protected static String generateRandomKey()
>

"protected static" causes problems with Scala
please use either "private static" or "public static"


> +       {
> +               return UUID.randomUUID().toString();
> +       }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/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
> deleted file mode 100644
> index 5aab8e7..0000000
> ---
> a/wicket-util/src/main/java/org/apache/wicket/util/crypt/TrivialCrypt.java
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License.  You may obtain a copy of the License at
> - *
> - *      http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -package org.apache.wicket.util.crypt;
> -
> -import java.security.GeneralSecurityException;
> -
> -/**
> - * THIS CLASS IS FOR TESTING PURPOSES ONLY. DO NOT USE IT IN PRODUCTION
> CODE!
> - *
> - * @author Jonathan Locke
> - */
> -public class TrivialCrypt extends AbstractCrypt
> -{
> -       @Override
> -       protected byte[] crypt(final byte[] input, final int mode) throws
> GeneralSecurityException
> -       {
> -               final byte[] result = new byte[input.length];
> -               for (int i = 0; i < input.length; i++)
> -               {
> -                       result[i] = (byte)(input[i] ^ 0xff);
> -               }
> -               return result;
> -       }
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/1ffc984c/wicket-util/src/test/java/org/apache/wicket/util/crypt/UnlimitedStrengthJurisdictionPolicyTest.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-util/src/test/java/org/apache/wicket/util/crypt/UnlimitedStrengthJurisdictionPolicyTest.java
> b/wicket-util/src/test/java/org/apache/wicket/util/crypt/UnlimitedStrengthJurisdictionPolicyTest.java
> index 19515e0..6e11b44 100644
> ---
> a/wicket-util/src/test/java/org/apache/wicket/util/crypt/UnlimitedStrengthJurisdictionPolicyTest.java
> +++
> b/wicket-util/src/test/java/org/apache/wicket/util/crypt/UnlimitedStrengthJurisdictionPolicyTest.java
> @@ -46,7 +46,7 @@ public class UnlimitedStrengthJurisdictionPolicyTest
> extends Assert
>                 boolean unlimitedStrengthJurisdictionPolicyInstalled =
> SunJceCryptTest.isUnlimitedStrengthJurisdictionPolicyInstalled();
>
> Assume.assumeThat(unlimitedStrengthJurisdictionPolicyInstalled, is(true));
>
> -               AbstractCrypt crypt = new
> UnlimitedStrenghtJurisdictionPolicyCrypt();
> +               AbstractCrypt<String> crypt = new
> UnlimitedStrenghtJurisdictionPolicyCrypt();
>
>                 String input1 = "input1";
>                 byte[] encrypted = crypt.crypt(input1.getBytes(),
> Cipher.ENCRYPT_MODE);
> @@ -64,7 +64,7 @@ public class UnlimitedStrengthJurisdictionPolicyTest
> extends Assert
>         /**
>          * Based on http://stackoverflow.com/a/992413
>          */
> -       private static class UnlimitedStrenghtJurisdictionPolicyCrypt
> extends AbstractCrypt
> +       private static class UnlimitedStrenghtJurisdictionPolicyCrypt
> extends SunJceCrypt
>         {
>                 private final Cipher crypter;
>                 private final Cipher decrypter;
>
>