我制作了一个小程序,允许我以加密形式向用户发送许可证。
目前我有
- 加密我的 AES 密钥的 RSA 私钥
- 加密数据的单个 AES/CBC 密钥
- 一个 RSA 公钥
AES 和公钥都被硬编码到设备上。
当请求许可证时,我应该如何处理 IV,我应该在设备上创建一个静态的,还是在我创建的每个新许可证时发送一个新的?
我制作了一个小程序,允许我以加密形式向用户发送许可证。
目前我有
AES 和公钥都被硬编码到设备上。
当请求许可证时,我应该如何处理 IV,我应该在设备上创建一个静态的,还是在我创建的每个新许可证时发送一个新的?
这个提议是不是很傻?
您应该使用 RSA 公钥而不是私钥进行加密。如果您按照您的建议使用私钥进行加密,那么有权访问公钥的每个人都将学习 AES 密钥,并且能够解密或伪造任何东西。当然,出于同样的原因,您也不应该对不同的接收器使用相同的 AES 密钥。
为了回答这个问题,您应该为每个 AES/CBC 加密使用一个新的随机 IV。
如果我了解您要做什么,那么与大多数许可方案一样,它基本上是一个DRM方案。我只会解决密码学问题,但当然还有与黑客玩捉迷藏的问题。您应该知道,没有任何DRM 方案在密码学意义上提供任何可衡量的安全性(除非可能涉及安全硬件),但它们仍然很常见,并且一些开发人员对它们背后的逻辑感到满意。
您要做的是生成许可证数据并包含一些信息,以防止用户简单地从合法用户那里复制有效的许可证文件。示例可能是 MAC 地址、电话号码等。然后您签署此数据。然后,许可证由未加密的许可证和签名字节组成。在用户端,您的安装软件将使用硬编码的公钥验证签名,并执行任何其他检查(mac 地址匹配、电话号码匹配等)。
这将是您方案的核心,对于大多数开发人员来说已经足够了。您可以使用此核心并使用 ad-hoc 进一步混淆它,包括加密、拆分等,具体取决于您希望在捉迷藏游戏中走多远。
编辑:
如果我可以提出一个建议,我认为《Beginning Cryptography With Java 》一书将是一项明智的投资。它包括使用 Bouncycastle 库的示例。您可以从同一网站免费下载示例。