好了,兩個星期內沒有一個答案。 我打算用一個非常簡單的方法來回答,這個方法是用基本方法生成相對安全,高度可擴展的序列號。
作爲一個數學家,我很積極的,有用於存儲各種信息的序號一些先進的技術 - 但我感興趣的主要是快速和垢。
這裏有一個天真的,非數學,蠻力技術考慮:
創建byte[]
陣列包含要使用的字符。您只能使用十六進制,但沒有理由限制自己。爲什麼不使用整個字母數字範圍減去'0'/'O'和'1'/'I'(出於顯而易見的原因)。
接下來,編寫一個函數如下(例子是C#):
byte[] genRandomSerial(int length, byte[] characters, Random r)
{
var sn = new byte[length];
for (int i = 0; i < length; i++)
sn[i] = characters[r.Next(0, characters.Length)];
return sn;
}
這會給你一個隨機的序列號,這是我們不知道是否有效。
下一頁:
int sum(byte[] sn, MD5 md5)
{
val = 0;
foreach (byte b in md5.ComputeHash(sn))
val += (int)b;
return val;
}
然後
bool validate(byte[] sn, uint radix, uint expected, MD5 md5)
{
return (sum(sn, md5) % radix == expected);
}
我們現在已經是加在一起的MD5的16字節輸出散列函數,和評估的方式是否總和模n等於一些x。
現在,決定您想要存在多少個序列號。序列號越多,就越容易被某人隨機猜出一個有效的組合。
將你的隨機序列分成塊。比方說5塊4,給予20個字符形式:ABCD-EFGH-IJKL-MNOP-QRST
創建5個陣列出你的序列號:
{A,B,C,d}, {E,F,G,H},{I,J,K,L},{M,N,O,P}和{Q,R,S,T}。
測試,看看你的5個陣列驗證如下:
if (validate(block1, radix, expected, md5))
// This block is valid.
如果你設置基數爲2,則有1/2的概率,該塊將是有效的。如果將基數設置爲10,則該塊有效的概率爲1/10。如果您有5個塊,並且您將每個基數設置爲10,那麼整個序列號有效的概率爲0.1^5 = 0.00001。 (換句話說,每100000個隨機序列中有1個是有效的,這意味着如果你使用完整的字母數字範圍減去'0'/'O','1'/'I',那麼你有(8 + 24)^ n * 0.00001 =〜1.2 * 10^19有效密鑰的串行長度爲20,這很重要 - 但請記住,無論如何你都不會找到它們,基數越高,串口就越安全,但是產生的時間越長)。
注意,'預期'應該介於0和基數-1之間。
所以現在我們有一種驗證特定序列號的方法是有效的,但我們如何存儲它是什麼類型的序列?事實上,我們已經有辦法做到這一點。將全部隨機的(但確認)串行「SN」:
int licenseType = sum(sn, md5) % 4; // Where 4 is the number of licenses you want to have
if (licenseType == 0)
{
// Evaluation
}
else if (licenseType == 1)
{
// Standard
}
else if (licenseType == 2)
{
// Full
}
else // licenseType == 3
{
// Unrestricted
}
每種類型的許可證的數量將逐漸拉平爲你產生越來越多的按鍵。
如果您想在密鑰中存儲附加信息,例如到期日期,您可以使用類似的方法。例如,您可以將奇數字符模12的和取得到期的月份,並將偶數字符總和的模31取爲到期日。
您應用的這些限制和子部門越多,生成每種類型的密鑰所用的時間就越長。
如何防止惡意用戶編輯分佈式二進制文件以完全繞過檢查? – 2018-01-22 23:07:45
如果對這個問題有一個簡單的答案,那麼基本上每一個商業軟件都不會出現裂縫:) – Ozzah 2018-02-27 02:57:14
這就是我的觀點。在格式結尾處使用一些微不足道的東西 - 也許是一個GPG簽名的JSON文檔 - 並且將精力集中在難以反向工程的措施上,以檢測修補後的二進制文件並使其不可用。 (由於跟蹤導致立即失敗的檢查比較容易,因此,如果檢查失敗的方式會損壞某些內存,而這種方式在運行時不會顯示出來,那麼這樣做會更有意義......但是,是我一段時間都沒參加的貓捉老鼠遊戲)。 – 2018-02-27 14:49:49