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

时间:2009-11-29 17:35:34

标签: java encryption

我必须实现以下方案。

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

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

我必须使用API​​,它是RSA客户端的一个包装器,有两种方法:

  • decryptInformation(字符串)
  • encryptInformation(字符串)

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

我也看到人们使用Base64类进行编码和解码。我应该在将加密文本存储到数据库之前使用它吗?你能用一个简单的方法向我解释一下吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

  • 引入[轻度/弱]加密,用于容易以文本形式的数据。它是一种弱形式的加密,因为有人可能会快速识别编码。然而,它使得存储的数据不那么“明显”了。
  • 二进制形式的数据存储为TEXT。

大多数DBMS包括允许以二进制格式对字节序列进行条带化的数据类型,因此不必对Text-type格式使用编码和存储。但是,人们仍然可以选择以文本形式存储的原因有很多:

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

答案 1 :(得分:1)

据我所知,这是您应该实施的序列:

  1. 将服务器的公钥发送到客户端
  2. 让客户签名密码(返回byte[]
  3. Base64对签名密码进行编码(返回String
  4. 通过您的网络服务发送base64字符串(使用xsd:base64Binary
  5. 在服务器上,解组(使用JAXB)密码(返回字节数组)
  6. 存储base64编码的字符串,十六进制字符串或字节数组(在Lob中)。

答案 2 :(得分:0)

根据您的加密方法,加密字符串可能包含随机字节顺序,包括可能会混淆XML解析器的内容 - 包括]]>等不太可能但可能的内容。此外,加密的stirng可能包含NULL字节或其他不可见的字符,这会在传递文件时产生麻烦。

Base 64编码确保只有“有效”字符在文档中结束,因此您应该对加密文本进行64位编码。

相关问题