Tôi phải trao đổi các đối tượng JSON giữa các nền tảng khác nhau và việc triển khai dịch vụ và làm cho tính toàn vẹn của nó có thể xác minh được thông qua chữ ký số. Vì vậy, một nền tảng A sẽ tạo ra một đối tượng như vậy và tạo ra một chữ ký số. Chữ ký được cho sau đó được đưa vào đối tượng và được gửi đến nền tảng B. Các đối tượng JSON có thể chứa các thuộc tính và dữ liệu tùy ý.Ký các đối tượng JSON
Ví dụ: bằng PHP:
function signObject($jsonObjectToSign, $privateKey) {
$jsonObjectToSign->signature = "";
$msgToSign = json_encode($jsonObjectToSign);
openssl_sign($msgToSign, $jsonObjectToSign->signature, $privateKey, OPENSSL_SLGO_SHA1);
return $jsonObjectToSign;
}
Vấn đề là, ví dụ: trong Java, không có cách nào để biết liệu các thuộc tính của một đối tượng JSON sẽ theo cùng một thứ tự mà bạn đã thêm chúng hay không (thông qua JSONObject.put()). Vì vậy, nếu tôi làm một
$json = json_encode('{"a":1, "b":2}');
trong PHP, đăng ký đối tượng này như đã nêu ở trên, chuyển nó đến một máy chủ java dựa, giải mã các đối tượng json và sau đó cố gắng xác minh chữ ký, tôi có lẽ sẽ nhận được một khác nhau thứ tự của các thuộc tính của đối tượng.
Vì vậy, những gì tôi cần, là một cách đáng tin cậy để tạo Chuỗi từ JSONObject, độc lập với ngôn ngữ hoặc nền tảng được sử dụng.
Đối tượng ví dụ ở trên cần luôn xuất ra {"a":1, "b":2}
và KHÔNG BAO GIỜ {"b":2, "a":1}
. Rất tiếc, đây là trường hợp thông thường, ví dụ: trong Java.
Có cách nào "thực hành tốt nhất" để ký đối tượng JSON một cách an toàn không?
Nhưng hãy để tôi mô tả các vấn đề theo một cách khác:
Hãy nói rằng tôi muốn làm điều này trong Java (hoặc bất kỳ ngôn ngữ khác):
JSONObject j = new JSONObject();
j.put("a", 1);
j.put("b", 2);
Bây giờ, tôi cần một chức năng serialization, mà kết quả đầu ra luôn là biểu diễn chuỗi giống nhau cho đối tượng này, cho dù đối tượng này được tạo ra bằng ngôn ngữ nào.
Không chắc chắn nếu [này] (http://stackoverflow.com/questions/4670494/how-to-cryptographically-hash-a-json-object) là một bản sao, nhưng nó chắc chắn đáng đọc. Một vài ý tưởng được đề xuất để chuẩn hóa JSON để đảm bảo băm tái sản xuất. –