Есть ли надежный способ для JSON.stringify объекта JavaScript, который гарантирует, что конечная строка JSON одинакова во всех браузерах, node.js и т.д., учитывая, что объект Javascript тот же?
Я хочу хэш-объекты JS, такие как
{
signed_data: object_to_sign,
signature: md5(JSON.stringify(object_to_sign) + secret_code)
}
и передавать их через веб-приложения (например, Python и node.js) и пользователя, чтобы пользователь мог аутентифицироваться в отношении одной службы и показывать следующую службу "подписанные данные" для этого, чтобы проверить, являются ли данные подлинный.
Однако я столкнулся с проблемой, что JSON.stringify не уникален для всех реализаций:
- В node.js/V8 JSON.stringify возвращает строку JSON без лишних пробелов, например '{ "user_id": 3}.
- Python simplejson.dumps оставляет некоторые пробелы, например. '{ "user_id": 3}'
- Вероятно, другие реализационные реализации могут иметь дело иначе с пробелами, порядком атрибутов и т.д.
Есть ли надежный кросс-платформенный метод стягивания? Есть ли "номинированный JSON"?
Не могли бы вы порекомендовать другие способы хэш-объектов вроде этого?
UPDATE:
Это то, что я использую в качестве обходного пути:
normalised_json_data = JSON.stringify(object_to_sign)
{
signed_data: normalised_json_data,
signature: md5(normalised_json_data + secret_code)
}
Таким образом, в этом подходе подписывается не сам объект, а его JSON-представление (которое является специфическим для платформы sigining). Это хорошо работает, потому что то, что я подписываю сейчас, является однозначной строкой, и я могу легко JSON.parse данные после того, как я проверил хэш-подпись.
Недостаток здесь заключается в том, что если я отправлю весь объект {signed_data, signature} как JSON, я должен дважды вызвать JSON.parse, и он выглядит не так хорошо, потому что внутренняя сторона получает escape-код:
{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}