【发布时间】:2015-01-10 18:20:47
【问题描述】:
我目前正在研究一种架构,用户可以在其中发布任何服务器的内容。为确保内容实际上已由某个用户发布(并且在发布后未被更改),使用内容作者的私钥创建签名,其公钥可供集中存储库中的每个人访问。
问题是,我无法控制内容在这些服务器上的实际存储方式。所以我可能会传输内容,例如作为一个 JSON 对象,所有数据都经过 base64 编码,并且使用此 base64 编码内容的哈希创建签名:
{
"a": "b",
"c": "d",
"signature": "xyz"
}
与
signature := sign(PrivKey, hash(b + d);
现在服务器可能会以另一种方式存储此内容,例如一个数据库。所以也许编码会改变。也许 mysql_real_escape_string() 是在 PHP 中完成的,所以东西会丢失。现在如果要检查签名可能会出现问题。
所以通常在创建签名时,你有一个固定的编码和一个带有某种明确分隔符的字节序列(或字符串)——这里不是这种情况。
因此问题是:在这种情况下如何处理签名?
【问题讨论】:
-
你误解了 m_r_e_s()。它不会“改变”您插入数据库的内容。它只添加了一些转义,因此插入的字符串中的任何 SQL 元字符都被设为“非元”,并且不会影响查询的语法。存储在实际磁盘数据库文件中的内容与您转义之前的字符串完全相同。
-
这个问题包含一些运行时特定的部分,否则最好在IT security site 询问这些问题。它并不真正涉及编程来回答。
标签: hash digital-signature public-key