【问题标题】:Why encrypt and decrypt binary data to Base64为什么要将二进制数据加密解密为Base64
【发布时间】:2021-07-31 05:10:18
【问题描述】:

我正在构建我的第一个 react-native 应用程序。我看过一些关于如何使用 aes-crypto 将二进制数据解密和加密为 base64 的视频,但仍然无法理解我们为什么这样做。那么在我们将二进制数据放回数据库之前,如果我们对其进行加密,当我们将其取出时,我们对其进行解密,这会影响性能还是有什么原因呢?

我知道这是一个新手问题,但我真的很想了解我们这样做的原因,所以如果有人能给我任何指导,我将不胜感激。

干杯

【问题讨论】:

  • 编码或解码是为了传输、存储或查看目的。一个例子:加密后你有很多不可见的“字节”——想想 x00(十六进制)。 Base64 支持二进制数据和字符串版本之间的无损转换。
  • 好吧,我现在明白了。这有帮助!传奇!
  • @minhpham:我觉得当前的答案错过了你问题的 aes 部分。你能澄清一下你是使用普通的base64还是用aes加密? base64和aes这两者有很大的不同。
  • @WiktorZychla 我之所以提出这个问题是因为我看了以下视频:youtube.com/watch?v=vj723NlrIQc。他说通过使用本机加密/解密(在这种情况下,是他提到的库:github.com/craftzdog/react-native-aes-gcm-crypto),它使他的应用程序更快。我假设正如 Michael 和 jfriend 解释的那样,也许他使用的数据库不接受二进制,所以他必须使用 based64 编码,并且由于 react-native 使用 javascript 运行时,加密/解密过程需要更长的时间来处理。因此,使用本机加密/解密提高性能
  • @minhpham:我也不明白这一点。 JavaScript 有内置缓冲区到 base 64 编码,应该比 aes 快得多。只要你不需要加密,我相信你不需要 aes 和这个特殊的包。坚持使用 JavaScript 转换。我的印象是这是您最关心的问题,为什么要使用 aes 包。

标签: node.js react-native encryption react-redux


【解决方案1】:

当传输或存储机制不接受二进制数据时使用 Base64 编码,但您要发送或存储的数据可能包含二进制组件。在您的情况下,您加密某些内容并获得二进制结果。然后,您对其进行 base64 编码以将该二进制文件转换为“文本”或“字符串”表示形式,该表示形式仍然可以通过解码再现实际的二进制文件,但以文本形式描述该二进制文件(它使用更多字节来这样做)。然后可以通过解码 base64 将其无损地转换回原始二进制文件。

例如,如果您在数据库中存储,如果您将其放入数据库中的字段类型接受二进制数据,则不需要对其进行 base64 编码,但如果它不接受二进制数据,那么您是否可以对其进行 base64 编码以将其转换为可以安全存储在数据库中的内容(字符串)。

仅供参考,Base64 是一种编码方案,您可以使用 64 种不同的代码。这 64 个代码是 A-Z、a-z、0-9 和 + /。即 26 + 26 + 10 + 2 = 64。您可以查看代码 here= 字符也可用于填充以使最后一个字符块成为一组四个 Base64 字符。因此,从技术上讲,可以使用 65 个不同的字符,尽管 = 只是一个空占位符,而不是实际编码数据的一部分。填充对于准确解码不是必需的,但在某些情况下仍会使用。

64 个字符是 2^6,所以这本质上是 6 位编码。三个 8 位值被放入四个 6 位值中,其中每个 6 位值由 64 个不同字符中的不同字符表示。因此,四个 Base64 编码字符块解码为三个 8 位值。

这与基于文本的十六进制或基于文本的二进制表示并没有太大的不同。在十六进制中,每个 8 位原始值由两个 4 位字符(16 个不同字符)表示,其中 127 之类的值是 7F。在基于文本的二进制中,每个数据字节由 8 个 0 和 1 表示,而 127 将是01111111。 Base64 相同,但它使用 64 个字符集而不是较小的十六进制 (16) 或二进制 (2) 集。

【讨论】:

  • 多么棒的答案!谢谢,jfriend,现在很有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2011-03-13
  • 2016-08-11
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
相关资源
最近更新 更多