在我的应用程序中,我需要读取随应用程序一起分发的加密文件.我还需要使用密码连接到下载服务.我的难题是存储这些资源的密码?在其他语言中,例如C,我只是将它们存储在代码中.但是,由于有些工具可以反汇编C#,例如JetBrains DotPeek,这是不安全的.
以下是我到目前为止所考虑的解决方案,但我不认为它们中的任何一个都是安全的:
>将密码存储在代码中:不好,因为C#可以被反汇编.
>将密码存储在加密的外部资源中:不好,因为那时你需要存储密码!
>询问用户首次使用时的密码(通过其他方式告知用户):我认为没有好处,因为您是否还需要将其存储起来供以后使用?
>将它们存储在C dll中:没有好处,因为什么是阻止其他人调用该DLL中的函数?
>隐藏和加密代码中的密码:例如,不要将其称为密码并使用多个级别对其进行加密.这将使那些只是文本搜索代码的人很难,但不会阻止有人准备调试程序以了解如何访问资源.不好.
>模糊代码库以防止反汇编:可能这可能有用.它安全吗?有没有人这样做?
这个非常典型的问题的正常解决方案是什么?
最佳答案 注意:如果您希望100%脱机完成身份验证,则没有真正安全的方法,因为有权访问计算机的人可以访问所有内容.
首先,cpp可以按照this SO answer进行反编译.这只是丑陋的地狱.
为什么不使用存储散列密码的数据库呢?当用户想要读取文件或从服务下载时,您要求他输入密码,然后对其进行散列并将其与存储在数据库中的散列版本进行匹配.匹配当然可以通过安全协议完成.
这是关于ASP.NET auth的tutorial.您可以阅读它只是为了了解它们存储密码并匹配它的方式.
请记住,混淆/多级加密不会阻止某人真正决定.
您的帖子中根本没有提到我的答案.你不喜欢这种方法还是没有想到它?
编辑:关于文件,因为不允许用户解密它,你可以在数据库中存储另一个“密钥”.当用户使用其密码进行身份验证时,您将从数据库中检索密钥并解密该文件.这样,用户永远不会看到该文件的密钥.
根据VytautasPlečkaitis的建议:您可以使用应用程序的has作为身份验证令牌从数据库中检索文件的密码.从用户友好的角度来看,这个想法是好的,因为它允许用户不必提供任何密码,但这意味着数据库的“密钥”对于您的应用程序的每个实例都是相同的(破解它一次,你破解他们所有).此外,这意味着要获得应用程序的密钥所有你需要做的就是得到执行exe的哈希…我是一个安全专家(甚至不接近那个)所以我不知道这是多么安全但我不确定这是最好的主意.
对我来说,密码/哈希/数据库模式是最好的,特别是因为它多年来一直被使用.这是.NET Core身份验证的内置方法