En 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;
}
Je reçois cette sortie:
encrypt:C66i8K4gFQ23j1jN2sRCqQ==:
Mais quand j'ai implémenté la même chose dans mon application, je reçois le résultat ci-dessous:
encrypt:C66i8K4gFQ23j1jN2sRCqQ==
:
Note: nouvelle ligne s'ajoutant à ma chaîne cryptée.
code de l'application:
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;
}
Comment puis-je supprimer cette nouvelle ligne supplémentaire… .. pourquoi cela est arrivé, aidez-moi s'il vous plaît quelle est la raison?
Je suis peut-être en retard pour répondre à cette question, mais je rencontre le même problème. En fait, le problème réside ici Base64.encodeBase64String(hashPassword)
Modifiez cette ligne pour qu'elle ressemble à ceci: cela devrait fonctionner: Base64.encodeBase64String(hashPassword,Base64.NO_WRAP)
Par défaut, l'utilitaire Android Base64 ajoute un caractère de nouvelle ligne à la fin de la chaîne codée . L'indicateur Base64.NO_WRAP indique à l'utilitaire de créer la chaîne codée sans le caractère de nouvelle ligne.
Vérifiez ici
Une option plus propre sans rognage:
String encryPass = BaseEncoding.base64().encode(hashPassword);
Utilisation:
String encryPass = Base64.encodeBase64String(hashPassword).trim();
Si quelqu'un en a besoin pour n'importe quelle bibliothèque utilisant OkHttp, il existe une classe Credentials
que vous pouvez utiliser pour le codage Base64 de votre nom d'utilisateur/mot de passe.
String credentials = Credentials.basic("username", "password");
request.header(HttpHeaders.AUTHORIZATION, credentials);
Cela dépend de la mise en oeuvre de Base64.encodeBase64String()
. Quelle est cette méthode?
Si cela vient des Communes Apache, sachez qu'il existe plusieurs classes différentes qui gèrent les espaces différemment.
Par exemple, org.Apache.commons.net.util.Base64
chunks est généré et ajoute probablement une séquence CR-LF au dernier bloc.
La version la plus courante, org.Apache.commons.codec.binary.Base64
, n’ajoute pas d’espace.