我必须实现以下方案。
用户调用Web服务发送带有文本的请求,如果文本未加密,则必须由我的服务加密。之后,它应该存储在数据库中。在xsd中将此属性声明为String是一个好主意还是更好的类型?我应该允许使用CDATA吗?
使用Jaxb我将把这个xml转换为一个密码存储在String对象中的类。假设String是unicode(2个字节)可以吗?
我必须使用API,它是RSA客户端的一个包装器,有两种方法:
在大多数情况下,加密方法会将一个字节数组作为参数...我想知道它是否会导致任何意外错误。
我也看到人们使用Base64类进行编码和解码。我应该在将加密文本存储到数据库之前使用它吗?你能用一个简单的方法向我解释一下吗?
答案 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(或类似的编码)将数据存储在数据库中有两个不同的原因:
大多数DBMS包括允许以二进制格式对字节序列进行条带化的数据类型,因此不必对Text-type格式使用编码和存储。但是,人们仍然可以选择以文本形式存储的原因有很多:
答案 1 :(得分:1)
据我所知,这是您应该实施的序列:
byte[]
)String
)xsd:base64Binary
)答案 2 :(得分:0)
根据您的加密方法,加密字符串可能包含随机字节顺序,包括可能会混淆XML解析器的内容 - 包括]]>
等不太可能但可能的内容。此外,加密的stirng可能包含NULL字节或其他不可见的字符,这会在传递文件时产生麻烦。
Base 64编码确保只有“有效”字符在文档中结束,因此您应该对加密文本进行64位编码。