1
40
基本上,任何有权访问您的程序和调试器的人 可以 和 将 如果他们愿意,可以在应用程序中找到密钥。
但是,如果你只是想确保在运行时钥匙不会出现
用XOR隐藏键 例如,可以使用XOR将键拆分为两个字节数组:
如果创建的key1的字节长度与
您可以在构建环境中执行此操作,然后只存储
保护二进制文件 另一种方法是使用工具来保护二进制文件。例如,有几个安全工具可以确保您的二进制文件是模糊的,并启动运行它的虚拟机。这使得调试非常困难,同时也是许多商业级安全应用程序(也就是恶意软件)受到保护的方便方式。 首要工具之一是 Themida 在保护二进制文件方面做得非常好。它经常被著名的程序使用,例如spotify,以防止逆向工程。它具有防止在Ollydbg和IDA Pro等程序中进行调试的功能。
还有一个更大的列表,可能有些过时
tools to protect your binary
.
密码匹配 这里有人讨论了哈希密码+salt。 如果需要存储密钥以将其与某种用户提交的密码相匹配,则应使用单向散列函数,最好是将用户名、密码和salt组合在一起。不过,问题在于应用程序必须知道salt才能进行单向操作并比较得到的哈希值。因此,您仍然需要将盐存储在应用程序的某个地方。但是,正如@edward在下面的评论中指出的那样,这将有效地防止使用彩虹表等字典攻击。 最后,您可以使用上述所有技术的组合。 |
2
7
首先,要意识到,没有什么可以阻止一个足够坚定的黑客,而且周围有很多这样的黑客。每一个游戏和控制台的保护最终都被破解了,所以这只是暂时的修复。 你可以做4件事来增加你隐藏一段时间的机会。 1)以某种方式隐藏字符串的元素——像xoring(操作符^这样明显的东西——使用另一个字符串的字符串足够好,使字符串无法搜索。 2)将字符串拆分为多个部分——将字符串拆分,并将其中的一些位弹出到奇怪模块中的同名方法中。不要使搜索和查找包含字符串的方法变得容易。当然,有些方法必须调用所有这些位,但它仍然使调用变得更困难。 3)永远不要在内存中构建字符串——大多数黑客使用的工具可以让他们在编码后看到内存中的字符串。如果可能,请避免这样做。例如,如果要将密钥发送到服务器,请逐个发送,这样整个字符串就永远不会出现。当然,如果您使用的是类似于RSA编码的代码,那么这就更加棘手了。 4)做一个特别的算法——最重要的是,添加一两个独特的扭曲。可能只需在你生产的每件产品中添加1,或者进行两次加密,或者添加一个糖。这只会让那些已经知道当有人在使用什么的黑客更加困难,例如普通的MD5哈希或RSA加密。 最重要的是,确保在发现您的密钥的时候(如果您的应用程序足够流行的话,这一点也不会太重要)! |
3
5
我过去使用的一种策略是创建一个看似随机的字符数组。首先插入,然后使用代数过程定位特定字符,从0到n的每一步都将生成数组的数字<大小,该数组包含模糊字符串中的下一个字符。(这个答案现在感觉模糊了!) 例子: 给定一个字符数组(数字和破折号仅供参考)
前六个结果是:3,6,7,10,21,47的方程 会说出“你好!”从上面的数组。 |
4
4
我同意@checkers,您的可执行文件可以进行反向工程。 更好的方法是动态地创建它,例如:
|
5
4
我已经为字符串创建了一个简单的加密工具,它可以自动生成加密的字符串,并有一些额外的选项,例如: 作为全局变量的字符串:
作为带解密循环的Unicode字符串:
作为全局变量的字符串:
|
6
3
当然,将私有数据存储在发送给用户的软件中总是一个风险。任何受过足够教育(并且有奉献精神)的工程师都可以对数据进行逆向工程。 也就是说,你可以通过提高人们披露你的私人数据所需要克服的障碍,使事情足够安全。这通常是一个很好的妥协。 在您的例子中,您可以使用不可打印的数据使字符串混乱,然后在运行时使用简单的助手函数对其进行解码,如下所示:
|
7
2
有点依赖于你想要保护的东西,如乔什佩里指出的。 根据经验,我想说,如果它是某个许可计划的一部分,以保护您的软件,那么不要麻烦。他们最终会对其进行逆向工程。只需使用像rot-13这样的简单密码就可以保护它不受简单攻击(在它上面运行字符串)。 如果要保护用户的敏感数据,我会质疑使用本地存储的私钥保护该数据是否明智。这又归结到你想要保护的东西。 编辑:如果你打算这样做,那么克里斯指出的技术组合将远远优于ROT13。 |
8
2
如前所述,没有办法完全保护你的绳子。但有一些方法可以保护它,以确保合理的安全。 当我必须这样做的时候,我确实在代码中放了一些看起来无辜的字符串(例如,版权声明,或者一些伪造的用户提示,或者其他任何不会被修改无关代码的人更改的内容),加密了它,将它本身作为一个密钥,散列了它(添加了一些salt),并将结果作为一个密钥来加密我真正想要加密的内容。Rypt. 当然,这是可以被黑客攻击的,但要做到这一点需要一个坚定的黑客。 |
9
1
您可能不想在可执行文件中存储私钥,而是希望从用户那里请求并通过外部方式存储它。 password manager 类似于Mac OS X钥匙链访问。 |
10
1
如果您使用的是Windows用户DPAPI, http://msdn.microsoft.com/en-us/library/ms995355.aspx 如前一篇文章所说,如果你在Mac上,使用钥匙链。 基本上,从安全性的角度来看,所有关于如何将您的私钥存储在二进制文件中的可爱想法都非常糟糕,您不应该这样做。任何人拿到你的私人钥匙都是一件大事,不要把它藏在你的程序里。根据导入应用程序的方式,您可以将您的私人密钥保存在智能卡上、远程计算机上,或者您可以执行大多数人所做的操作,并将其保存在本地计算机上非常安全的位置(“密钥存储”类似于一个奇怪的安全注册表),该位置受权限和操作系统的所有功能保护。 这是一个已解决的问题,答案是不要将密钥保留在程序中:) |
11
1
尝试 this . 源代码解释了如何在给定的VisualStudioC++项目中对所有字符串进行加密和解密。 |
12
1
我最近尝试的一种方法是:
用于填充数据的宏: 假设私有数据为4字节。我们为它定义了一个宏,它用一些随机顺序的赋值指令保存数据。
现在在需要保存的代码中使用这个宏
|
13
0
上下文相关,但您可以只存储 搞砸 钥匙加上一个 盐 (常串,易模糊)。 然后,当(如果)用户输入密钥时,您添加 盐 ,计算 搞砸 并进行比较。 这个 盐 在这种情况下,它可能是不必要的,如果散列可以被隔离,它就停止了野蛮的字典攻击(谷歌搜索也被知道可以工作)。 黑客仍然只需要在某个地方插入JMP指令就可以绕过整个过程,但这比简单的文本搜索要复杂得多。 |
blackleader · 是否可以对Lua编译代码隐藏字符串? 6 年前 |
Jim Heising · 在Presto查询中加密/模糊结果的想法? 7 年前 |
Jinesh Francis · Proguard模糊注释 7 年前 |
Jensej · Javascript哈希/转换函数名 7 年前 |
Enes · 如何混淆project IOS中的所有代码 7 年前 |
Vanpourix · 循环混淆许多android应用程序 7 年前 |
Danijel · 如何保护C++动态库不被未经许可使用? 9 年前 |