当客户向我的服务器索取许可证时,我正在制作一个许可系统,如果他们被允许拥有许可证,我会向他们发送许可证。
在我当前的系统上,我使用单个私钥加密许可证,并将公钥嵌入到他们用来解密许可证的客户端应用程序中。有用!
其他人告诉我,我应该使用服务器上的公钥加密并将私钥分发给客户端。我在网上搜索过,可以看到有时他们使用私钥加密,有时他们使用公钥加密。
在这种情况下,我该怎么办?
当客户向我的服务器索取许可证时,我正在制作一个许可系统,如果他们被允许拥有许可证,我会向他们发送许可证。
在我当前的系统上,我使用单个私钥加密许可证,并将公钥嵌入到他们用来解密许可证的客户端应用程序中。有用!
其他人告诉我,我应该使用服务器上的公钥加密并将私钥分发给客户端。我在网上搜索过,可以看到有时他们使用私钥加密,有时他们使用公钥加密。
在这种情况下,我该怎么办?
其他人告诉我,我应该使用服务器上的公钥加密并将私钥分发给客户端。
那些人是错的。名称私钥意味着它是私有的,意味着只有您才能访问它。
在这种情况下,我该怎么办?
使用数字签名。使用您的私钥签署许可证文件,并在您的应用程序中使用您的公钥来验证许可证上的签名是否来自您。
恭喜,您刚刚发明了 RSA 签名。(无论如何,你应该使用哪个。)要与公钥系统通信,你需要使用一次私钥和一次公钥,但 RSA 支持两种不同的顺序:1)用公钥加密,解密with the private:接收者对消息的来源一无所知,但发送者知道只有接收者(私钥的持有者)才能阅读它。这是经典的“加密”。2)用私钥“加密”,然后用公众“解密”。这是一个数字签名,并提供身份验证。任何人都可以阅读该消息,但只有私钥持有者可以发送该消息。
假设您的许可证是为客户端定制的(这可能就像包含客户端生成的随机数的副本一样简单),那么它对其他人无用,但客户端可以确定服务器发送了它。
对称性在实践中并不那么整洁。不同的操作模式有不同的弱点和陷阱,所以实现通常有很大的不同,但这是一般的想法。
密码学的第一个也是最重要的课程之一是了解身份验证以及何时使用它。它的需要至少与加密一样频繁,并且不知道何时使用它会使您在Midvale School 中遇到天才的情况。
如果您正在加密只能由单个收件人读取的内容,那么您使用该收件人的公钥加密,他们使用他们的私钥来读取它。
如果您正在为多个收件人加密,那么您可以使用您的私钥加密并将您的公钥分发给您希望能够读取它的人。这通常被称为“签名”,因为任何有权访问您的公钥的人都可以阅读它,因此这并不是一种真正的私人通信形式。
对您来说,一个更强大的整体解决方案是让您的应用程序在每次安装时生成一个密钥对,将它生成的公钥发送回服务器,然后您将使用它来加密,以便只有单个安装可以使用该许可证您创建(通过使用其私钥对其进行解密)。
至少在典型的公钥加密算法(例如,RSA)中,公钥和私钥之间并没有真正的重大区别。生成密钥时,您将获得两个密钥。您将其中一个保密并发布另一个 - 但您发布哪一个以及您将哪个保密并不重要。
你用一个密钥加密的任何东西都可以用另一个密钥解密。出于正常目的,您发布一个密钥,它允许任何人加密只有您可以解密的内容。从技术的角度来看,相反的工作很好:如果你用你的私钥加密了一些东西,任何拥有公钥的人都可以解密它。这通常用于签名验证之类的事情(即,任何拥有公钥的人都可以验证必须使用私钥创建签名)。不过,您通常希望使用单独的密钥对进行加密和签名。
对于您的情况,对于您真正要完成的工作存在一些问题。您当然可以加密使用该程序所需的一些数据,因此用户需要密钥来解密它并使用该程序——但如果用户愿意将代码的副本提供给未经授权的人,他们可能不会犹豫是否也将密钥副本提供给他们。因此,即使加密/解密可以完成它的工作,它也不太可能提供任何真正的保护。
更典型的许可方案与特定 IP 地址之类的东西相关联,因此您执行诸如加密 IP 地址之类的操作,然后使用结果作为密钥来解密使用该程序所需的数据。如果 IP 地址错误,则无法正确解密数据,程序将无法运行。只要用户有一个静态 IP 地址,它就可以很好地工作——但会导致与 DHCP 结合使用的问题。
我的直接建议是根本不要这样做。如果您仍然坚持这样做,请不要自己动手——让FlexNet之类的东西为您处理。没有它你会过得更好,但至少这样你会得到一些有用的东西,而且你不会浪费时间和精力来实现更好的目的,比如改进你的软件。
如果您使用公私(非对称)加密,您始终使用收件人的公钥进行加密,收件人使用他们的私钥解密。对于数字签名,您使用您的私钥签名,而收件人使用他们的公钥验证签名。
那么问题来了,你如何制作一个安全的 DRM 系统?如果您使用加密,并为收件人提供私钥,他们可以分发密钥或解密的内容。如果你使用签名,他们可以简单地去掉你程序的签名验证部分。
答案是不可能的。DRM 的概念存在根本缺陷。
希望来自维基百科的这个链接有所帮助。PKI建立在相互信任的基础上。但是,私钥必须由所有者保护。顾名思义,公共对所有人开放。制作整个架构是为了帮助您解决上述问题中定义的场景。