這裏有兩個想法:
- 使用可逆散列。這是否有效取決於你認爲的安全性,因爲它本質上只是混淆。但是,如果你定製它(可能會改變算法中的某些步驟),並且防止源泄漏,它將阻止除最堅決的攻擊者之外的所有其他攻擊者。 (根據您的安全目標,您可能需要結合其他一些技術來減少泄漏風險,例如員工離開公司,考慮保留算法的一部分祕密,就好像它是一個加密密鑰,以及對輸入有額外的,可變的,預先轉換)
關於我的頭頂,簡單的可逆散列可能只是位的「橫向加法」。對於更復雜的東西,我的頭頂上,流行的「MurmurHash」算法家族聲稱是可逆的。
我不知道任何加密強可逆哈希。但是,關於對稱加密主題的其他答案與此想法類似。
- 使用流密碼,AKA加密RNG。如果訂單總數相當小,這是適當的。您需要的是與計數編號序列一一對應的唯一序列號碼。因此,使用您選擇的RC4或HMAC生成一系列獨特的隨機數字,隨時消除重複。 (也許一個創造性的方法可以讓這個過程變得更快是一個布隆過濾器。)
對於從內部ID映射到外部ID,您只需生成序列。相反,你會一直走下去,直到找到ID,或者擊中最大訂單ID。這個算法是O(n),這顯然不是理想的,但如果你願意妥協一點,增加更多的複雜性,或者很聰明,你可能會找到一種方法來緩解這種情況。例如,您可能能夠在RAM中保存ID的緩存。
編輯:
我自己感到懷疑#2,由於線性複雜,所以我跑了一些數字。使用Core2處理器的Crypto ++基準數字,如果您預算10毫秒到數字轉換,並且您使用40位ID(假設您獲得1萬億個訂單),那麼您的訂單ID最大值爲2,500,000。而且我認爲你可以通過使用更小的鑰匙來加倍。
所以這種方法可以採取任何方式。對於小規模的東西,沒關係。 (上面的假設是保守的。)但對於大規模的東西,這可能是一個煩惱。這足以讓你通過產品發佈;在您開始討論如何將您的軟件構建爲分佈式系統時,您會希望重新訪問它,這也有助於解決此問題。但是在那個時候,你可能會更好地質疑最初的假設,並將這個東西存儲在某個數據庫中。
更好地實施適當的授權,並允許客戶只看到自己的訂單。 – Gumbo 2014-11-22 14:17:45
這個問題的答案[加密短標識符](http://security.stackexchange.com/q/33761/8343)可能對你很有意思。 – martinstoeckli 2014-11-25 21:09:26