Encryption 在不同编程语言之间传递加密数据的最佳实践

Encryption 在不同编程语言之间传递加密数据的最佳实践,encryption,language-agnostic,Encryption,Language Agnostic,我已经读到,如果您想使用一种编程语言加密字符串,并使用另一种编程语言解密该字符串,那么为了确保兼容性,最好在加密之前进行一些转换。我已经读到,最好的做法是加密字符串的字节数组,而不是字符串本身。此外,我还了解到,某些加密算法期望每个加密数据包的大小是固定长度的。如果要加密的最后一个数据包不是所需的大小,则加密将失败。因此,对首先转换为固定长度(如十六进制)的数据进行加密似乎是个好主意 我试图确定无论使用何种加密算法,通常都有用的最佳实践。为了最大限度地提高跨不同语言和平台加密和解密数据时的兼容性

我已经读到,如果您想使用一种编程语言加密字符串,并使用另一种编程语言解密该字符串,那么为了确保兼容性,最好在加密之前进行一些转换。我已经读到,最好的做法是加密字符串的字节数组,而不是字符串本身。此外,我还了解到,某些加密算法期望每个加密数据包的大小是固定长度的。如果要加密的最后一个数据包不是所需的大小,则加密将失败。因此,对首先转换为固定长度(如十六进制)的数据进行加密似乎是个好主意

我试图确定无论使用何种加密算法,通常都有用的最佳实践。为了最大限度地提高跨不同语言和平台加密和解密数据时的兼容性,我想对以下步骤进行评论:

加密:

  • 以纯文本字符串开始
  • 将纯文本字符串转换为字节数组
  • 将字节数组转换为十六进制
  • 将十六进制加密为加密字符串
  • 以加密字符串结尾
解密:

  • 从加密字符串开始
  • 将加密字符串解密为十六进制
  • 将十六进制转换为字节数组
  • 将字节数组转换为纯文本字符串
  • 以纯文本字符串结尾
我已经读到,最好的做法是加密字符串的字节数组,而不是字符串本身

晶体算法通常在字节数组或字节流上工作,所以是的。您不直接加密对象(字符串),而是加密它们的字节表示

此外,我还了解到,某些加密算法期望每个加密数据包的大小是固定长度的。如果要加密的最后一个数据包不是所需的大小,则加密将失败

这是您选择的特定加密算法的实现细节。这实际上取决于算法的API接口

一般来说,是的,晶片算法会将输入分割成固定大小的块。如果最后一个块未满,则它们可能会在末尾填充任意字节以获得完整的块。为了区分填充数据和恰好在末尾有填充字节的数据,它们将在字节流前面加上或附加纯文本的长度

这是一种不应该留给用户的细节,一个好的加密库将为您处理这些细节。理想情况下,您只需要输入纯文本字节,然后在另一端输出加密的字节

因此,对首先转换为固定长度(如十六进制)的数据进行加密似乎是个好主意

将字节转换为十六进制并不能使其成为固定长度。它的尺寸是原来的两倍,但这不是固定的。它使ASCII安全,因此可以轻松地嵌入文本文件和电子邮件中,但这与本文无关。(Base64是一个更好的二进制文件→ASCII编码无论如何都比十六进制编码好。)

为了确定确保跨不同语言和平台加密和解密数据的兼容性的最佳实践,我想对以下步骤进行评论:

加密:

  • 纯文本字符串
  • 将纯文本字符串转换为字节数组
  • 将字节数组转换为十六进制
  • 将十六进制加密为加密字符串
  • 加密字符串
  • 纯文本字节数组到加密字节数组
解密:

  • 加密字符串
  • 将加密字符串解密为十六进制
  • 将十六进制转换为字节数组
  • 加密字节数组
  • 将加密字节数组解密为纯文本字节数组
  • 将字节数组转换为纯文本字符串
  • 纯文本字符串
要加密,请将纯文本字符串转换为其字节表示形式,然后加密这些字节。结果将是一个加密的字节数组

按照您选择的方式将字节数组传输到其他程序


要解密,请将加密的字节数组解密为纯文本字节数组。从这个字节数组构造字符串。完成。

您的前提是正确的,但在某些方面比这要简单一些。现代密码算法意味着与语言无关,如果你有相同的输入和相同的密钥,你应该得到相同的结果

的确,对于大多数密码和密码,数据需要是固定长度的。转换为十六进制无法完成,因为数据需要在固定边界上结束。以AES为例,如果要加密4个字节,则需要将其填充到16个字节,这是十六进制表示法无法做到的。幸运的是,这很可能发生在您最终使用的加密API中,其中一个是标准API。因为您没有标记语言,所以.NET中的AES托管类支持的填充模式的类型

另一方面,正确加密数据需要的不仅仅是字节编码。您需要选择正确的操作模式(CBC或CTR是首选),然后提供某种类型的操作。加密本身不能防止数据被篡改。如果你想把事情简化一点,那么看看类似的模式,它处理机密性和完整性

然后,您的方案应该类似于:

  • 将纯文本转换为字符串到字节数组。有关字符编码的重要说明,请参见@rossum的评论
  • 生成随机对称密钥或用于将密码短语转换为密钥
  • 生成用于GCM的随机IV/nonce
  • 加密字节数组并将其与身份验证标记一起存储
  • 您可以选择将字节数组存储为
对于解密: