为什么在 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"
是一个不错的选择。
考虑以下执行 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"
是一个不错的选择。