J'ai essayé :
val md = Java.security.MessageDigest.getInstance("SHA-1")
val result = new Sun.misc.BASE64Encoder().encode(md.digest("user:pass".getBytes))
RÉSULTAT:
md: Java.security.MessageDigest = SHA-1 Message Digest from Sun, <initialized>
result: String = smGaoVKd/cQkjm7b88GyorAUz20=
J'ai aussi essayé:
import Java.net.URLEncoder
val result = URLEncoder.encode(user + ":" + pass, "UTF-8")
RÉSULTAT:
result: String = user%3Apass
Basé sur http://www.base64encode.org/ La valeur que je recherche pour le résultat doit être "dXNlcjpwYXNz"
Que fait le site différemment de ces encodages? Aussi, comment pourrais-je imiter le site en Java/Scala?
Remarque, l'application spécifique est destinée à un en-tête utilisant l'authentification de base.
Pour obtenir "user: pass" en "dXNlcjpwYXNz", vous devez encoder en base64 la chaîne encodée UTF-8, mais pas hacher.
En utilisant la bibliothèque de goyave tierce, je peux exécuter
System.out.println(BaseEncoding.base64()
.encode("user:pass".getBytes(Charsets.UTF_8)));
et je sors
dXNlcjpwYXNz
comme demandé. Les autres encodeurs Base64 devraient fonctionner de la même manière.
Depuis Java 8, il existe des classes utilitaires pratiques directement dans la bibliothèque standard: Base64.Decoder
et Base64.Encoder
. Il existe également des méthodes d'usine statiques pour construire des instances de ces classes qui effectuent le codage/décodage Base64 pour différentes versions de Base64 dans Base64
classe.
Voici comment utiliser l'encodeur:
import Java.util.Base64
import Java.nio.charset.StandardCharsets
Base64.getEncoder.encodeToString("user:pass".getBytes(StandardCharsets.UTF_8))
On a demandé à Scala:
import Java.nio.charset.StandardCharsets
val (password, expected) = ("user:pass".getBytes(StandardCharsets.UTF_8), "dXNlcjpwYXNz")
assume(Java.util.Base64.getEncoder.encodeToString(password)==expected)
Si vous utilisez scalaj (j'étais), vous pouvez simplement le faire:
import scalaj.http.Base64
Base64.encodeString(str)
Ou
import scalaj.http.HttpConstants._
base64(str)