1

当我的 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;
    }
4

0 回答 0