考虑以下执行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;
}
我要编码的String包含正斜杠。当我尝试编码例如" http://www.google.com/Foo"时,由于某种原因,当我对其进行解码时,正斜杠被剥离,例如, " HTTP:www.google.comFoo"
可能的原因是什么,以及如何防止这种情况?
答案 0 :(得分:1)
您用来检查加密文字的网站(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"
通常是一个不错的选择。