我正在使用Java客户端/服务器应用程序。每个用户都必须能够通过客户端应用程序(使用数字签名标记它们)或手动(使用99.99999%的错误签名标记它们)来创建和修改文件(包含一些敏感数据)。签名不使用客户端身份,仅使用文件的内容,这意味着两个遥远的客户端创建完全相同的文件将最终得到两个签名完全相同的文件。
经过正反两方面的考虑,我最终想到了使用混淆来保护免受恶意用户攻击,而不是使用逆向工程来找到为给定文件提供数字签名的算法。
但是,如果我理解正确的话,混淆会使代码更难为人类阅读,更难以理解,但是我的目标更多是将算法隐藏在数字签名之后。关于如何制作的任何想法:
目前我的想法是:
我也不确定要了解编译和逆向工程的工作原理。
在编译代码时,我曾经以为变量在“ method area”中被昵称,而反向工程将带给我们带有变量a,b,c等的代码。但是似乎并非如此,我现在考虑一下,因为在Java中可以进行反射,所以我就在最后一部分吗?
最后,我不确定是否会阻止用户反转我的代码(变量名除外)。
答案 0 :(得分:1)
我最终想到的是,比起使用逆向工程来找到为给定文件提供数字签名的算法,使用混淆来保护免受恶意用户的攻击。</ p>
我认为这是错误的,原因如下。
鉴于当前的密码学“最先进”技术,有一些众所周知的密码哈希函数被认为足以逆向工程。您可以在此处了解一些常见的信息:
您可以将加密哈希函数与公钥加密结合使用,以提供(应该)对您的用例足够安全的数字签名。例如:
这些技术可用于Java的可靠实现。无需自己实施。
设计和实现自己的数字签名算法是不明智的。除非您是密码学的专家,否则您的算法可能会存在您没有意识到的弱点。而且您是专家,您将完全了解创建强大系统的困难。
混淆并不能防止逆向工程从代码中提取秘密(例如算法)。的确,对于Java而言,对于熟练的黑客来说,这不过是“减速”。
好吧,我只是在努力理解我的应用程序如何能够确定“ a”的签名等于某个单词,而用户却无法在互联网上找到相同的算法来做完全相同的事情并找到相同的签名。
您有意思。如果您知道要为其创建哈希的“文本”非常短和/或易于“猜测”,则假定算法已知,则可以对其进行哈希暴力破解。 (例如,Gravatar将电子邮件地址的哈希值用于隐私的方法是有缺陷的,因为它不难汇编已知电子邮件地址的列表,生成其哈希值并将其存储在可以查询的数据库中。)
但是,一旦获得了几十个随机字节的数据或几十个文本的文本,强力攻击(和彩虹表)就变得不切实际。因此,您可以从文档开始,添加带有时间戳的“信封”,其他标识信息,以及(如有必要)添加一些随机垃圾来填充源文本。然后哈希很多。另一端只需要重复该过程,看看它们是否获得相同的哈希值即可。
(要创建完整的数字签名,您还需要做更多的事情……但是请阅读上面的链接。)
答案 1 :(得分:0)
让我们澄清您对混淆的误解:
最重要的是:“默默无闻的安全性”很少起作用。
如果您真的很想在客户端运行代码(您无法对其进行控制),那么最好在本机代码中执行该部分,并为该部分提供计算机编译的二进制文件。