我正在尝试在我制作的软件上设置许可系统。这个想法是客户端接收我的软件的副本,软件检查它的硬件ID或特定计算机的其他唯一标识符,然后使用公钥的非对称加密从该标识符生成激活码。然后客户端将激活码发送给我,我将其与我的私钥一起使用来创建签名,我将其发回给他,软件会确认它。它还会定期检查唯一标识符是否仍然正确。我希望我理解正确这部分。
从这个例子中复制,我在 VB 中编写了一个基本代码,用于创建签名(应该在我的计算机上完成(和检查签名(在客户端计算机上完成(:
Function RSAoperations(hardwareID As String)
Dim hashValue() As Byte = Encoding.UTF8.GetBytes(hardwareID)
Dim sha256 As SHA256 = SHA256Managed.Create()
Dim hash() As Byte = sha256.ComputeHash(hashValue)
Dim RSA As New RSACryptoServiceProvider()
'create signature
Dim RSAFormatter As New RSAPKCS1SignatureFormatter(RSA)
RSAFormatter.SetHashAlgorithm("SHA256")
Dim SignedHash() As Byte
SignedHash = RSAFormatter.CreateSignature(hash)
'check signature
Dim RSADeformatter = New RSAPKCS1SignatureDeformatter(RSA)
RSADeformatter.SetHashAlgorithm("SHA256")
If RSADeformatter.VerifySignature(hash, SignedHash) Then
Console.WriteLine("The signature was verified.")
Else
Console.WriteLine("The signature was not verified.")
End If
Dim Parameters As New RSAParameters
Parameters = RSA.ExportParameters(True)
'display the private key. Base64 encode the text to make display easier
Debug.Print("private key: " & Convert.ToBase64String(Parameters.D))
'display the public key. Base64 encode the text to make display easier
Debug.Print("public key: " & Convert.ToBase64String(Parameters.Modulus))
End Function
每次运行此函数时,将 RSA 显示为新的 RSACryptoServiceProvider(( 使用一组新的公钥和私钥创建新的 RSA 对象。但是,由于我想将公钥嵌入到客户端将收到的软件副本中,因此我需要以某种方式创建一对密钥一次,将它们写下来,并使RSA在客户端计算机上接受该预制公钥。正如我想象的那样,我必须在两台机器上创建该RSA对象,但告诉其中一台使用预制公钥,同时告诉另一台使用预制私钥。我多次浏览了 RSA API,但找不到与此类功能相关的任何方法。
我有一种感觉,我在某种程度上误解了整个过程以及我需要做什么来实现我的目标。有人可以帮我解决这个问题吗?我在互联网上发现了许多使用 RSA 的示例,但没有一个解释 RSA 密钥如何在两台机器之间共享。
让我试着分解你的问题以便理解。
- 您正在尝试创建基于 RSA 的许可,请执行以下步骤:
- 您正在获得一些详细信息(硬件 ID ...等(,从客户端计算机通过您的软件并创建一个 SHA256 哈希
- 然后使用 RSA 密钥对哈希进行签名(现在,这是问题所在。您可以使用预制的 RSA 密钥对对哈希进行签名,但只需将 RSA 公钥/私钥嵌入软件并使用嵌入式 RSA 私钥创建签名。
- (除了应用程序的公钥/私钥对外,还将另一个公钥嵌入到您持有私钥的应用程序中。
- 收到签名和哈希值后,您可以使用私钥再次验证并签名(您必须确保它的安全并假设它仅在您手中(。
- 一旦软件收到您的个人私钥签名哈希值,它就可以使用存储的RSA公钥验证哈希,并且可以根据需要继续运行。
我希望这个过程是清楚的。无需每次都创建新的密钥对,因为您将无法以明文形式传输/共享它们。否则,加密密钥对然后将它们发送到您的系统将是一个轻微的矫枉过正(不建议这样做,因为任何好的反向器都能够破解嵌入式密码。还有其他方法,但我不想用不同的想法来超载这个话题。
另外,下面的代码项目文章应该会让您对使用基于 RSA 的产品许可/激活方法等有一些想法。
https://www.codeproject.com/Articles/4940/Using-XML-Digital-Signatures-for-Application-Licen
https://www.codeproject.com/Articles/16506/Product-Activation-Based-on-RSA-Signatures
请注意,保护/许可与应用程序的二进制保护一样强大。如果可执行文件/程序中的嵌入式RSA公钥可以更改,则可以破坏许可方案。
我希望以上内容对您实现许可计划有所帮助。
如果我理解您的问题,您只需要在服务器上生成一次密钥对并安全地保留它。此外,您需要调用ExportParameters(False)
,序列化生成的 RSAParameter 对象,然后对字节进行 base64 编码以创建字符串。然后在客户端软件中对此字符串进行硬编码,并在运行客户端时反转该过程:base64-解码字符串,将字节反序列化为 RSAParameter 对象,创建 RSA 对象并运行 ImportParameters 方法导入公钥。
请注意,我并不是说您的计划是安全的,只是解释您需要执行哪些步骤才能执行它。要进行安全评估,您应该咨询专家并向他们提供完整的详细信息。