我正在加密一個字符串的項目,這是一個簡單的部分。困難的部分是找到一種方法,在加密之前對字符串進行散列,並返回帶有衝突域的值。該散列將與加密的字符串一起存儲在數據庫表中。C#散列與衝突域
這樣做的原因是在需要搜索單個記錄時創建一個子集進行解密。這怎麼可以用C#來完成?
我正在加密一個字符串的項目,這是一個簡單的部分。困難的部分是找到一種方法,在加密之前對字符串進行散列,並返回帶有衝突域的值。該散列將與加密的字符串一起存儲在數據庫表中。C#散列與衝突域
這樣做的原因是在需要搜索單個記錄時創建一個子集進行解密。這怎麼可以用C#來完成?
我假設您需要幫助創建衝突域,最簡單的方法是編寫一個函數,將字符串轉換爲具有高碰撞機率的新字符串,然後將該新字符串散列爲查找值。
private static int COLLISION_LENGTH = 5;
public static string CreateCollision(string oldValue)
{
var chars = new char[COLLISION_LENGTH];
for(int i = 0; i < oldValue.Length; i++)
{
chars[i % chars.Length] ^= oldValue[i];
}
return new String(chars);
}
然後你只需要像你會像Rfc2898DeriveBytes密碼散列CreateCollision
與您所選擇的哈希算法的輸出,我建議使用一個強大的哈希系統和對待哈希就像您一個密碼(你將需要使用一個固定的鹽),因爲這個散列確實泄露了你加密的數據的信息。根據需要調整COLLISION_LENGTH
。
考慮一下之後,我實際上可以使用Adler32的實現來計算值。有誰知道Adler32是否可以找到所有可能的組合來創建相同的值? – schwietertj
這取決於輸入,如果文本有一些固定的格式,並且模板和結果之間只有幾個詞不同,可能會對詞位置進行字典攻擊,以找出哪些詞可以到達哪裏哈希結果。 –
這絕對能回答我的問題,因爲我們正在處理個人識別號碼。我相信我們將使用System.Security.Cryptography.HashAlgorithm來生成我認爲在dot net核心中實現的值。 – schwietertj
你需要什麼幫助,創建衝突域或創建哈希? –
我們在這裏談論多少次碰撞?如果唯一的目的是檢查以確保只檢查獨特的哈希值,則需要進行大量衝突才能使該檢查值得。就像斯科特·張伯倫在他的回答中所說的那樣,散列會削弱加密,因爲它會將信息泄露給壞人。 –
另外,如果你只需要檢查碰撞,那麼我建議只存儲散列。如果您需要取回該值,請存儲散列 - >加密數據的查找表,以避免從相同的純文本中存儲多個加密數據斑點。 –