我目前正在研究一种体系结构,用户可以在该体系结构的任何服务器上发布内容。为了确保内容实际上是由某个用户发布的(发布后没有更改),使用内容作者的私钥创建签名,该签名的公钥可供集中存储库中的每个人访问。
问题是,我无法控制内容在这些服务器上的实际存储方式。因此,我可以将内容作为JSON对象传输,其中所有数据都经过base64编码,并且签名是使用按一定顺序连接的base64编码内容的哈希创建的:
{
"a": "b",
"c": "d",
"signature": "xyz"
}
和
signature := sign(PrivKey, hash(b + d);
现在服务器可能会以其他方式(例如数据库)存储其内容。因此,编码可能会更改。也许mysql_real_escape_string()是用PHP完成的,所以东西迷路了。现在,如果要检查签名,可能会出现问题。
因此,通常在创建签名时,您会使用固定的编码和带有某种明确定界符的字节序列(或字符串)-此处并非如此。
因此,出现了一个问题:在这种情况下如何处理签名?
仍然需要以位或字节为单位的特定消息表示形式,以便对其进行签名。有两种方法可以做到这一点:
消息的规范表示是数据的特殊,唯一表示,以某种方式将其与所有其他可能的消息区分开来;例如,这还可能包括对表的条目进行排序(只要顺序不改变表的含义),删除空格等。
例如,XML加密包含XML编码的规范化方法。显然,不可能为没有内部结构的数据定义规范化。另一个(偶数)更复杂的规范表示为ASN.1消息(例如X509证书本身以及DER内RSA签名)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句