Есть ли надежный способ 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 не является уникальным для всех реализаций:
- В узле.js / V8, JSON.stringify возвращает строку JSON без лишних пробелов, например '{"user_id": 3}.
- Python's simplejson.dumps оставляет некоторые пробелы, например' {"user_id": 3}'
- Вероятно, другие реализации stringify могут по-разному работать с пробелами, порядком атрибутов или чем-либо еще.
Существует ли надежная перекрестная проверка?метод latform stringify?Есть ли «номинированный JSON»?
Вы бы порекомендовали другие способы хеширования подобных объектов?
ОБНОВЛЕНИЕ:
Это то, что я используюв качестве обходного пути:
normalised_json_data = JSON.stringify(object_to_sign)
{
signed_data: normalised_json_data,
signature: md5(normalised_json_data + secret_code)
}
Таким образом, в этом подходе подписывается не сам объект, а его JSON-представление (специфичное для платформы sigining).Это хорошо работает, потому что я подписываю теперь однозначную строку, и я могу легко JSON.parse данные после того, как проверил хэш подписи.
Недостаток здесь в том, что если я отправлю всю {signature_data, signature}Я также должен вызывать JSON.parse дважды, и это выглядит не так хорошо, потому что внутренняя часть экранирована:
{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}