it-swarm.com.de

neue Zeile hängt an meiner verschlüsselten Zeichenfolge an

In Main:

public static void main(String[] args) throws NoSuchAlgorithmException {
    System.out.println("encrypt:" + encryptPassword("superuser")+":" );
}

public static String encryptPassword(final String password) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] hashPassword = md.digest(password.getBytes());
    String encryPass = Base64.encodeBase64String(hashPassword);
    return encryPass;
}

Ich bekomme diese Ausgabe:

encrypt:C66i8K4gFQ23j1jN2sRCqQ==:

Wenn ich dasselbe in meine Anwendung implementiert habe, bekomme ich die folgende Ausgabe:

encrypt:C66i8K4gFQ23j1jN2sRCqQ==
:

Hinweis: Neue Zeile hängt an meiner verschlüsselten Zeichenfolge an.

anwendungscode:

public boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials) {
    try {
        System.out.println("encrypt:" + getHash("superuser")+":" );
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
        throw new BadCredentialsAuthenticationException(ErrorConstants.CONNECTION_FAILED);
    }
}

private String getHash(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{  
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] hashPassword = md.digest(password.getBytes());
    String encryPass = Base64.encodeBase64String(hashPassword);
    return encryPass;
}

Wie kann ich die extra neue Zeile entfernen? Warum ist dies passiert? Bitte helfen Sie mir was ist der Grund?  

42

Ich antworte vielleicht zu spät, kam aber mit demselben Problem rüber. Eigentlich liegt das Problem hier Base64.encodeBase64String(hashPassword)

Ändern Sie die Zeile so, dass sie funktionieren sollte: Base64.encodeBase64String(hashPassword,Base64.NO_WRAP)

Standardmäßig fügt das Android Base64-Hilfsprogramm am Ende der codierten Zeichenfolge ein Newline-Zeichen hinzu. Das Flag Base64.NO_WRAP weist das Hilfsprogramm an, die codierte Zeichenfolge ohne das Newline-Zeichen zu erstellen.

Überprüfen Sie hier

142
Dory

Eine sauberere Option ohne Beschneiden:

String encryPass = BaseEncoding.base64().encode(hashPassword);
2
tashuhka

Benutzen:

String encryPass = Base64.encodeBase64String(hashPassword).trim();
2
user2978869

Falls jemand dies für Bibliotheken benötigt, die OkHttp verwenden, gibt es eine Credentials-Klasse, die Sie für die Base64-Kodierung Ihres Benutzernamens/Passes verwenden können

String credentials = Credentials.basic("username", "password");

request.header(HttpHeaders.AUTHORIZATION, credentials);
0
sea cat

Das hängt von der Implementierung von Base64.encodeBase64String() ab. Was ist das für eine Methode?

Wenn es von Apache Commons stammt, sollten Sie wissen, dass es verschiedene Klassen gibt, die mit Whitespace unterschiedlich umgehen. 

Zum Beispiel wird org.Apache.commons.net.util.Base64 chunks ausgegeben, und es fügt dem letzten Block wahrscheinlich eine CR-LF-Sequenz hinzu.

Die allgemeinere Version org.Apache.commons.codec.binary.Base64 fügt keine Leerzeichen hinzu.

0
erickson