如何在应用程序内安全地处理密码

6
我在这里找到了一个类似的问题:Saving passwords inside an application,但它并没有真正回答我的疑虑。
我正在处理一个应用程序,该应用程序将从用户那里(安全地)接收密码。一旦我收到密码,我需要将其存储在某个变量中,并通过事务将其发送到其他系统(此逻辑已经安全可靠且已实现)。
我的担忧是,我不想在核心转储中看到密码,因此我希望在将其保存到任何变量之前对任何密码进行加密。
问题:
  • 在将密码保存到变量之前进行加密是否足够?或者我错过了一些安全漏洞?

  • 是否有一些简单的头文件库可以进行加密?您能指导我开始寻找的地方吗?

回答评论者的注意事项:

  • 密码不会长期存储;仅限于事务的生命周期。

  • 不幸的是,事务参与者无法解密密码,因此我需要在将其发送给他们之前对其进行解密。

  • 我目前的主要关注点是找到一种在本地轻松加密和解密密码的方法...

  • 我找到了OpenSSL库和crypto++,但它们似乎需要链接,我不能只是包含并调用它们(即不是头文件库)...

谢谢,

如果加密程序失败,您将会看到密码:) 然而,有一些特定于平台的方法可以真正清空内存,因此您可以使用这些方法在不再需要密码时立即清除它们... 当然,如果您想要解密它,您可能会拥有必要的资源。 - Matthieu M.
你打算将密码“长期”存储还是“短期”存储(通过长期存储,将其存储在磁盘上的某个文件中,短期存储,则是在接收到密码后立即将其发送到其他服务器,只保留所需时间)?任何“长期”存储都是可破解的。这就是为什么“正确”的密码存储是采用“单向加密”,因此您永远无法“反向加密它”[当然,仍然可以“对许多可能的猜测运行加密”,直到匹配为止]。 - Mats Petersson
2
如果有人可以访问到你的加密密码和加密/解密方式,那么对于他们来说解密你的加密密码是相当容易的。保护密码最好的方法是根本不要保存它。因此,您必须决定如何合理地增加窥探者查找和反向处理您的密码保护措施的难度。 - StarPilot
我已经更新了问题。@StarPilot,我理解你的担忧,但我想这是我必须承担的风险,因为我需要在我的应用程序内进行加密和解密。 - Kam
你可以静态链接到 OpenSSL 或 Crypto++。 - Uroc327
显示剩余3条评论
1个回答

2
(注意:我相信有关如何在安全软件中处理密码的严格清单和官方指南,来自真正了解安全性的人和机构。这不是其中之一!)
我认为没有加密安全的方式可以在进程内存中保存密码,能够使用它们,但不允许用户在调试器下运行您的应用程序或检查核心转储时访问它。
你可以做的是使密码模糊不清。以下是一些可用的技术:
- 不要将密码作为简单字符串保存在内存中的任何位置(分散字符等)。 - 在使用变量存储密码后删除所有变量(例如,如果您将密码传递给函数,则应在函数内部完成后将该变量的所有字符设置为NUL)。 - 加密密码。 - 在每次运行应用程序时(或定期运行长时间运行的应用程序时)改变加密密钥。 - 基于系统/硬件的某个方面过程地生成加密密钥,并且不要在进程内存中的任何位置存储密码的加密密钥。 - 如果可用,请使用诸如Trusted Platform Module (TPM)之类的硬件。
实现上述方法需要始终如一地有效,而且会影响到处理密码的所有代码。有时,您甚至必须有意使代码更加模糊,并违背作为程序员的所有直觉(例如,不将密码作为参数传递给函数,而是在函数内部使用硬编码地址)。
我再次强调,在对手完全可以访问物理机器时,通过软件可能无法保护您的密码。
至于您问题的第二部分,我不知道有任何仅包含头文件的加密库,但是加密密码可能只需要一个密码和哈希函数。所有最佳算法都有公共领域或其他免费实现。您可以获得其中之一并将其复制/粘贴到自己的应用程序中。但不要忘记进行严格测试!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接