Ruby 1.9: гем crypt19: blowfish.encrypt_string: проблема с кодировкой - PullRequest
0 голосов
/ 03 августа 2011

Я создаю приложение Rails, в котором я сериализирую хэш в JSON, а затем кодирую хэш, используя gem crypt19 и алгоритм blowfish. Я использую Rails 3.0.9, Ruby 1.9.2 p180, последнюю версию crypt19 v1.2.1 и разрабатываю для Windows7. В моем контроллере Rails я делаю:

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

но когда я сохраняю модель, она выдает исключение Argument Error, где модель сохраняется.

invalid byte sequence in US-ASCII

(И когда я назначаю ей простую старую строку, @ my_model = "xxxxxxxx", все работает отлично.

Мой конечный план - сохранить encrypted_thingy в базе данных через модель, а затем расшифровать ее, проанализировать JSON и получить значения для "thing" и "Thang".

Поиск в сети предположил, что мне нужно изменить кодировку, но не ясно, как мне это сделать с результатом кодирования crypt19 / blowfish.

Есть ли способ сохранить эту зашифрованную строку как строку, как и любую другую строку, которую я храню?

Или есть способ применить магию (вместе с обратимой магией), чтобы превратить эту классную строку в настоящую строку, которую я могу передать по электронной почте?

1 Ответ

2 голосов
/ 05 августа 2011

Я смог заставить его работать.Существует гем под названием «hex_string», который преобразует двоичные объекты со странными кодировками в байтовые строки.

Сначала я должен был сделать

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" был строкой, которую я мог легко обойти вмое веб-приложение, сохранение в базе данных, отладка и т. д., не беспокоясь о кодировке символов и т. д.

Чтобы полностью изменить процесс, я сделал следующее:

decrypted_string= blowfish.decrypt_string(encrypted_thingy.to_byte_string)

Затем расшифрованная строка может бытьРазбор JSON для извлечения данных в исходный хеш.

...