2009-11-18 31 views
0

當用戶在我們的網站註冊時,我們使用地址驗證服務來檢查地址。如果找到輸入的地址但有一些錯誤,此服務可返回地址建議。這個建議被返回給用戶。檢查用戶是否更改了數據

用戶可以接受該建議並被信任。如果他改變了地址,他就不被信任。

有沒有一種很好的方法來檢查顯示給用戶的數據是否與他發佈的數據相同?我想我需要一個帶有地址數據散列的隱藏字段。但我不確定我應該採用哪種算法。如果可能,該算法應該不區分大小寫。

該算法應創建一個防篡改單向散列。

編輯:

到目前爲止這工作得很好。我仍然不得不用umlaute(ä,ü)進行測試。

   StringBuilder addressData = new StringBuilder(); 
      addressData.Append(FirstName); 
      addressData.Append(LastName); 
      addressData.Append(StreetNumber); 
      addressData.Append(StreetName);    
      addressData.Append(City); 
      addressData.Append(CountryISO); 
      addressData.Append(Zip); 
      string stringVal = addressData.ToString().ToLower(); 

      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
      byte[] keyByte = encoding.GetBytes(ApplicationConfiguration.ShaKey); 
      byte[] messageBytes = encoding.GetBytes(stringVal); 

      HMACSHA256 hmacsha256 = new HMACSHA256(keyByte); 
      byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
      string hash = ByteToString(hashmessage); 

      return hash 

回答

1

使用HMAC (Hash-based Message Authentication Code) - HMAC是爲了這個目的而發明的;用對稱密鑰驗證數據。我自己並不熟悉.NET,但標準庫似乎提供了許多繼承於System.Security.Cryptography.HMAC的類。 HMAC比普通的散列更好,因爲它不容易受到散列長度擴展攻擊的影響。

HMACSHA256看起來很不錯。

你也應該考慮增加一個unique value (a nonce)字符串,如果你想防止防止重放攻擊 - 否則用戶可以重新發送與隨行早期HMAC簽名較早的電子郵件。

HMAC密鑰必須是服務器端的密鑰。

0

有沒有檢查是否顯示給用戶的 數據相同 他職位數據的好辦法?

是的 - 您可以在數據庫中存儲您發送給用戶的數據。

當用戶提交表單時,將數據庫中的數據與用戶提供的數據進行比較。 如果選擇比較散列字符串,則可以將數據轉換爲CRC32散列,但重要的是以相同的方式連接不同的數據對象。

編輯: 順便說一句,我認爲創建一個哈希字符串將是無用的,因爲數據存儲在數據庫中,而不是很長一段時間。

+0

CRC32可能被篡改。我需要一個安全的單向散列。 – 2009-11-18 17:00:05

+0

@Mathias Fritsch:考慮MD5。 – Dor 2009-11-18 17:03:38

0

我喜歡你的想法..你連接地址部分使它成爲一個大字符串,並執行ToLower版本字符串的GetHashCode。然後使用相同的方法進行比較。

0

如果JavaScript是允許的,也許你可以使用jQuery的變化()事件,並通過設置客戶端的隱藏價值進行檢查,知道如果事情發生了轉變:

變化事件時,將觸發控制 失去自獲得重點以來,輸入焦點和其值 已被修改。

$("input[type='text']").change(function() { 
    //do something here, maybe set a hidden value 
}); 

然後在您的控制器可以通過這個隱藏價值,或者你可以去看中,並檢查該值與一些Ajax向右走,但也許是因爲您的安全要求,這可能是危險的。

+0

Javascript不是一個選項,因爲用戶仍然可以篡改返回到服務器的數據。 – 2009-11-18 20:44:42

+0

這真的是一個問題......我不認爲在這個問題上有簡單的方法,也許如果你在鹽的地方加鹽,可能會出現這樣的情況,你必須爲每個地方保存一個鹽,並散列(鹽+地方),就像在SHA-1中醃製的密碼一樣。但這是多餘的,因爲在這種情況下,我們不知道選擇的是哪個值。我們需要別的東西像一個ID(用戶名在登錄的情況下),讓我們知道究竟選擇哪種鹽,並且這必須以雙向散列的形式隱藏值。 另一種可能的選擇是以某種方式在用戶會話中保存一個鍵並使用它來比較POST的值。 – JOBG 2009-11-18 21:37:10

+0

Jeez,爲什麼重新發明帶有潛在安全漏洞的車輪,如果你可以使用HMAC並完成它。將密碼學留給密碼技術人員。 – intgr 2009-11-18 23:41:48

相關問題