Base64: java.lang.IllegalArgumentException: Illegal character

后端 未结 5 1905
醉梦人生
醉梦人生 2020-11-30 11:09

I\'m trying to send a confirmation email after user registration. I\'m using the JavaMail library for this purpose and the Java 8 Base64 util class.

I\'m encoding us

相关标签:
5条回答
  • 2020-11-30 11:21

    I encountered this error since my encoded image started with data:image/png;base64,iVBORw0....

    This answer led me to the solution:

    String partSeparator = ",";
    if (data.contains(partSeparator)) {
      String encodedImg = data.split(partSeparator)[1];
      byte[] decodedImg = Base64.getDecoder().decode(encodedImg.getBytes(StandardCharsets.UTF_8));
      Path destinationFile = Paths.get("/path/to/imageDir", "myImage.jpg");
      Files.write(destinationFile, decodedImg);
    }
    
    0 讨论(0)
  • 2020-11-30 11:27

    I got this error for my Linux Jenkins slave. I fixed it by changing from the node from "Known hosts file Verification Strategy" to "Non verifying Verification Strategy".

    0 讨论(0)
  • 2020-11-30 11:28

    The Base64.Encoder.encodeToString method automatically uses the ISO-8859-1 character set.

    For an encryption utility I am writing, I took the input string of cipher text and Base64 encoded it for transmission, then reversed the process. Relevant parts shown below. NOTE: My file.encoding property is set to ISO-8859-1 upon invocation of the JVM so that may also have a bearing.

    static String getBase64EncodedCipherText(String cipherText) {
        byte[] cText = cipherText.getBytes();
        // return an ISO-8859-1 encoded String
        return Base64.getEncoder().encodeToString(cText);
    }
    
    static String getBase64DecodedCipherText(String encodedCipherText) throws IOException {
        return new String((Base64.getDecoder().decode(encodedCipherText)));
    }
    
    public static void main(String[] args) {
        try {
            String cText = getRawCipherText(null, "Hello World of Encryption...");
    
            System.out.println("Text to encrypt/encode: Hello World of Encryption...");
            // This output is a simple sanity check to display that the text
            // has indeed been converted to a cipher text which 
            // is unreadable by all but the most intelligent of programmers.
            // It is absolutely inhuman of me to do such a thing, but I am a
            // rebel and cannot be trusted in any way.  Please look away.
            System.out.println("RAW CIPHER TEXT: " + cText);
            cText = getBase64EncodedCipherText(cText);
            System.out.println("BASE64 ENCODED: " + cText);
            // There he goes again!!
            System.out.println("BASE64 DECODED:  " + getBase64DecodedCipherText(cText));
            System.out.println("DECODED CIPHER TEXT: " + decodeRawCipherText(null, getBase64DecodedCipherText(cText)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    The output looks like:

    Text to encrypt/encode: Hello World of Encryption...
    RAW CIPHER TEXT: q$;�C�l��<8��U���X[7l
    BASE64 ENCODED: HnEPJDuhQ+qDbInUCzw4gx0VDqtVwef+WFs3bA==
    BASE64 DECODED:  q$;�C�l��<8��U���X[7l``
    DECODED CIPHER TEXT: Hello World of Encryption...
    
    0 讨论(0)
  • 2020-11-30 11:40

    Your encoded text is [B@6499375d. That is not Base64, something went wrong while encoding. That decoding code looks good.

    Use this code to convert the byte[] to a String before adding it to the URL:

    String encodedEmailString = new String(encodedEmail, "UTF-8");
    // ...
    String confirmLink = "Complete your registration by clicking on following"
        + "\n<a href='" + confirmationURL + encodedEmailString + "'>link</a>";
    
    0 讨论(0)
  • 2020-11-30 11:41

    Just use the below code to resolve this:

    JsonObject obj = Json.createReader(new ByteArrayInputStream(Base64.getDecoder().decode(accessToken.split("\\.")[1].
                            replace('-', '+').replace('_', '/')))).readObject();
    

    In the above code replace('-', '+').replace('_', '/') did the job. For more details see the https://jwt.io/js/jwt.js. I understood the problem from the part of the code got from that link:

    function url_base64_decode(str) {
      var output = str.replace(/-/g, '+').replace(/_/g, '/');
      switch (output.length % 4) {
        case 0:
          break;
        case 2:
          output += '==';
          break;
        case 3:
          output += '=';
          break;
        default:
          throw 'Illegal base64url string!';
      }
      var result = window.atob(output); //polifyll https://github.com/davidchambers/Base64.js
      try{
        return decodeURIComponent(escape(result));
      } catch (err) {
        return result;
      }
    }
    
    0 讨论(0)
提交回复
热议问题