gpt4 book ai didi

java - 加密/解密和java - 基本问题

转载 作者:行者123 更新时间:2023-12-01 17:40:11 25 4
gpt4 key购买 nike

我必须实现以下场景。

用户调用网络服务发送带有文本的请求,如果未加密,该文本必须由我的服务加密。之后它应该存储在数据库中。在 xsd 中将此属性声明为 String 是一个好主意还是一个更好的类型?我应该允许使用 CDATA 吗?

使用 Jaxb,我会将此 xml 转换为一个类,密码存储在 String 对象中。假设 String 是 unicode (2 个字节)可以吗?

我必须使用 API,它是 RSA 客户端的包装器,具有 2 种方法:

  • 解密信息(字符串)
  • 加密信息(字符串)

在大多数情况下,加密方法采用字节数组作为参数...我想知道它是否可能会导致任何意外错误。

我还看到人们使用 Base64 类来进行编码和解码。我应该在将加密文本存储到数据库之前使用它吗?您能简单地给我解释一下吗?

最佳答案

关于编码的需要
对于许多加密方法,密文(即消息的加密形式)是字节数组,即如果将其视为“字符”序列,则密文可以包含任何字符0 到 255(十进制)或 $00 到 $FF(十六进制)之间。这样的字符范围包括许多不可打印的字符,例如“tab”或“eot”,以及代码高于 128 的字符,其解释可能会有所不同。
此外,即使忽略这些不可打印或“非 ASCII”字符,密文中的某些字符可能会“抛弃”包含密文的可能格式的解释(如例如 XML,如问题中所暗示的)。

因此,密文通常必须编码,以便可以打印或包含在面向文本的容器中。

所有编码(二进制到类似文本的格式)都会导致为数据的编码形式使用更多空间。 Base64 是一种流行的格式,因为它相对紧凑。

另一种可能的编码格式是十六进制(“base 16”),它的大小是原始二进制数据的两倍。十六进制也更简单/更易于使用,因为输入中的任何字节与其输出中的两个相应字符之间存在直接映射。 (其中 Base64 使用 1.25 个字符来编码一个字节,导致编码字节为 3 个输入字节 block )

关于“转义”编码数据的需要
一旦密文被编码,它可能仍然包含容易抛弃包含密文的“外部”格式结构的字符,这就是为什么在 XML 的情况下,您可能想要“转义”此内容作为 CDATA。 (对于十六进制来说这不是必需的,在 Base64 中可能也不需要,具体取决于使用的两个额外字符(Base64 使用 0 到 9、A 到 Z、a 到 z 和两个额外字符,通常是 + 和/,以及=)。

需要将数据存储在数据库中为Base64(或其他编码)
人们使用 Base64(或类似的编码)在数据库中存储数据有两个不同的原因:

  • 针对文本形式的数据引入[轻度/弱]加密。这是一种弱加密形式,因为有人可以快速识别编码。尽管如此,它仍然使存储的数据变得不那么“明显”。
  • 以文本形式存储二进制形式的数据

大多数 DBMS 包含允许以二进制格式存储字节序列的数据类型,因此不需要使用文本类型格式的编码和存储。然而,人们仍然选择存储为文本的原因有很多:

  • 因为数据最终会作为编码文本分发/使用(运行时无需加密,只需在数据存储时加密一次)
  • 方便携带
  • 使调试更容易

关于java - 加密/解密和java - 基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com