簡體   English   中英

生成可驗證的隨機數 - Java

[英]Generating Verifyiable random numbers - Java

我正在嘗試驗證一個專業數據庫(實際上,一個文件系統,但對於這個討論,我想保持這個簡單)。 該數據庫具有以下屬性:

它可以有1個或2個主鍵,它們必須是整數。 列可以是字符串(非ascii允許),整數,長整數或日期時間

我想驗證我要求此數據庫存儲的值是否正確存儲了大量記錄(> 500k記錄)。 因此,我想擴展一個生成數據的工具,以后我可以輕松驗證。

所以基本上,這是示例模式:

pk1 (int - primary key)
pk2 (int - primary key)
s1 (string)
l1 (long)
i1 (int)

我想用這個工具生成500k記錄。 然后,在任何給定的時間,我希望能夠理智地檢查給定的記錄。 我可能會執行一系列操作(比如備份,然后恢復數據庫),然后“抽查”幾條記錄。 所以我希望能夠快速驗證主鍵(pk1 = 100,pk2 = 1)的記錄條目是否有效。

為每列生成值的最佳方法是什么,以便以后可以輕松驗證。 值不一定是完全隨機的,但它們也不應經常重復,因此一些壓縮邏輯也可能被擊中。

例如,假設“某種程度上”該工具為行生成了以下值:

pk1 = 1000
pk2 = 1
s1 = "foobar"
l1 = 12345
i1 = 17

現在我執行了幾個操作,我想驗證在這一行結束時,這一行沒有被破壞。 我必須能夠快速生成s1,l1和i1的預期值 - 給定pk1 = 1000和pk2 = 1 - 因此可以非常快速地驗證它。

想法?

(我不能回答我自己的問題,因為我是一個新用的,所以添加這個:)好的,所以我必須采取可能的方法:

方法#1:使用HASH(tablename)^ HASH(fieldname)^ pk1 ^ pk2作為種子。 這樣,我可以在驗證時輕松計算每列的種子。 另一方面,在為大量行生成數據時,這可能很昂貴,因為種子需要每列計算一次。 所以對於上面的模式,我會有500k * 3種子(生成500k記錄)。

方法#2(由Philipp Wendler提出):每行生成一個種子,並將種子存儲在該行的第一列中。 如果第一列是int或long,則按原樣存儲該值。 如果第一列是字符串,則將種子存儲在前x個字節中,然后將其填充到所需的字符串長度,並使用該種子生成字符。

我更喜歡方法#2,因為每行只有一個種子 - 使數據生成比方法#1快一些。

您可以生成任意隨機數據,計算哈希代碼(例如,MD5,因為它不需要加密安全)並將哈希代碼與您的數據一起存儲。 您可以為哈希代碼設置單獨的列,例如,您可以將其附加到任何字符串列。

為了驗證,將存儲的哈希代碼與該行中的其余數據分開,重新計算哈希代碼並將它們進行相等性比較。 如果它們不匹配,則會修改您的數據。

這假設您只想保護數據免受意外修改(而不是來自惡意攻擊者)。

這只回答了你問題的第二部分 - 如何讓l1存儲所有其他字段的哈希值? 然后,您可以快速驗證是否有任何損壞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM