使用.NET內建的功能製作簡單的註冊碼

來源:互聯網
上載者:User

加密可以協助保護資料不被查看和修改,並且可以協助在本不安全的通道上提供安全的通訊方式。例如,可以使用密碼編譯演算法對資料進行加密,在加密狀態下傳輸資料,然後由預定的接收方對資料進行解密。如果第三方截獲了加密的資料,解密資料是很困難的。

為了達到這些目的,您可以使用演算法和慣例的組合(稱作加密基元)來建立加密方案。包括私密金鑰加密(對稱式加密)、公開金鑰加密(不對稱式加密)、加密簽名和加密雜湊。

我們使用公開金鑰加密(不對稱式加密)來實現註冊碼的演算法。

公開金鑰加密使用一個必須對未經授權的使用者保密的私密金鑰和一個可以對任何人公開的公開金鑰。公開金鑰和私密金鑰都在數學上相關聯;用公開金鑰加密的資料只能用私密金鑰解密,而用私密金鑰簽名的資料只能用公開金鑰驗證。

對於註冊碼來說,我們使用私密金鑰來對一個字串(使用者名稱)簽名,然後使用公開金鑰對這個簽名(註冊碼)進行驗證。由於公開金鑰只能用於驗證,所以我們可以放心把公開金鑰分發出去;私密金鑰匙用來進行簽名的,所以私密金鑰匙要儲存在開發人員手中的。這樣就達到了註冊認證的目的。目前使用“使用者名稱、註冊碼”模式註冊的軟體都應該是使用這一技術。

首先我們產生自己要使用的一個公開金鑰和私密金鑰。

Private rsa As New Security.Cryptography.RSACryptoServiceProvider

RSACryptoServiceProvider類提供RSA演算法的實現執行不對稱式加密和解密。通過ToXMLString就可以產生我們需要的公開金鑰和私密金鑰。

rsa.ToXmlString(False)

rsa.ToXmlString(True)

當參數為False的時候,僅產生公開金鑰;True的時候將會把公開金鑰和私密金鑰全部產生。我們一般通過ToXmlString(False)得到一個公開金鑰字串;通過ToXmlString(True)得到一個私密金鑰字串(雖然其中含有公開金鑰)。我們可以將這兩個密鑰儲存在本機上面,通過字串常量定義並使用。也就是說我們的註冊資訊將使用唯一的公開金鑰和私密金鑰。

然後我們通過公開金鑰和私密金鑰對指定的字串進行簽名。

rsa.FromXmlString(PRIVATE_KEY)

Dim f As New Security.Cryptography.RSAPKCS1SignatureFormatter(rsa)

f.SetHashAlgorithm("SHA1")

Dim source() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(UID)

Dim sha As New Security.Cryptography.SHA1Managed

Dim result() As Byte = sha.ComputeHash(source)

Dim regkey() As Byte = f.CreateSignature(result)

SerialNumber = Convert.ToBase64String(regkey)

通過剛才得到的私密金鑰重新初始化rsa對象,然後通過RSAPKCS1SignatureFormatter類來進行簽名。我們將輸入的字串轉化成位元組數組(我們這裡預設使用者名只能由ASCII字元組成),通過SHA1哈西演算法計算其雜湊值。再使用CreateSignature方法將得到的哈西值進行簽名。最後我們將得到的位元組數組轉化成字串作為註冊碼。這就是產生註冊碼的過程。我們可以重複使用這一段程式對不同的使用者名稱進行簽名,從而得到與之對應的不同註冊碼。

最後我們把剛才得到的使用者名稱和註冊碼進行驗證。

rsa.FromXmlString(PUBLIC_KEY)

Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)

f.SetHashAlgorithm("SHA1")

Dim key() As Byte = Convert.FromBase64String(SerialNumber)

Dim sha As New Security.Cryptography.SHA1Managed

Dim name() As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))

Result = f.VerifySignature(name, key)

這一次我們使用公開金鑰來初始化rsa對象,然後通過RSAPKCS1SignatureDeformatter類來驗證簽名。我們將得到的註冊碼反向轉化為位元組數組;並將使用者名稱進行哈西計算得到哈西值。最後通過VerifySignature進行驗證。

 
從上面的程式可以看出,產生註冊碼需要私密金鑰(私密金鑰內附帶公開金鑰資訊),而且可以產生任意多的使用者名稱、註冊碼對。而通過公開金鑰,我們只能進行驗證而不能產生。所以公開金鑰可以放心的發放給所有的使用者進行驗證,而私密金鑰卻不能。所以在發行的版本中可以附帶公開金鑰和驗證演算法。因為即便使用者得到了公開金鑰和驗證演算法也無法簡單的破解。

現在網路上流行的註冊機,很大程度上是破解了軟體的私密金鑰,從而達到無限制的產生所需要的註冊資訊。但是如果使用者反編譯你的產品,並且修改了中間代碼,那麼它將會繞過註冊的判斷邏輯。這就不是這一篇所能解決的問題了。因為即是你使用了Web Service技術進行線上啟用或註冊,還是可以通過網路偵聽來分析伺服器的資訊,類比一個假的伺服器來進行的。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。