我正在使用C#编程系统。我的程序生成一个我想要存储在硬盘上的小消息(文件的哈希摘要) - 但我不希望用户能够读取它。我打算加密这条消息,但有人建议这是一个不好的想法。
所以我正在寻找替代方案 - 你如何保护完全信任的用户的一些秘密信息?
答案 0 :(得分:29)
退后一步;你有一个解决方案,从根本上不适用于你所遇到的问题。而不是试图锤击它直到它工作,停止,退后一步,并解决真正的问题。
涉及真钱的安全问题是一些最难解决的问题;坏人有一个真正的金融动机来攻击你的系统。对于这些类型的事情,多管齐下的方法通常是最好的。
首先,编写威胁模型:
一旦了解了资源,威胁和漏洞,就会开始考虑缓解这些威胁。为每项缓解措施分配成本和有效性。
例如:
好的,既然我知道攻击是什么,我就可以开始考虑减轻症状了:
这些费用正在增加。最终,缓解的成本大于资源的损失,花钱是没有意义的。
还有一些方法可以将缓解成本外部化:
在用户计算机上加密包含用户数据的文件并不能减轻任何攻击。弄清楚攻击是什么以及实际减轻它们的影响,包括在攻击者身上搜集联邦政策等选项,然后实施一个实际缓解漏洞并消除威胁的系统。
你建议的缓解措施是:给小偷钥匙,并要求小偷在他试图偷电视之前锁上窗户。这不是缓解漏洞。 没有涉及将密钥交给小偷的提案是缓解解锁窗口漏洞,因此请停止尝试查找。
有关威胁建模的更多“软件”重点示例,请参阅:
http://www.owasp.org/index.php/Threat_Risk_Modeling
http://msdn.microsoft.com/en-us/library/aa302419.aspx
等等;你可以在网上找到很多关于我们如何在微软进行威胁建模的东西。
最后:
说真的,你正在咬掉软件实施中最困难的工作之一,其中小错误的后果会产生重大的财务影响。将您的实施预算花在具有该领域专业知识的顶尖专家顾问身上,可以帮助您找到制定安全解决方案所需的现成和定制部件。滚动自己的安全系统可能听起来既有趣又便宜;它既不是。把这种事情留给那些在职业生涯中学习这个空间的人。
答案 1 :(得分:7)
我的程序会生成一条我想要存储在硬盘上的小消息(文件的哈希摘要) - 但我不希望用户能够阅读它。
用户可以完全控制他们的机器。如果您的软件可以读取它,那么用户也可以通过一点点努力来阅读它。
不要与客户打一场失败的战斗,最好接受“这是用户机器,而不是我的机器”并且不要过分烦恼 - 只需Base64对其进行编码即可。
为什么你还需要阻止用户阅读哈希摘要?
答案 2 :(得分:6)
这是DRM问题,无法完成。通过提出新的和新颖的方法来混淆数据,你可以使它变得非常不方便和令人沮丧,但是当加密和解密的机器都在一个系统中作为“敌人”托管时,认为可以保护数据是一个根本上有缺陷的想法。 “完全控制。
答案 3 :(得分:2)
没有。这不可能。如果此人具有对该计算机的物理/完全访问权限,则无法在不加密的情况下保护其上的硬盘。
我能看到的唯一方法是将此消息存储在用户无权访问的远程服务器上。
答案 4 :(得分:2)
如果文本的另一半不能靠近用户的计算机,那么文本就没有任何用处。
换句话说:将价值从秘密中移除,所以它不再是秘密,客户也无权获得它。
如果你不能,你可能在设计你的应用程序时犯了一个错误,并试图找到一种廉价的解决方法。但是有no free lunch。同样,在这种情况下,安全性是平衡可用性,实施难度和秘密价值的另一个例子。
如果您仍想这样做,请不要依赖单一技术。使用many:使用存储在内存中并从存储库中获取的公钥加密磁盘上的数据;不要将数据作为“明文”存储在内存中,而是阻止加密;经常洗牌;混淆使用,模式,延迟等。
看看如何实现skype:通过代码混淆,调试检测(在可执行文件上运行调试器,执行路径发生变化),以及取消实现的实际值。即使你了解skype如何工作,它已经是一个标准;如果你想对它进行逆向工程以使你的软件“与skype一起工作”,那么,他们永远不会授权你使用他们的品牌。
答案 5 :(得分:2)
在另一个答案的评论中,你写道:
尝试制作某个日志 文件防篡改。
如果确实如此,那么也许你应该采取不同的方法并将日志文件移动到用户不完全信任的地方(即:其他系统)。
否则,您无法保证文件的安全性(正如其他人所提到的那样)。