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

标签 ruby base64 aes

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

但是,它们(加密/解密和 base64 编码/解码)只有在 Ruby 中才能正常工作。

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

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

"\"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 编码格式将此 key 发送给客户端。为此,我正在做(两种方式,每种方式产生不同的编码输出):

输入双引号

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 ,它们都产生相同的输出。

Output 2 在输出编码方面与其他库相同。但是我在将 AES key 和 AES 加密数据转换为在单引号中使用时遇到问题,这是不可能的,因为我加密的数据已经包含那些单引号和其他非法字符,Ruby 的 Base64 编码无法正常工作。

如有任何帮助,我们将不胜感激。

最佳答案

问题是当你使用单引号时你会得到不同的结果:

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了解原因。

使用 ruby​​ 的 openssl 是一个更好的主意 gem 。有关如何使用它的说明,请参阅 documentation here .

关于ruby - 为什么 Ruby base64 编码字符串与所有其他 base64 编码字符串不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399329/

相关文章:

ruby-on-rails - rails : Export data in google spreadsheet

javascript - 为什么 Backbone 模型在保存时向服务器发送重复的属性?

mysql - ActiveRecord::InvalidForeignKey

java - sun.misc.BASE64Decoder 在 java 应用程序中显示错误

.net - .NET AES/Rijndael-重用解密器时解密不一致

c# - 在 .Net 中加密 在 php 中解密

ruby - 验证框架的替代 Rails

ASP.NET : A generic error occurred in GDI+

binary - 如何理解vtk二进制文件格式的base64编码

C++ AES 加密类