2012-03-21 54 views
0

對於我正在設計的系統,我希望能夠驗證特定的字符串是否爲「有效」,但我想保留「有效」字符串的私有數據庫。驗證加密數據庫中的字符串存在

我想爲客戶提供所有有效字符串的數據庫,但是這個數據庫是(單向)加密的。我不願意將密鑰分發給客戶端,因爲總有辦法從我的程序的彙編代碼中獲得特定的密鑰(我假設)。

客戶端必須能夠輸入字符串到我的程序中,它會根據加密文件中字符串的存在返回一個布爾值。

更重要的是,我希望我的程序能夠輕鬆地檢查字符串是否在文件中,但是我想阻止其他程序輕鬆使用(和/或重建)數據庫。

我已經制定了這個有點抽象,因爲我真的不知道我的系統將如何看待,但我想知道是否有可能這樣的事情。

回答

4

你正在尋找的是密碼散列函數! MD5和SHA1是衆所周知的例子,但如果你正在構建新的代碼而沒有嚴格的性能限制,SHA256將成爲你選擇的代碼,如果你想使它難以恢復原始單詞,你可能會想要考慮scrypt或者bcrypt(雖然它們不像你的語言那樣受歡迎,並且不太可能使你的語言將它們包含在標準庫中)。

那麼你的數據庫可以作爲一個無序的散列集合一樣簡單,像(在Python):

>>> words = ["secret", "hidden"] 
>>> db = set([hashlib.sha256(word).hexdigest() for word in words]) 
>>> db 
set(['2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b', 'e564b4081d7a9ea4b00dada53bdae70c99b87b6fce869f0c3dd4d2bfa1e53e1c']) 
>>> def word_exists(word): 
...  return hashlib.sha256(word).hexdigest() in db 
... 
>>> word_exists("hello") 
False 
>>> word_exists("hidden") 
True 
+0

我真的沒有想到這一點,但在本案的情況比較特殊,因爲'商業祕密'實際上是文件散列。我想防止他人使用我的數據庫,所以我想要有一些單向的功能,別人不能輕易做到。 – ralphje 2012-03-21 19:34:09

+0

你能澄清一下你所說的「別人不容易做到的單向散列函數」嗎?而你說你想阻止他人使用數據庫......但是可以推測有一些人被允許使用它?在社交層面,你如何區分有權訪問的人和沒有訪問權的人? (可以訪問的人使用密碼嗎?一個硬件令牌?一個加密的網絡連接?) – 2012-03-21 19:50:23

+0

我希望我的軟件程序能夠輕鬆地檢查數據庫中是否存在特定的散列,但想讓其他人(其他程序)使用相同的數據庫。合法訪問(通過我的程序)應該是可能的,並且是獲得訪問權限的唯一可行方式。 – ralphje 2012-03-21 22:45:40