【问题标题】:What is the best way to post signed content on the internet?在互联网上发布签名内容的最佳方式是什么?
【发布时间】: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


【解决方案1】:

仍然需要以位或字节表示的特定消息才能对其进行签名。有两种方法可以做到这一点:

  1. 只存储消息的字节表示,之后不要更改它(如果消息是字符串,首先使用明确定义的字符编码对其进行编码);
  2. 定义消息的规范表示,您可以直接存储消息的规范表示,也可以在更新签名中的哈希时将其转换到内存中。

消息的规范表示是一种特殊的、唯一的数据表示,它以某种方式将其与所有其他可能的消息区分开来;例如,这可能还包括对表的条目进行排序(只要顺序不改变表的含义)、删除空格等。

例如,XML 加密包含用于 XML 编码的规范化方法。显然,不可能为没有内在结构的数据定义规范化。另一个(甚至)更复杂的规范表示是 ASN.1 消息的 DER(例如 X509 证书本身以及 in RSA 签名)。

【讨论】:

  • 没有更多信息,无法更详细地回答这个问题。
【解决方案2】:

我认为您实际上是在问两个不同的问题:

数据应该如何签名?

我建议尽可能使用标准数字签名数据格式,而在其他时候使用“分离签名”。这在实践中意味着什么:PDF、Word、Excel 和其他提供数字签名的文件格式应保留这些格式。

不提供数字签名的文件格式应使用分离签名进行签名。分离签名的推荐标准是 .p7b 文件类型——没有数据的 PKCS#7 数字签名结构。 Here is an example of signing data with a detached signature from my company.

这意味着“依赖方”——下载/接收信息的人——将下载两个文件。第一个是原始数据文件,未更改。第二个文件将是第一个文件的分离签名。

优点 直接支持数字签名的签名文件格式可以使用文件的常用软件应用程序验证其签名。即,免费的 Adob​​e PDF Reader 应用程序知道如何验证数字签名的 PDF。同样,MS Word 知道如何验证签名的 Word 文件。

对于其他文件类型,相关的分离签名文件将向收件人保证该文件自签名以来未被修改以及签名者是谁(取决于信任问题,见下文)。

关于数据库存储——您不必关心数据如何存储在不同的服务器(数据库、文件系统等)上。在任何或所有情况下,数据都应该保持不变。

如何在签名者和接收者之间建立信任 我建议该组织创建自己的根证书。然后,您可以将证书作为文件放在您的 SSL 网站上。 (您网站的 SSL 证书应该来自 CA,例如 Comodo、VeriSign 等。)结果是信任您网站 SSL 证书的人可以信任您的组织证书。并且您的签名者的证书应该链接到您组织的证书,从而建立对接收者的信任。

这种创建自签名组织证书的方法成本低,并且提供了高度的信任。但是依赖方需要下载并安装您组织的证书。

如果这样做不好,您可以从公共证书颁发机构 (CA) 为您的签名者获取证书,但由于 CA 的收费,这将至少增加一个数量级的成本。我的公司CoSign 支持所有这些配置。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2015-08-12
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多