C++ 如何在应用程序中安全地处理密码

C++ 如何在应用程序中安全地处理密码,c++,security,passwords,C++,Security,Passwords,我在这里发现了一个类似的问题,但它并没有真正回答我的担忧 我正在处理一个将从用户处(安全地)接收密码的应用程序。一旦收到密码,我需要将其存储在某个变量中,并通过事务将其发送到其他系统(此逻辑是安全的,并且已经实现) 我担心的是,我不想在核心转储中看到密码,所以我希望在将任何密码保存到任何变量之前对其进行加密 问题: 在将其保存到变量之前对其进行加密是否足够?还是我漏掉了一些安全漏洞 是否有一个简单的只头库可以进行加密?你能告诉我从哪里开始找吗 回答评论的注意事项: 密码不会长期保存;仅适用

我在这里发现了一个类似的问题,但它并没有真正回答我的担忧

我正在处理一个将从用户处(安全地)接收密码的应用程序。一旦收到密码,我需要将其存储在某个变量中,并通过事务将其发送到其他系统(此逻辑是安全的,并且已经实现)

我担心的是,我不想在核心转储中看到密码,所以我希望在将任何密码保存到任何变量之前对其进行加密

问题:

  • 在将其保存到变量之前对其进行加密是否足够?还是我漏掉了一些安全漏洞

  • 是否有一个简单的只头库可以进行加密?你能告诉我从哪里开始找吗

回答评论的注意事项:

  • 密码不会长期保存;仅适用于事务的生命周期

  • 不幸的是,交易的参与者无法解密密码,因此我需要在发送给他们之前解密密码

  • 我现在主要关心的是找到一种在本地加密和解密密码的方法-以一种简单的方式

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

谢谢,

(注意:我确信对于如何在安全软件中处理密码,有严格的检查表和官方指导原则,来自真正了解安全性的人员和机构。这不是其中之一!)

我不认为有一种加密安全的方法可以在进程内存中保存密码,能够使用它们,但不允许用户在调试器下运行应用程序或检查核心转储

你能做的就是隐藏密码。以下是您可以使用的一些技巧:

  • 不要将密码作为简单字符串保存在内存中的任何位置(分散字符等)
  • 使用密码后,清除存储在其中的所有变量(例如,如果将密码传递给函数,则应在使用该变量后将其所有字符设置为NUL)
  • 加密密码
  • 每次运行应用程序时(如果是长期运行的应用程序,则定期)更改加密密钥
  • 根据系统/硬件的某些方面按程序生成加密密钥,不要将密码的加密密钥存储在进程内存中的任何位置
  • 如果可用,请使用可信平台模块(TPM)等硬件
一致而有效地实现上述内容是相当困难的,并且会影响所有处理密码的代码。有时,你甚至不得不故意使代码更加晦涩,违背你作为程序员的所有本能(例如,不将密码作为参数传递给函数,而是在函数内部使用硬编码地址。)

一、 再次强调,当对手完全可以访问物理机器时,仅用软件保护您的密码可能是不可能的


至于你问题的第二部分,我不知道有哪种只有头的加密库,但加密密码可能只需要一个密码,也可能需要一个散列。所有最好的算法都有公共域或其他免费的实现。你可以获得其中一个,然后复制/粘贴到你自己的应用程序中。不要不过,还是认真测试一下吧!

如果加密例程失败,您将看到密码:)但是,有一些特定于平台的方法可以真正实现0-out内存,因此您可以在不再需要密码时使用这些方法从内存中清除密码…当然,如果您想解密密码,您可能会访问必要的资源。您是否计划将密码存储为“长期”或“短期”(长期而言,将其存储在磁盘上某个位置的文件中,短期而言,您接收到密码,然后将其发送到另一台服务器,只要您需要发送密码,就可以一直保存该密码)?任何“长期”存储都是可破坏的。这就是为什么“正确”的密码存储是在“单向加密”中完成的,因此您永远无法“反向加密”它[当然,在匹配之前,仍然可以“在许多可能的猜测上运行加密”]。如果有人可以访问转储中您的加密密码和加密/解密,那么他们解密您的加密密码就相当简单了。保持密码安全和受保护的最佳方法是根本不保留密码。因此,您必须决定您可以合理地使窥探者查找和反向处理密码的难度有多大我们对密码的保护。我已经更新了问题。@StarPilot我理解您的担忧,但我想这是我必须承担的风险,因为我需要在我的应用程序中加密和解密。您可以静态链接到openssl或crypto++