对于客户端和服务器之间的端到端加密通信,我正在实现加密/解密算法。
但是,它们(加密/解密和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 site,another site,它们都产生相同的输出。
关于输出编码,输出2与其他库相同。但是我遇到了转换AES密钥和AES加密数据以在单引号中使用的问题,这是不可能的,因为我已经具有已经包含那些单引号和其他非法字符的加密数据,而Ruby的Base64编码无法正常工作。 / p>
任何帮助将不胜感激。
答案 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}