代码之家  ›  专栏  ›  技术社区  ›  Joe Everyone

Base 64解码+编码产生不同的结果

  •  1
  • Joe Everyone  · 技术社区  · 6 年前

    我得到了base64字符串(我无法控制我得到的字符串): PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIg==

    当我用Java解码它时,它会产生:

    <?xml version="1.0"?>
    <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
    

    当我对其进行base64编码时(同样在Java中),它会产生:

    PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCI=

    这些字符串不同,但它们应该相同。

    在搜索过程中,我无意中发现了以下网站: https://www.base64encode.org

    在这个站点上,如果单击“编码”按钮,我会得到与java base64编码相同的结果。

    然而,如果我没有点击“编码”按钮,而是点击“实时模式开启”按钮,我会得到我收到的原始base64编码字符串——这正是我想要的!

    你知道我如何在自己的代码中实现这些相同的结果吗?

    public String getEncodedSAMLMessage(String message) {
        byte[] byteMessage;
        try {
            byteMessage = message.getBytes("UTF-8");
            String base64Encoded = helpers.base64Encode(byteMessage);
            return URLEncoder.encode(base64Encoded, "UTF-8");
        } catch (UnsupportedEncodingException e1) {
        }
        return null;
    }
    
    public String getDecodedSAMLMessage(String message) {
        String urlDecoded = helpers.urlDecode(message);
        byte[] base64Decoded = helpers.base64Decode(urlDecoded);
        try {
            return new String(base64Decoded, "UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        return null;
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   danielshiplett    6 年前

    尝试使用Apache Commons编解码器。

    import org.apache.commons.codec.Charsets;
    import org.apache.commons.codec.binary.Base64;  
    
    public class Base64Encoder {
    
        private Base64 b64 = new Base64();
    
        public String encode(String message) {
            return b64.encodeAsString(message.getBytes());
        }
    
        public String decode(String message) {
            return new String(b64.decode(message), Charsets.UTF_8);
        }
    }