Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
194
rated 0 times [  197] [ 3]  / answers: 1 / hits: 120177  / 13 Years ago, tue, april 5, 2011, 12:00:00

Is there a reliable way to JSON.stringify a JavaScript object that guarantees that the ceated JSON string is the same across all browsers, Node.js and so on, given that the JavaScript object is the same?


I want to hash JavaScript objects like


{
signed_data: object_to_sign,
signature: md5(JSON.stringify(object_to_sign) + secret_code)
}

and pass them around across web applications (e.g. Python and Node.js) and the user so that the user can authenticate against one service and show the next service "signed data" for that one to check if the data is authentic.


However, I came across the problem that JSON.stringify is not really unique across the implementations:



  • In Node.js / V8, JSON.stringify returns a JSON string without unnecessary whitespace, such as '{"user_id":3}.

  • Python's simplejson.dumps leaves some whitespace, e.g. '{"user_id": 3}'

  • Probably other stringify implementations might deal differently with whitespace, the order of attributes, or whatever.


Is there a reliable cross-platform stringify method? Is there a "nomalised JSON"?


Would you recommend other ways to hash objects like this?


UPDATE:


This is what I use as a workaround:


normalised_json_data = JSON.stringify(object_to_sign)
{
signed_data: normalised_json_data,
signature: md5(normalised_json_data + secret_code)
}

So in this approach, not the object itself, but its JSON representation (which is specific to the sigining platform) is signed. This works well because what I sign now is an unambiguous string and I can easily JSON.parse the data after I have checked the signature hash.


The drawback here is that if I send the whole {signed_data, signature} object as JSON around as well, I have to call JSON.parse twice and it does not look as nice because the inner one gets escaped:


{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{"user_id":5}"}

More From » json

 Answers
38

You're asking for an implementation of something across multiple languages to be the same... you're almost certainly out of luck. You have two options:




  • check www.json.org implementations to see if they might be more standardized

  • roll your own in each language (use json.org implementations as a base and there should be VERY little work to do)


[#92891] Monday, April 4, 2011, 13 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
makaylahh

Total Points: 128
Total Questions: 106
Total Answers: 97

Location: Tanzania
Member since Wed, Feb 24, 2021
3 Years ago
;