Почему строка в кодировке Ruby base64 отличается от всех других строк в кодировке base64? - PullRequest
1 голос
/ 28 марта 2019

Для сквозной зашифрованной связи между клиентом и сервером я реализую алгоритм шифрования / дешифрования.

Однако они (шифрование / дешифрование и кодирование / декодирование base64) работают нормально только тогда, когдаон в Ruby.

Но реальная проблема, которую я вижу, связана с кодировкой Ruby Base64.

Например, допустим, у меня есть ключ AES (32 байта):

"\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B"

, который я использую для шифрования данных в алгоритме AES.

Я хочу отправить этот ключ клиенту в формате Base64.Для этого я делаю (два способа, каждый из которых производит разные закодированные выходные данные):

Введите двойные кавычки

Base64.urlsafe_encode64("\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B")
# => "IjGvx8CmybrWn7rSyb4PjiqIhyiby3AVIS8Tj877FZs="

Введите одинарные кавычки

Base64.urlsafe_encode64('\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B')
# => "XCIxXHhBRlx4QzdceEMwXHhBNlx4QzlceEJBXHhENlx4OUZceEJBXHhEMlx4QzlceEJFXHgwRlx4OEUqXHg4OFx4ODcoXHg5Qlx4Q0JwXHgxNSEvXHgxM1x4OEZceENFXHhGQlx4MTVceDlC"

Выход 1 отличается от всех других библиотек: Java, Swift и онлайн-сайт , другой сайт , которые все выдают одинаковый вывод.

Выход 2 аналогичен другим библиотекам в отношении выходной кодировки.Но у меня есть проблемы с преобразованием ключа AES и зашифрованных данных AES для использования в одинарных кавычках, что невозможно, поскольку у меня есть зашифрованные данные, которые уже содержат эти одинарные кавычки и другие недопустимые символы, для которых кодировка Ruby Base64 не работает правильно.

Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Проблема в том, что при использовании одинарных кавычек вы получите другой результат:

a = "\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B"
#=> "\"1\xAF\xC7\xC0\xA6ɺ֟\xBA\xD2ɾ\u000F\x8E*\x88\x87(\x9B\xCBp\u0015!/\u0013\x8F\xCE\xFB\u0015\x9B"

b = '\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B'
#=> "\\\"1\\xAF\\xC7\\xC0\\xA6\\xC9\\xBA\\xD6\\x9F\\xBA\\xD2\\xC9\\xBE\\x0F\\x8E*\\x88\\x87(\\x9B\\xCBp\\x15!/\\x13\\x8F\\xCE\\xFB\\x15\\x9B"

a == b
=> false
a.bytes.count
=> 32
b.bytes.count
=> 108
a.length
=> 29
b.length
=> 108

Итак, вы видите, что одинарные кавычки будут двойным выходом из побега.

Однако, как Jordan Running упоминает в комментариях, вы не должны использовать свое собственное шифрование, это небезопасно, прочитайте этот ответ , чтобы понять, почему.

Гораздо лучше использовать рубиновый openssl гем. Инструкции по его использованию см. В документации здесь .

1 голос
/ 29 марта 2019

Если вам нужно поведение с одинарными кавычками, но вы не можете использовать одинарные кавычки, то в Ruby есть опция %q, то есть% q, за которой следуют скобки или парены и т. Д., Окружающие вашу строку, или любой символ, следующий за% q, будет действовать как одинарная кавычка: %q|it's your string| или %q{it's your string}

...