当为允许灵活性的任何数据格式计算散列时,该问题是一个常见问题。要解决此问题,您需要 规范化 表示形式。
例如,Twitter和其他服务用于身份验证的OAuth1.0a协议要求对请求消息进行安全哈希处理。为了计算哈希,OAuth1.0a说您需要首先按字母顺序排列字段,用换行符分隔它们,删除字段名(众所周知),并将空行用于空值。签名或哈希是根据该规范化的结果计算的。
XML DSIG以相同的方式工作-
在对XML进行签名之前,需要对其进行规范化。有一个提议的W3标准涵盖此内容,因为它是签名的基本要求。有人称它为c14n。
我不知道json的规范化标准。值得研究。
如果没有,您当然可以为您的特定应用程序使用建立约定。一个合理的开始可能是:
- 按名称从大到小对属性进行排序
- 所有名称上使用双引号
- 在所有字符串值上使用双引号
- 名称和冒号之间以及冒号和值之间没有空格或一个空格
- 值和以下逗号之间没有空格
- 所有其他空白都折叠为一个空格或一无所有-选择一个
- 排除您不想签名的任何属性(一个示例是保存签名本身的属性)
- 使用您选择的算法对结果进行签名
您可能还想考虑如何在JSON对象中传递该签名-可能建立一个众所周知的属性名称,例如“ nichols-
hmac”之类的名称,以获取哈希的base64编码版本。散列算法必须明确排除此属性。然后,JSON的任何接收者都可以检查哈希。
规范化表示不必是您在应用程序中传递的表示。只要给定任意JSON对象,就可以轻松生成它。



