以可逆形式存储密码

17 php passwords storage

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

有没有人有任何建议可以安全地解决这个问题?

我想也许是PKI的凭证,并将结果存储在DB中.然后使用私钥解密(PHP可以这样做).存储脚本以在Web根目录外执行此操作.

任何想法都非常感激.

Law*_*Dol 23

首先,说明(希望)明显,如果你可以以任何方式避免存储用户名和密码这样做; 这是一项重大责任,如果您的凭据存储被破坏,它可能会为同一用户提供访问许多其他地方(由于密码共享).

其次,如果您必须使用不可逆的盐渍加密哈希来存储凭证,而不是存储密码,那么如果您的数据受到损害,则密码不能轻易地进行逆向工程,并且根本不需要存储解密密钥.

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

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

    userAndPass =(用户+ ":" +传);
    encryptInit();
    加密(盐);
    加密(userAndPass);
    密文= encryptFinal();

    并存储奇异的blob,这样就可以减少短密码文本的出现,这些密文更易于破解,用户名还可以进一步密码.

PS:我不用PHP编程,因此无法在该环境中评论合适的加密s/w.


Fly*_*wat 15

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

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

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

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

http://phpsec.org/library/

  • 值得大喊大叫. (3认同)