背景: 我想保护我的软件免受破解,我使用VMProtect,但因为VMP无法保护内存搜索和修改。我的RSA公钥存在被更改或发现的风险。
在这种情况下。因为我的软件基于Web许可。如果发现了公钥。 cracker将能够解密来自服务器的数据并找出我的许可证格式。如果破解者修改公钥,并使用自己的私钥托管新服务器,然后将DNS更改为该服务器,则软件将被破解。
问题:
在这种情况下。永远不要发布公钥,在OPENSSL中,我的RSA Key格式存在很大问题。它总是这样:
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALrBdN8F83hT2+pBsAwiNx+v3FWp51IdEElE8UvVhfZYmePbitpzLcJi
jZ4/tvRFXJGhqa3PKPUQkH2F4VrHruA2kNceiL/Btywc9oM+tDMeX1jcRKwXwK1k
KdccKwn0qywG6YxQuqWQIotOfV+IIuhcHdaHBl6CZ05/cBo6AlMlAgMBAAE=
-----END RSA PUBLIC KEY-----
或者这个:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDw==
在任何一种情况下,密钥都有清晰的格式,破解者只能搜索字符串,他们会发现我的公钥太容易了。
无论如何都要生成没有格式的RSA公钥,例如:
1.在制作格式的RSA密钥之前或之后没有字符串。(没有像BEGIN等等的东西等等等等等等等等等等)
2.不是基于字符串的键:如果它可能,基于字节将是完美的(键不是字符串而是十六进制,如:0x12,0xDA,0x77,...)
3.如果可能,请避免使用密钥使用特定长度:如果有时生成并获得长度为98字节的密钥,有时会生成并获得137字节长的密钥等,这将是完美的
所以如果我能拥有这样的公钥,即使它在内存中,黑客也永远无法找到密钥的位置。但我无法找到OPENSSL有关于此的任何文档。
无论如何,我能做到吗?答案 0 :(得分:2)
这个问题没有确切的解决方案。你可以隐藏公钥,私钥或其他任何你想要的东西,并且总会有一种方法来逆向工程"这个。无论如何,你总是可以被破解。
然后问题转向: HOW MUCH efford你想花费隐藏你的信息来让那个逆向工程师尽可能地为一个饼干困难吗?
然后,你有很多解决方案。我建议您查找混淆器和/或白盒加密 [如果您准备花一些钱用于您的应用程序]。这些是用于隐藏信息并使破解者的生活更加艰难的常用技术。
答案 1 :(得分:1)
您可以做的最简单的事情是将密钥从PEM转换为DER格式,OpenSSL工具也支持这种格式。大多数情况下,您需要添加另一个参数才能使其接受。
DER是一种二进制格式,所以没有任何线索,它看起来像二进制乱码。但当然它有内部结构(ASN.1)。
PEM是Base64编码的DER,添加了诸如-----BEGIN RSA PUBLIC KEY-----
行之类的分隔符。