2013-08-14 2 views
27

Я пробовал:Base 64 кодирования с Scala или Java

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

РЕЗУЛЬТАТ:

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

Я также попытался:

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

РЕЗУЛЬТАТ:

result: String = user%3Apass 

основой http://www.base64encode.org/ Величину Я хотел результат должен быть «dXNlcjpwYXNz»

Что делать сайт по-разному из этих кодировок? Также, как я могу имитировать сайт в Java/Scala?

Обратите внимание, что конкретное приложение предназначено для заголовка с использованием базовой проверки подлинности.

+1

Если вы хотите сделать свой собственный, у меня есть пример, я сделал Base64 для scala [https://github.com/Try-Parser/Base64-encryption](https://github.com/Try-Parser/ Base64-шифрование) – HuntsMan

ответ

12

Чтобы получить «пользователь: передать» на «dXNlcjpwYXNz», вы должны кодировать кодировку UTF-8 в base64, но не хешировать.

Использование сторонних Guava библиотеки, я могу запустить

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

и я выберусь

dXNlcjpwYXNz 

по запросу. Другие кодеры Base64 должны работать аналогичным образом.

+1

(Кроме того, ваша вторая версия с 'URLEncoder', похоже, не делает никакого хэширования ... или кодировки Base64 ...) –

+0

Спасибо! Это было прекрасно. Что касается второго примера, то это просто помогло бы исключить некоторые ответы, которые были затронуты другими подобными вопросами. –

58

С Java 8 в стандартной библиотеке имеются полезные классы полезности: Base64.Decoder и Base64.Encoder. Существуют также некоторые статические заводские методы для создания экземпляров этих классов, которые выполняют кодировку/декодирование Base64 для различных вариантов Base64 в классе Base64.

Это как использовать кодер:

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

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

Что такое подходящая альтернатива Java 7? –

9

Scala был задан вопрос:

import java.nio.charset.StandardCharsets 

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

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

Если вы используете scalaj (я), вы можете просто сделать это:

import scalaj.http.Base64 

Base64.encodeString(str) 

или

import scalaj.http.HttpConstants._ 

base64(str) 
Смежные вопросы