2009-09-14 26 views
2

我的團隊正在開發一個具有舊數據庫的應用程序,該應用程序使用兩個不同的值作爲Group對象的唯一標識符:Id是一個自動遞增的Identity列,其值已確定在插入時由數據庫執行。 GroupCode由插入後的應用確定,並且是"Group" + theGroup.Id用戶友好且難以猜測的唯一標識符

我們需要的是一種算法來生成GroupCode的是:

  1. 是唯一的。
  2. 對於用戶來說輸入正確是比較容易的。
  3. 黑客難以猜測。
  4. 既可以在插入時由數據庫創建,也可以在插入之前由應用程序創建(即不依賴於標識列)。

現有解決方案符合前兩項標準,但不符合最後兩項標準。有誰知道有一個很好的解決方案來滿足所有上述標準嗎?

還有一點需要注意:即使這段代碼是由用戶在外部使用,並且即使Id會爲其他表提供更好的標識符以將其外鍵鏈接到其他表,但GroupCode會被其他表使用來引用特定的Group 。

在此先感謝。

回答

1

是否可以添加新列?它可以由身份和一個隨機的32位數組成。

然後可以將64位數字轉換爲「Memorable Random String」。這不是完美的安全智慧,但可能是足夠好的。

下面是使用Ruby和Koremutakegem的示例。

require 'koremu' 
# http://pastie.org/96316 adds Array.chunk 
identity=104711 
r=rand(2**32)<<32 # in this example 5946631977955229696 
ka = KoremuFixnum.new(r+identity).to_ka.chunk(3) 
ka.each {|arr| print KoremuArray.new(arr).to_ks + " "} 

結果:

TUSADA REGRUMI LEBADE

還檢查了Phonetically Memorable Password Generation Algorithms

+2

這讓我想起了:http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx – Skilldrick 2009-11-07 15:18:07

1

你看過Base32/Base36內容編碼嗎?標識種子列的Base32表示將使其具有唯一性,易於輸入但絕對不安全。但是大多數非程序員不知道如何生成字符串值。

同樣使用Base32/36,您可以維護基於數據庫整數的正常主鍵。

+0

Base32比Base64多佔用20%的空間,女巫會產生如此巨大的字符串: -/ – balexandre 2010-10-12 07:06:49

+0

@balexandre不,它不會導致巨大的字符串。 Base32的數字比它編碼的整數少35%,如果你使用Base32的Crockford編碼,那麼你將會滿足「用戶輸入正確的合理性」。如果你嘗試使用更高效的編碼,比如base64,那麼我認爲你將無法滿足這個要求。 – AaronLS 2011-10-26 20:49:04