java - 如何在java中加密和解密URl参数?

标签 java spring encryption spring-security

如何在java中加密和解密URl参数,而不需要像'/,&,=?'这样的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==
在上面的输出中,由于反斜杠,我收到了我想避免的错误。

最佳答案

而不是

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

使用Apache Commons URL Safe 64 bit encoder加密后进行编码。

Base64.encodeBase64URLSafeString(enc);

解密前解码:

Base64.decodeBase64(dec)

请注意,这是编码器而不是加密器。但该字符串是 URL 安全的。

<小时/>

理想情况下,您应该始终使用 URL Encoder 对您的 URL 进行编码这将确保特殊字符被编码。因此,即使您的 URL 包含受限制的字符,它也是安全的。

关于java - 如何在java中加密和解密URl参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217598/

相关文章:

java - 为什么 android HttpURLConnection 不发回 FIN?

java - 根据相似元素的出现次数对数组列表进行排序

java - 并行多个步骤的Spring批处理分区?

java - 对于长度超过 30 个字符的字符串,正则表达式模式匹配需要很长时间

php加密的ssl session 数据

c++ - UTF-8 字符串的简单加密,结果是 NULL 终止字符串?

java - WebServlet 注释正在使用,但 GAE 正在尝试查找 web.xml

java - 页面请求未应用于结果

spring - java.lang.UnsupportedOperationException : The user must supply a JDBC connection

PHP 和 HTML : Encrypt form