我可以使用 SHA1 作為許可證密鑰嗎?
我最近開始研究創建安全的,而不是針對外部伺服器驗證的軟體產品密鑰。
我的想法是創建一個由兩部分組成的密鑰,首先是一個包含使用者的一些(但不是全部)詳細資訊的部分;例如名稱、客戶 ID 和可能的鹽,然後會以一種或另一種方式進行編碼,比如一個簡單的 base64 來混淆它。第二部分將是所有使用者數據散列的 SHA1 簽名,這將與上述基本相同,但將包含授權的軟體版本(即 1.0)以及可能與程序相關的其他內容。
此部署將通過使用者輸入密鑰和軟體從密鑰中提取使用者詳細資訊,附加其自己的憑據(版本號等)生成散列並使用此散列驗證簽名來工作。
如果使用者密鑰沒有被篡改,並且使用者有權使用該版本的軟體,所有這些都將通過,我們可以繼續。如果不是這種情況(例如版本權利錯誤),則簽名將與雜湊不匹配。顯然,公鑰必須包含在軟體中以驗證簽名,但使用者在任何時候都沒有完整的雜湊值。
我正在和一位朋友討論這個問題,他說他們認為這本來就很糟糕,因為使用者可以通過程序來找出密鑰系統是如何工作的,然後,給定結構和公鑰會生成任意數量的許可證密鑰有效,因為他們將控制簽名以匹配軟體生成的“假”憑據散列。
即使使用者確實創建了一些虛假詳細資訊和 ID 號的雜湊值,但他們無法生成與之匹配的有效簽名,這真的那麼容易破解嗎?抱歉,這個問題最終比我預期的要長得多;我不知道如何更短。我希望這一切都有意義。
你在某種程度上是在正確的軌道上。執行此操作的標準方法是使用RSA簽名/驗證方案。
在伺服器上,特定於使用者和特定於許可證的數據被連接成一個字元串並用私鑰簽名。
在軟體中,簽名通過公鑰進行驗證。公鑰不能用於創建有效簽名,它只能驗證它們(這就是非對稱密碼學的美妙之處)。
當然,正如 Thomas 所指出的,沒有什麼可以阻止有人反編譯您的軟體和修改原始碼,但這是無法避免的。
如果您要使用 RSA,請務必使用安全填充方案,如 RSA-PSS。