2012-06-14 3 views
21

In einer Rails 3.0 (Rubin 1.9.2) app Ich versuche, einige Daten über so etwas zu verschlüsseln:Wie verschlüsseln Sie Daten in einer UTF-8-Zeichenfolge mit 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 

die in eine UTF-8-Datenbank gehen. Mein Problem ist, dass

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

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

Wie kann ich eine verschlüsselte UTF-8-Zeichenfolge erhalten?

Antwort

39

Die Lösung besteht darin, die ASCII-8BIT-Zeichenfolge in Base64 zu konvertieren und dann in UTF-8 zu codieren.

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') 

Einmal aus der Datenbank beibehalten und abgerufen,

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

und schließlich entschlüsseln.


PS: Wenn Sie neugierig sind:

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

Danke dafür !! – Brandon

+0

'codiert = Base64.encode64 ('Tromsø'). Encode ('utf-8') =>" VHJvbXPDuA == \ n " » Base64.decode64 (codierter.encode ('ascii-8bit')) => "Troms \ xC3 \ xB8" ' – mhenrixon

+0

Danke, habe meinen Tag gerettet! – ti6on

0

Ich glaube, Ihre beste Wette ist zu verwenden force_encoding gefunden here.

+4

'.encode' von ASCII-8BIT auf UTF-8 ausfällt, so' .force_encoding' wird nur eine ungültige Byte-Sequenz erzeugen. –

Verwandte Themen