بیایید بگوییم "کاربر A" مجموعه ای از داده ها را مانند زیر دارد. هر یک از ورودی ها (sha256) برای اطمینان از یکپارچگی در یک ورودی جدا شده است. شما نمی توانید داده های یک ورودی را تغییر دهید بدون اینکه هش مربوطه را نیز تغییر دهید:

[
{ data: "000000", hash: "91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203" }, 
{ data: "111111", hash: "bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a" }, 
{ data: "345345", hash: "dbd3b3fcc3286d927ec214c5648fbb226353a239789750f51430b1e6e9d91f4f" }, 
]

و "کاربر B" داده مشابهی دارد اما به ترتیب کمی متفاوت. البته هش ها یکسان هستند:

[
{ data: "345345", hash: "dbd3b3fcc3286d927ec214c5648fbb226353a239789750f51430b1e6e9d91f4f" }, 
{ data: "111111", hash: "bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a" }, 
{ data: "000000", hash: "91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203" }, 
]

من می خواهم به اجازه دهم تا هر دو کاربر بررسی کنند که دقیقاً همان مجموعه داده را دارند ، بدون توجه به ترتیب مرتب سازی . اگر به عنوان یک مثال شدید ، یک هکر قادر به جایگزین کردن پرونده های کاربر B با داده هایی با ظاهر معتبر باشد ، کاربران باید قادر به مقایسه هشی از کل داده های خود و تشخیص عدم تطابق باشند.

من در حال فکر کردن برای محاسبه "هش کل" بودیم که کاربران می توانند برای بررسی مقایسه کنند. این باید غیرممکن باشد که بتواند یک مجموعه داده معتبر را جستجو کند که منجر به همان "هش کل" شود. اما از آنجا که سفارش می تواند تغییر کند ، کمی مشکل است.

ممکن است یک راه حل ممکن داشته باشم ، اما مطمئن نیستم که به اندازه کافی ایمن باشد. آیا اصلاً امنیت است؟

ایده من این است که هر هش sha256 را به عدد صحیح تبدیل کنید (جاوا اسکریپت BigInt) و آنها را با مدول ضرب کنید تا یک هش در کل طول مشابه را بدست آورید:

  ورودی های مختلف = [
{ data: "345345", hash: "dbd3b3fcc3286d927ec214c5648fbb226353a239789750f51430b1e6e9d91f4f" }, 
{ data: "111111", hash: "bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a" }, 
{ data: "000000", hash: "91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203" }, 
]؛

var hashsize = BigInt ("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")؛
var totalhash = BigInt (1)؛ // نقطه شروع دلخواه

برای (var i = 0؛ i <entries.l طول؛ i ++) {
  var enterhash = BigInt ("0x" + ورودی [i] .hash)؛
  totalhash = (totalhash * enterhash)٪ hashsize؛
}
totalhash = totalhash.toString (16)؛ // تبدیل از bigint به رشته سحر و جادو

این باید برای هر کاربر A و کاربر B یک نتیجه مشابه ایجاد کند ، مگر اینکه داده های دیگری را دستکاری کرده باشد ، درست است؟ ایجاد یک مجموعه داده کمی متفاوت اما معتبر که نتیجه همان چک کامل را داشته باشد ، چقدر دشوار خواهد بود؟ یا راه بهتری برای تحقق این امر وجود دارد (بدون مرتب سازی!).