是否有关于如何签署原始类型的标准?

Is there a standard on how to sign primitive types?

我正在设计一个交换 IOU(数字本票)的协议。 这些应该进行数字签名,但签名应该独立于数据表示(无论是 XML、JSON、二进制、小端还是大端)。

是否有关于如何对字符串和基本类型(如整数、浮点数、布尔值)列表进行签名的标准?

没有一种标准编码,但您可以为特定编码指定规范形式。

  • 对于 json,您可以指定字符串外部没有空格,并且键应该以特定方式排序。
  • 对于 ASN.1,有 DER 编码,这是 BER 的规范形式。
  • Cryptographic Message Syntax (CMS),但我了解的不多

更好的问题是验证 数字签名数据原语的最佳格式是什么。

答案是 xml 根据 XAdES 标准格式化和签名的。 XAdES 与相关标准协调一致,许多实施参与了由 etsi 主持的互操作性测试。

除非很容易验证数字签名格式,否则签名的价值有限。

您可以对任何比特流进行签名,store/maintain 签名作为分离签名。但是你和依赖方(接收者)需要处理两个文件。一个用于数据,一个用于签名。

xml 与 XAdES 的优势在于该格式使已签名的 xml 文件能够包含数字签名。

您可以为另一种数据格式(例如 json)创建 XAdES 的等效项。但是,除非一种新格式变得流行和标准化,否则它的用途是有限的。 XAdES 已经做到了这一点,所以这是可行的方法。

已添加 回复:评论--

I want to provide non-repudiation. I understand that I have to save the information I signed. But I was hoping that I don't have to save it as XML but could rather save all values included in the signature in a database (less verbosely) and uniquely reconstruct the signed string from them before verifying.

从技术上讲,您可以做到这一点。您需要注意 xml 中的间距问题。但实际上,这不是一个好主意。为什么:

证明不可否认性要求您满足适用的举证责任,证明所谓的签名者确实签署了数据。

您可能试图说服原始签名者、专家第三方(审计员)或非专家(律师和陪审团)。你想让说服这些人变得容易和简单。 "re-creating" signed file 这样的方案和"here is the original signed file. Its signature verifies and it was signed with the digital certificate belonging to Susan Signer."

相比,理解起来并不简单

为简单起见,我建议签署 XAdES XML 文件。然后从文件中提取数据并在您的 dbms 中使用它。保留您的 dbms 或其他地方的原始签名文件。如有争议,请出示原始文件并证明其已核实。审计的第二部分是显示您的 dbms 具有与已签名 XML 相同的数据值。

与您证明数据不可否认性的目标相比,保留原始的、已签名的 xml 文件的编程和存储成本是 de minimis

顺便问一下,签名者的证书是如何管理的?如果它不是 QSCD(合格签名创建设备),例如将证书存储在文件系统中,那么您就会遇到另一个问题:无法最终证明该证书未被冒名顶替者使用。使用安全系统进行签名,例如 CoSign(我的公司)或等效系统。