2010-09-29 76 views
2

我在格式一系列代碼:我怎麼可以散列/混淆9-11個字符唯一

AA12345A1 

即:[a-z]{2}[0-9]{5}[a-z][0-9]

AA12345A123 

即:[a-z]{2}[0-9]{5}[a-z][0-9]{3}

我需要創建一個新的任何格式的「代碼」從上述任何一種格式以掩蓋以1號碼結尾的號碼和以3號碼號碼結尾的號碼之間的差異(這向用戶揭示了我需要隱藏的信息)。

爲新的代碼格式的約束條件是:

  • 它們需要是人類使用(因此,使用大寫和小寫字母是一個壞主意可用性明智的,也應儘可能短)
  • 他們必須是唯一的(9號或11字符的代碼應該產生相同的輸出)
  • 只需要一個單向散列,我從來沒有需要獲得原代碼後面
  • 原來的長度代碼(9或11個字符)一定不是顯而易見的 - 它不需要密碼對於外行來說只是不透明的。

是否有任何合適的哈希算法來做到這一點,或有沒有人有任何建議這樣做的自定義方式?

感謝

回答

2

A之間得到一個值非常簡單的方式進行模糊處理將是:

  • 偷偷和隨機挑選一半字母表示9個字符,另一半表示11個字符。
  • 前面加上一個從正確的半隨機字母的字符串(即,如果它是一個9個字符的字符串前面加上從9個字符半信)
  • 如果字符串爲9個字符,追加2個隨機數字

然後,在使用時,您知道如果第一個字符來自一半意思是9個字符,則可以丟棄最後兩位數字。

儘管每個字符串都會有12個字符。

0

你有兩個任務:

  • 創建哈希
  • 代表了人類可用的形式

因此,使用例如SHA1與原始字符串作爲輸入並獲得二進制結果。 =>哈希。 從二進制散列得到9(或11)* 5位和使用下表:

00000 - > 「0」
00001 - > 「1」
...
01001 - >「9 「
01010 - > 」A「
...
11111 - > 」Z「

該表不使用一些字母可能我混了(如 」L「 == 」L「可能會意外地讀爲「1」;因爲您使用數字「0」,所以省略字母「Q」和「O」)。你需要10位數字加22個字符。

如果用戶輸入代碼,則將所有小寫字母替換爲大寫字母,例如「l」/「L」爲「1」,因爲這些必須是拼寫錯誤。如果可能,請添加另外一個或兩個字符作爲校驗和,以便檢查其他拼寫錯誤(交換爲字符)。因此,您可以在前端顯示錯誤消息,而無需執行任何解碼/數據庫查找。

+0

但哈希本身並不保證是唯一的。另一方面,SHA-1長於11個字符(甚至不考慮限制值),所以它可能實際上散列到所有給定輸入的唯一值。 – 2010-09-29 12:04:23

+0

@Konrad:是的,它並不保證是唯一的。但是你可以計算這個概率,如果這個應用程序沒有問題,它可能是一個解決方案,這使得在知道另一個代碼時很難「猜測」一個代碼。 – 2010-09-29 12:09:34

3

這裏有一種可能性。

對於九個字符的代碼,請在第一個數字後面插入一個隨機偶數字母(B,D,F,...),並在結尾處插入兩個隨機數字。

對於十一個字符的代碼,請在第一個數字後面插入一個隨機的奇數字母(A,C,E,...),並保持原樣。

在這兩種情況下,您還可以使用ROT-13非噪聲alpha和ROT-5數字來進一步更改代碼,但我不確定這對您的目的是否有必要。

這樣你最終會得到一個十二個字符的代碼,如果需要的話,你可以反轉。它是人類可讀和獨特的。正如你所說,它不是,NSA級別的加密,但它應該阻止臨時旁觀者。


如果你需要生成一個更確定的結果(即,無隨機數)的哈希,你可以添加的東西依賴於輸入數據。這是一種方法,可能還有數百種。考慮兩種輸入類型:

AB12345C6 
AB12345C678 

仍然插入字符在兩種情況下,1後但要依賴於輸入。添加了數字的位置136,走模10的,通過9

用得到0,作爲一個查找到字符串「ABXVRWECPU」的九位數字代碼或「OIYJTQLSDK」十一位數字代碼來獲得角色。然後,您可以在生成的代碼中使用該字符來決定最初是9或11個字符的代碼(真正的偏執會確保這些字符串不是以明文形式存儲在代碼中)。

對於要添加到第一種情況的兩個數字,將A,C和B的函數(例如,xor'B'與147)加起來,然後將其添加到由64 ,51和23

採取模87的該再加入7 7和93

+1

偉大的思想家都認爲... :( – 2010-09-29 12:04:54

+1

我同意,只有填充數字不能是隨機的,但有一些散列(例如,總和%100),此外,偶數和奇數字母可能很容易被發現 – Sjoerd 2010-09-29 12:07:12

+0

@Sjoerd:什麼是錯的用隨機數字結尾? – 2010-09-29 12:09:29