如何在Java中加密和解密URl参数? [英] How to encrypt and decrypt URl parameter in java?

查看:78
本文介绍了如何在Java中加密和解密URl参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在不使用'/,&,=='之类的html字符的情况下用Java加密和解密URl参数

How to encrypt and decrypt URl parameter in java without having the html characters like '/,&,=?'

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 ==
在上面的输出中,由于反斜杠,我得到了我想避免的错误.

My Code is as above and i am getting encrypted result:6puu4YjzScxHsv9tI/N92g==
In the above output due to backslash i am getting the error that i want to avoid.

推荐答案

代替

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

使用 Apache Commons URL Safe 64位编码器,用于在加密后进行编码.

Use Apache Commons URL Safe 64 bit encoder to encode after encryption.

Base64.encodeBase64URLSafeString(enc);

要在解密之前解码:

Base64.decodeBase64(dec)

请注意,这不是 ENCODER 加密器.但是字符串是URL安全的.

Please Note this is ENCODER not encryptor. But the String is URL safe.

理想情况下,您应该始终使用

Ideally, you should always Encode your URL using URL Encoder which will ensure that special characters are encoded. So, even if you are having a URL with restricted characters, it will be safe.

这篇关于如何在Java中加密和解密URl参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆