2011-08-02 57 views
0

我正在构建一个Rails应用程序,在该应用程序中我将一个散列序列化为JSON,然后使用gem crypt19和blowfish算法对散列进行编码。我使用的是Rails 3.0.9,Ruby 1.9.2 p180,最新的crypt19 v1.2.1和我在Windows7上开发的。在我的Rails控制器,我做的:Ruby 1.9:gem crypt19:blowfish.encrypt_string:编码问题

require 'crypt/blowfish' 
h=Hash.new 
h["thing"]="12345" 
h["thang"]="abcdefghijklmnopqrstuvwxyz" 

blowfish=Crypt::Blowfish.new("SECRET") 

encrypted_thingy=blowfish.encrypt_string(h.to_json) 

我给你encrypted_thingy到模型中的值(这是一个字符串),

@my_model.string_thing=encrypted_thingy 
@my_model.save 

但是当我保存模型,它抛出一个参数错误异常模型的保存位置。

invalid byte sequence in US-ASCII 

(当我为它分配一个普通的旧字符串,@ my_model =“XXXXXXXX”,一切工作正常。

我的最终计划是通过模型数据库encrypted_thingy存储,再后来解密出来,解析出JSON,并得到“thing”和“thang”的值。

搜索'net建议我需要更改编码,但不清楚我如何做到这一点的结果crypt19/blowfish编码

有什么办法可以存储将此加密字符串作为字符串,就像我存储的任何其他字符串一样?

还是有应用一些魔术(可逆魔术一起)把这一时髦的字符串转换成一个真正的字符串,我可以在电子邮件绕过的方法吗?

+0

看起来像你是混合编码。尝试在ruby文件中设置magiC#encoding标头 – phoet

回答

2

我能够使它工作。有一个称为“hex_string”的gem,它将奇怪的编码的二进制转换为字节字符串。

首先,我不得不这样做

gem install hex_string 

然后代码看起来像这样

require 'crypt/blowfish' 
require 'hex_string' 
h=Hash.new 
h["thing"]="12345" 
h["thang"]="abcdefghijklmnopqrstuvwxyz" 

blowfish=Crypt::Blowfish.new("SECRET") 

encrypted_thingy=blowfish.encrypt_string(h.to_json).to_hex_string.split(" ").join 

的“encrypted_thingy”现在,我可以很容易地通过围绕在我的web应用程序,存储在一个字符串数据库,调试等,而不用担心字符编码等。

要扭转这个过程,我这样做了:

然后
decrypted_string= blowfish.decrypt_string(encrypted_thingy.to_byte_string) 

解密的字符串可以是JSON解析的在原始散列来提取数据。