为什么在 Blowfish 加密中去掉正斜杠?

Why do forward slashes get stripped on Blowfish encryption?

考虑以下执行 Blowfish 加密的方法:

import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;

private static String encryptString(String value, String key)
{
    String encryptedString = "";
    if (value != null)
    {
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "Blowfish");
        try
        {
            Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS#5");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            byte[] encrypted = cipher.doFinal(value.getBytes());
            encryptedString = new String(Hex.encodeHex(encrypted));
        }
        catch (Exception e)
        {
            // Show error
        }
    }
    return encryptedString;
}

我要编码的字符串包含正斜杠。当我尝试编码例如“http://www.google.com/Foo”时,出于某种原因,当我解码它时,正斜杠被剥离,例如"http:www.google.comFoo".

这可能是什么原因造成的?如何预防?

这是您用来检查加密文本的网站 (https://webnet77.net/cgi-bin/helpers/blowfish.pl) 的错误。

尝试加密该站点上的文本 (http://www.google.com/Foo),您会发现它去除了斜杠。 Java 没有。


其他问题:

  • key参数的值是多少?

    如果它是 Blowfish 密钥的十六进制编码,那么 getBytes() 是完全错误的,因为您需要对其进行十六进制解码,而不是您当前正在进行的代码页转换。

    SecretKeySpec 需要一个 byte[] 因为键是二进制值,不能存储纯文本。

  • Blowfish/ECB/PKCS#5 不是 JDK 中的有效密码。

    Blowfish/ECB/PKCS5PADDING是.

  • 如果您的 value 参数可以包含纯 ASCII 以外的任何内容,那么 value.getBytes() 是不合适的。在将字符串转换为字节时,您应该始终指定代码页。

    您可以指定 "US-ASCII" 以仅强制执行 ASCII,或指定服务器所需的代码页,但通常 "UTF-8" 是一个不错的选择。