我有一個整數列表(emplyoee的ID) 他們是8位長(雖然幾乎所有啓動00,但它們是有效的8位數字)基於輸入號碼隨機密鑰
爲每位員工我需要生成一個關鍵是:
- 5 chars including [A-Z][a-z][0-9]
- Must include 1 of [A-Z]
- Must include 1 of [0-9]
- Generated key must be unique
- If I know an employees ID I should not be able to determine their key
我需要生成算法,將生成的密鑰,但我想,以避免可能的話,記錄鍵針對員工。我越想我遇到的問題就越多。
如果我能避免它,我不想生成所有的密鑰,並將它們存儲的地方 - 我寧願他們是實時計算
允許我藏在我的系統中一個祕密,我可以除非你知道祕密,否則確保密鑰不確定。
我想過使用標準哈希algroythms(含鹽),但目標空間的限制和包括1 A-Z和1 0-9的限制似乎阻止了這一點。
的一種方式,我想我可能會用它來解決這個問題:
1. Build a deteremnistic function that maps integers starting from 1 [1, 2, 3, ...] to every possible result value
2. Map integers [1, 2, ...] to random other integers in the desired range [324, 43565, ...] in a way that preserves uniqueness (based on a secret salt which if changed would result in a different order).
這將保證唯一性,但第1步是棘手。結果集是不連續的,有些值可能會丟失大寫字母,而其他值會丟失一個數字。
我可以通過開始每個代碼與A1技術上可行,但減少結果空間從5個字符到3個字符。
任何人都可以建議一些簡單的工作,並避免我必須記錄所有生成的結果進行獨特的檢查嗎?
對於密碼編碼部分:取自[A-Z]的第一個字符,取自[0-9]的第二個字符和整個集合中剩下的三個字符。這給你26 * 10 * 62 * 62 * 62(= 61,965,280)的可能性。這並不完全覆蓋8位數字,而是接近 - 所以你可能不需要改變[A-Z]和[0-9]的位置。有了一些數學,你可以在密碼和[0-61,965,279]之間轉換。 –
如果您確實需要覆蓋整個8位數範圍,請將50,000,000以下的地圖數字映射到[AZ] [0-9] [?] [?] [?]以及上面的[0-9] [AZ] [? ] [?] [?]。字符串模式不重疊。字符串生成和解析的決定很簡單:數字低於50,000,000,而第一個字符是字母。 –
我很高興我在這裏發佈拉爾夫,那個答案是1號的路要走。從員工ID到密鑰的確定性,唯一性和祕密映射函數的任何想法? – Robert3452