以可逆形式存储密码如果您实现自己的加密代码,您将失败。

2022-08-30 22:53:16

我有一个PHP应用程序,需要运行bash脚本,并提供用户名和密码(用于远程系统)。我需要将这些凭据存储在我的 PHP(Web) 应用可访问的位置。逻辑位置是数据库(目前是MySQL,但将是不可知的)。散列和存储凭据的“标准”方式的问题在于它是不可逆的。我必须能够将凭据作为未加密的明文提供,以便能够将数据插入bash脚本中。

有没有人对一种安全的方式有任何建议?

我想也许PKI凭据,并将结果存储在数据库中。然后使用私钥来解密(PHP可以做到这一点)。将脚本存储在 Web 根目录之外以执行此操作。

任何想法都非常感谢。


答案 1

首先,要说明(希望)显而易见的,如果您可以以任何方式避免存储用户名和密码,请这样做;这是一个很大的责任,如果您的凭据存储被破坏,它可能会为相同的用户提供对许多其他位置的访问(由于密码共享)。

其次,如果您必须存储凭据,则最好选择使用不可逆的盐渍加密哈希来存储密码,因此,如果您的数据受到损害,密码就不容易进行反向工程,并且根本不需要存储解密密钥。

如果必须存储可解密的凭据:

  1. 选择一个好的加密算法 - AES-256,3DES(过时)或公钥密码(尽管我认为这对于此用途是不必要的)。使用来自信誉良好的可靠来源的加密软件 - 不要尝试滚动自己的软件,您可能会弄错。
  2. 使用安全的随机生成器生成密钥。弱随机性是加密相关安全故障的头号原因,而不是密码算法。
  3. 将加密/解密密钥与数据库分开存储在 O/S 安全文件中,该文件只能由应用程序运行时配置文件访问。这样,如果您的数据库被破坏(例如通过SQL注入),您的密钥不会自动受到攻击,因为这通常需要访问HDD。如果您的 O/S 支持绑定到配置文件的文件加密,请使用它 - 它只能提供帮助,并且通常是透明的(例如 NTFS 加密)。
  4. 如果可行,请使用主密码存储密钥本身。这通常意味着您的应用程序将需要在启动时键入该密码 - 从脚本中提供该密码是没有用的,因为如果您的HDD被破坏,您必须假设密钥文件和脚本都可以查看。
  5. 对于每个凭据集,将(未加密)与加密数据一起存储;这用于“定用”加密密码,使得两个相同的密码不会产生相同的密码文本 - 因为这会泄露密码是相同的。
  6. 如果找不到帐户记录不需要用户名(在您的情况下不是),请同时加密用户名和密码。如果同时加密两者,请将它们加密为一次加密运行,例如

    userAndPass=(user+“:”+pass);
    encryptInit();
    加密(盐);
    encrypt(userAndPass);
    cipherText=encryptFinal();

    并存储单数blob,以便减少短密文的发生,这些短密文更容易破解,并且用户名进一步限制了密码。

PS:我不用PHP编程,所以不能在那个环境中评论合适的加密软件。


答案 2

您需要研究良好的双向加密方法,我的一般经验法则是:

如果您实现自己的加密代码,您将失败。

因此,找到一个经过充分验证的良好实现,并利用它。

这里可能有一些好的信息:

http://phpsec.org/library/


推荐