2012-06-14 15 views
21

Trong một ứng dụng Rails 3.0 (Ruby 1.9.2) Tôi đang cố gắng để mã hóa một số dữ liệu sử dụng một cái gì đó như thế này:Làm thế nào để mã hóa dữ liệu trong chuỗi UTF-8 bằng cách sử dụng OpenSSL :: Cipher?

cipher = OpenSSL::Cipher.new 'aes-256-cbc' 
cipher.encrypt 
cipher.key = cipher.random_key 
cipher.iv = cipher.random_iv 

encrypted = cipher.update 'most secret data in the world' 
encrypted << cipher.final 

Điều đó sẽ đi vào một cơ sở dữ liệu UTF-8. Vấn đề của tôi là

> encrypted.encoding 
=> #<Encoding:ASCII-8BIT> 

> encrypted.encode 'utf-8' 
Encoding::UndefinedConversionError: "\xF7" from ASCII-8BIT to UTF-8 

Tôi có thể nhận được chuỗi mã hóa UTF-8 bằng cách nào?

Trả lời

39

Giải pháp là chuyển đổi chuỗi ASCII-8BIT thành Base64 và sau đó mã hóa thành UTF-8.

cipher = OpenSSL::Cipher.new 'aes-256-cbc' 
cipher.encrypt 
cipher.key = cipher.random_key 
cipher.iv = cipher.random_iv 

encrypted = cipher.update 'most secret data in the world' 
encrypted << cipher.final 

encoded = Base64.encode64(encrypted).encode('utf-8') 

Khi vẫn kiên trì và lấy ra từ cơ sở dữ liệu,

decoded = Base64.decode64 encoded.encode('ascii-8bit') 

và cuối cùng giải mã nó.


PS: Nếu bạn tò mò:

cipher = OpenSSL::Cipher.new 'aes-256-cbc' 
cipher.decrypt 
cipher.key = random_key 
cipher.iv = random_iv 

decrypted = cipher.update encoded 
decrypted << cipher.final 

> decrypted 
=> 'most secret data in the world' 
+0

Cảm ơn vì điều này !! – Brandon

+0

'» được mã hóa = Base64.encode64 ('Tromsø'). Mã hóa ('utf-8') => "VHJvbXPDuA == \ n" »Base64.decode64 (mã hóa.encode ('ascii-8bit')) => "Troms \ xC3 \ xB8" ' – mhenrixon

+0

Cảm ơn bạn, đã cứu ngày của tôi! – ti6on

0

Tôi tin rằng đặt cược tốt nhất của bạn là sử dụng force_encoding được tìm thấy here.

> encrypted.encoding 
    => #<Encoding:ASCII-8BIT> 

> encrypted.force_encoding "utf-8" 

> encrypted.encoding 
    => #<Encoding:UTF-8> 
+4

'.encode' từ ASCII-8 bit sang UTF-8 thất bại, vì vậy' .force_encoding' sẽ chỉ tạo ra một chuỗi byte không hợp lệ. –