2013-08-14 14 views
27

ho provato:Base 64 codifica con Scala o Java

val md = java.security.MessageDigest.getInstance("SHA-1") 
val result = new sun.misc.BASE64Encoder().encode(md.digest("user:pass".getBytes)) 

RISULTATO:

md: java.security.MessageDigest = SHA-1 Message Digest from SUN, <initialized> 
result: String = smGaoVKd/cQkjm7b88GyorAUz20= 

Ho anche provato:

import java.net.URLEncoder 
val result = URLEncoder.encode(user + ":" + pass, "UTF-8") 

RISULTATO:

result: String = user%3Apass 

Basato su http://www.base64encode.org/ Il valore sto volendo per il risultato dovrebbe essere "dXNlcjpwYXNz"

Qual è il sito facendo in modo diverso da queste codifiche? Inoltre, come posso simulare il sito in Java/Scala?

Nota, l'applicazione specifica è per un'intestazione utilizzando l'autenticazione di base.

+1

se si vuole fare il proprio ho qualche esempio, ho fatto Base64 per scala [https://github.com/Try-Parser/Base64-encryption](https://github.com/Try-Parser/ Base64-encryption) – HuntsMan

risposta

12

Per ottenere "user: pass" su "dXNlcjpwYXNz", è necessario codificare in base64 la stringa codificata UTF-8, ma non l'hashing.

Utilizzando la libreria Guava di terze parti, posso correre

System.out.println(BaseEncoding.base64() 
    .encode("user:pass".getBytes(Charsets.UTF_8))); 

e uscire

dXNlcjpwYXNz 

come richiesto. Gli altri codificatori Base64 dovrebbero funzionare allo stesso modo.

+1

(Inoltre, la tua seconda versione con 'URLEncoder' non sembra effettivamente fare alcun hashing ... o codifica Base64 ...) –

+0

Grazie! E 'stato perfetto Per quanto riguarda il secondo esempio, era solo per aiutare a escludere alcune delle risposte che sono state gettate in altre domande simili. –

58

Poiché Java 8 offre utili classi di utilità direttamente nella libreria standard: Base64.Decoder e Base64.Encoder. Esistono anche alcuni metodi di factory static per costruire istanze di queste classi che eseguono codifica/decodifica Base64 per vari tipi di Base64 nella classe Base64.

Questo è come utilizzare l'encoder:

import java.util.Base64 
import java.nio.charset.StandardCharsets 

Base64.getEncoder.encodeToString("user:pass".getBytes(StandardCharsets.UTF_8)) 
+0

Qual è l'alternativa adatta a Java 7? –

9

Scala è stato chiesto:

import java.nio.charset.StandardCharsets 

val (password, expected) = ("user:pass".getBytes(StandardCharsets.UTF_8), "dXNlcjpwYXNz") 

assume(java.util.Base64.getEncoder.encodeToString(password)==expected) 
4

Se si sta utilizzando scalaj (ero), si può semplicemente fare questo:

import scalaj.http.Base64 

Base64.encodeString(str) 

oppure

import scalaj.http.HttpConstants._ 

base64(str) 
Problemi correlati