当我的 Base64 编码令牌包含“+”号(这是一个有效的 Base 64 字符)时,偶尔会出现“未经授权的错误”
我正在使用 Visualize-JS 在 MVC Boilerplate 中呈现 Jasper 报告。为了验证每个请求,我使用了预授权流程,我从我的应用程序发送 Base64 编码的令牌,并在 Jasper 服务器上对其进行解码。
一切正常,除了偶尔我收到“未经授权的错误”。当我检查时,我发现只有当我的 Base64 编码令牌包含“+”号(这是一个有效的 Base 64 字符)时它才会失败。我的 C# 代码是将 + 符号的 URL 编码为 %2B 而 Java 代码在解码相同的 URL 时将 %2B 转换为空格。(注意 - 我用 C# 编码并用 Java 解码,因为 Jasper 服务器只支持 JAR 文件)。
是否有其他人面临这个问题或之前遇到过并找到了解决方案?
现在,作为一种解决方法,我用 + 号替换空格,但是,我正在寻找更好的解决方案。
这是错误的令牌,用于编码的 C# 代码和用于解码的 Java 代码
代币 - f0NNFeJKfvBiWZP7I7vTGHb8yhiDEmkoE35p6ueQceBiMUJbPoaF927UsHn7w2AdCbKmfjjfZyKxm8iwrTo37kLZPE91EuT4WJrQ/KjQ+r0=
用于加密的 C# 代码 -
public string Encrypt(string plainText)
{
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
return HttpUtility.UrlEncode(Convert.ToBase64String(Encrypt(plainBytes, GetRijndaelManaged(_config.EncryptionKey))));
}
public RijndaelManaged GetRijndaelManaged(string secretKey)
{
byte[] keyBytes = new byte[16];
byte[] secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length));
return new RijndaelManaged
{
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7,
KeySize = 128,
BlockSize = 128,
Key = keyBytes,
IV = keyBytes
};
}
public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged)
{
return rijndaelManaged.CreateEncryptor().TransformFinalBlock(plainBytes, 0, plainBytes.Length);
}
Java Code - encryptedText 这里是上面提到的token
public String decrypt(String encryptedText){
encryptedText = decode(encryptedText);
byte[] cipheredBytes = Base64.getDecoder().decode(encryptedText);
byte[] keyBytes = getKeyBytes(secretKey);
return new String(decrypt(cipheredBytes, keyBytes, keyBytes), "UTF-8");
}
public static String decode(String url)
{
try {
String prevURL="";
String decodeURL=url;
while(!prevURL.equals(decodeURL))
{
prevURL=decodeURL;
decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );
}
return decodeURL.replace(" ", "+");
} catch (UnsupportedEncodingException e) {
return "Issue while decoding" +e.getMessage();
}
}
private byte[] getKeyBytes(String key) throws UnsupportedEncodingException{
byte[] keyBytes= new byte[16];
byte[] parameterKeyBytes= key.getBytes("UTF-8");
System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length));
return keyBytes;
}