2013-08-14 54 views
27

Tôi đã thử:Base 64 mã hóa với Scala hoặc Java

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

KẾT QUẢ:

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

Tôi cũng đã cố gắng:

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

KẾT QUẢ:

result: String = user%3Apass 

Dựa trên http://www.base64encode.org/ Giá trị tôi muốn cho kết quả phải là "dXNlcjpwYXNz"

Trang web hoạt động khác với các mã hóa này là gì? Ngoài ra, làm thế nào tôi có thể bắt chước trang web trong Java/Scala?

Lưu ý, ứng dụng cụ thể dành cho tiêu đề bằng Xác thực cơ bản.

+1

nếu bạn muốn tự tạo một ví dụ, tôi đã tạo Base64 cho scala [https://github.com/Try-Parser/Base64-encryption](https://github.com/Try-Parser/ Mã hóa Base64) – HuntsMan

Trả lời

12

Để nhận "người dùng: chuyển" tới "dXNlcjpwYXNz", bạn nên mã hóa base64 chuỗi được mã hóa UTF-8, nhưng không phải băm.

Sử dụng thư viện ổi của bên thứ ba, tôi có thể chạy

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

và tôi nhận ra

dXNlcjpwYXNz 

theo yêu cầu. Các bộ mã hóa Base64 khác cũng hoạt động tương tự.

+1

(Ngoài ra, phiên bản thứ hai của bạn với 'URLEncoder' không xuất hiện để thực sự làm bất kỳ băm ... hoặc mã hóa Base64 ...) –

+0

Cảm ơn bạn! Đó là hoàn hảo. Đối với ví dụ thứ hai, nó chỉ giúp loại bỏ một số câu trả lời đã được ném vào các câu hỏi tương tự khác. –

58

Vì Java 8 có các lớp tiện ích tiện dụng trực tiếp trong thư viện chuẩn: Base64.DecoderBase64.Encoder. Ngoài ra còn có một số phương thức nhà máy tĩnh để xây dựng các cá thể của các lớp này thực hiện mã hóa/giải mã Base64 cho các hương vị khác nhau của Base64 trong lớp Base64.

Đây là cách sử dụng các bộ mã hóa:

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

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

Giải pháp thay thế Java 7 phù hợp là gì? –

9

Scala được hỏi:

import java.nio.charset.StandardCharsets 

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

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

Nếu bạn đang sử dụng scalaj (Tôi đã), bạn có thể chỉ cần làm điều này:

import scalaj.http.Base64 

Base64.encodeString(str) 

Hoặc

import scalaj.http.HttpConstants._ 

base64(str)