Как зашифровать и расшифровать параметр URl в Java? - PullRequest
2 голосов
/ 07 марта 2011

Как зашифровать и дешифровать параметр URl в Java, не используя html-символы, такие как '/, &, =?'

import java.io.UnsupportedEncodingException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class DesEncrypter {

    Cipher ecipher;
    Cipher dcipher;

    byte[] salt =  {
            (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
            (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
        };

    int iterationCount = 3;

    public DesEncrypter(String passPhrase) {

        try{

            KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);

            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());

            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

        } catch (java.security.InvalidAlgorithmParameterException e){
        } catch (java.security.spec.InvalidKeySpecException e){
        } catch (javax.crypto.NoSuchPaddingException e){
        } catch (java.security.NoSuchAlgorithmException e){
        } catch (java.security.InvalidKeyException e){
        }
    }

    public String encrypt(String str){

        try{

            byte[] utf8 = str.getBytes("UTF8");
            byte[] enc  = ecipher.doFinal(utf8);

            return new sun.misc.BASE64Encoder().encode(enc);

        } catch (javax.crypto.BadPaddingException e){
        } catch (IllegalBlockSizeException e){
        } catch (UnsupportedEncodingException e){
        }

        return null;
    }

    public String decrypt(String str){

        try{

            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
            byte[] utf8 = dcipher.doFinal(dec);

            return new String(utf8,"UTF8");

        } catch (javax.crypto.BadPaddingException e){
        } catch (IllegalBlockSizeException e){
        } catch (UnsupportedEncodingException e){
        } catch (java.io.IOException e){
        }

        return null;
    }

}

Мой код такой же, как и выше, и я получаю зашифрованный результат: 6puu4YjzScxHsv9tI / N92g==
В приведенном выше выводе из-за обратной косой черты я получаю ошибку, которую хочу избежать.

1 Ответ

11 голосов
/ 07 марта 2011

Вместо

        byte[] utf8 = str.getBytes("UTF8");
        byte[] enc  = ecipher.doFinal(utf8);
        return new sun.misc.BASE64Encoder().encode(enc);

Используйте 64-битный кодировщик Apache Commons URL Safe для кодирования после шифрования.

Base64.encodeBase64URLSafeString(enc);

Для декодирования перед расшифровкой:

Base64.decodeBase64(dec)

Обратите внимание, что это ENCODER , а не шифратор.Но строка безопасна для URL.


В идеале, вы всегда должны кодировать свой URL, используя URL Encoder , который обеспечит кодирование специальных символов.Так что, даже если у вас есть URL с ограниченным количеством символов, это будет безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...