为什么Ruby base64编码的字符串与所有其他base64编码的字符串不同?

时间:2019-03-28 13:53:38

标签: ruby base64 aes

对于客户端和服务器之间的端到端加密通信,我正在实现加密/解密算法。

但是,它们(加密/解密和base64编码/解码)仅在Ruby中有效。

但是我看到的实际问题是Ruby的Base64编码。

例如,假设我有这个(32字节)AES密钥:

"\"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和an online siteanother site,它们都产生相同的输出。

关于输出编码,输出2与其他库相同。但是我遇到了转换AES密钥和AES加密数据以在单引号中使用的问题,这是不可能的,因为我已经具有已经包含那些单引号和其他非法字符的加密数据,而Ruby的Base64编码无法正常工作。 / p>

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

问题在于,当您使用单引号时,您会得到不同的结果:

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在评论中提到的那样,您不应该进行自己的加密,因此它不安全,请read this answer以了解原因。

使用红宝石的openssl宝石是一个更好的主意。有关如何使用它的说明,请参阅documentation here

答案 1 :(得分:1)

如果您需要单引号行为,但不能使用单引号,则Ruby提供%q选项,即%q,后跟方括号或括号等字符串,否则%q后的任何char将用作单引号:%q|it's your string|%q{it's your string}