json-digest 0.0.16

Allow selective masking of JSON subdocuments for privacy, preserving the digest of the whole document.
Documentation

This library provides some algorithms to calculate cryptographically secure digests of JSON documents. Since JSON is an ambiguous serialization format, we also had to define a canonical deterministic subset of all allowed documents. Order of keys in an object and Unicode normalization are well-defined in this subset, making it suitable for hashing.

let data = serde_json::json!({
"address": {
"value": "6 Unter den Linden, Berlin, Germany",
"nonce": "uN_FTaYe8JM-EZ8SU94kAOf0k0YvnhLcZgdpQ3BU9Ymbu"
},
"dateOfBirth": {
"value": "16/02/2002",
"nonce": "ufxkENKgXuf4yG50p6xpSyaQ8Gz7KsuqXid2yw533TUMK"
},
"placeOfBirth": {
"city": "Berlin",
"country": "Germany",
"nonce": "ukhFsI4a6vIZEDUOBRxJmLroPEQ8FQCjJwbI-Z7bEocGo"
},
});

let digest = json_digest::digest_data(&data).unwrap();
assert_eq!(digest, "cjuQR3pDJeaiRv9oCZ-fBE7T8QWpUGfjP40sAXq0bLwr-8");

let partial_digest = json_digest::selective_digest_data(&data, ".dateOfBirth").unwrap();
let expected_partial_digest = serde_json::json!({
"address": "cjuvIf1PmPH_31JN5XqJ1xkcNDJyiw9zQ-7ansSB78gnt4",
"dateOfBirth": {
"nonce": "ufxkENKgXuf4yG50p6xpSyaQ8Gz7KsuqXid2yw533TUMK",
"value":"16/02/2002"
},
"placeOfBirth": "cjub0Nxb0Kz0pI4bWCdSbaCutk1s5qieFT-ZmqUU1xcuAc"
});
assert_eq!(partial_digest, serde_json::to_string(&expected_partial_digest).unwrap());

let digest_from_partial = json_digest::digest_json_str(&partial_digest).unwrap();
assert_eq!(digest, digest_from_partial);