2013-08-14 9 views
27

Próbowałem:bazowa 64 kodowania z Scala lub Java

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

WYNIK:

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

Próbowałem również:

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

WYNIK:

result: String = user%3Apass 

podstawie http://www.base64encode.org/ Wartość Ja chce na skutek powinien być „dXNlcjpwYXNz”

Jaka jest strona robi się inaczej od tych kodowania? Ponadto, w jaki sposób mogę naśladować witrynę w języku Java/Scala?

Uwaga, konkretna aplikacja dotyczy nagłówka korzystającego z podstawowego uwierzytelniania.

+1

Jeśli chcesz zrobić własny, mam pewien przykład, zrobiłem Base64 dla scala [https://github.com/Try-Parser/Base64-encryption](https://github.com/Try-Parser/ Base64-encryption) – HuntsMan

Odpowiedz

12

Aby otrzymać "user: pass" do "dXNlcjpwYXNz", powinieneś być kodowany przez base64 kodowany ciąg znaków UTF-8, ale nie mieszać.

Korzystanie z Guava biblioteki innej firmy, mogę uruchomić

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

i wyjdę

dXNlcjpwYXNz 

na żądanie. Pozostałe kodery Base64 powinny działać podobnie.

+1

(Również twoja druga wersja z 'URLEncoder' nie wydaje się faktycznie robić żadnego mieszania ... lub kodowania Base64 ...) –

+0

Dziękuję! To było idealne. Jeśli chodzi o drugi przykład, to po to, aby wykluczyć niektóre z odpowiedzi, które zostały zgłoszone na inne podobne pytania. –

58

Od wersji Java 8 istnieją przydatne klasy narzędziowe bezpośrednio w standardowej bibliotece: Base64.Decoder i Base64.Encoder. Istnieją również statyczne metody fabryczne do konstruowania instancji tych klas, które wykonują kodowanie/dekodowanie Base64 dla różnych smaków klasy Base64 w klasie Base64.

Jest to sposób korzystania z kodera:

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

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

Jaka jest odpowiednia alternatywa Java 7? –

9

Scala został zapytany:

import java.nio.charset.StandardCharsets 

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

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

Jeśli używasz scalaj (ja), można po prostu to zrobić:

import scalaj.http.Base64 

Base64.encodeString(str) 

Lub

import scalaj.http.HttpConstants._ 

base64(str)