首先,要说明(希望)显而易见的,如果您可以以任何方式避免存储用户名和密码,请这样做;这是一个很大的责任,如果您的凭据存储被破坏,它可能会为相同的用户提供对许多其他位置的访问(由于密码共享)。
其次,如果您必须存储凭据,则最好选择使用不可逆的盐渍加密哈希来存储密码,因此,如果您的数据受到损害,密码就不容易进行反向工程,并且根本不需要存储解密密钥。
如果必须存储可解密的凭据:
- 选择一个好的加密算法 - AES-256,3DES(过时)或公钥密码(尽管我认为这对于此用途是不必要的)。使用来自信誉良好的可靠来源的加密软件 - 不要尝试滚动自己的软件,您可能会弄错。
- 使用安全的随机生成器生成密钥。弱随机性是加密相关安全故障的头号原因,而不是密码算法。
- 将加密/解密密钥与数据库分开存储在 O/S 安全文件中,该文件只能由应用程序运行时配置文件访问。这样,如果您的数据库被破坏(例如通过SQL注入),您的密钥不会自动受到攻击,因为这通常需要访问HDD。如果您的 O/S 支持绑定到配置文件的文件加密,请使用它 - 它只能提供帮助,并且通常是透明的(例如 NTFS 加密)。
- 如果可行,请使用主密码存储密钥本身。这通常意味着您的应用程序将需要在启动时键入该密码 - 从脚本中提供该密码是没有用的,因为如果您的HDD被破坏,您必须假设密钥文件和脚本都可以查看。
- 对于每个凭据集,将盐(未加密)与加密数据一起存储;这用于“定用”加密密码,使得两个相同的密码不会产生相同的密码文本 - 因为这会泄露密码是相同的。
-
如果找不到帐户记录不需要用户名(在您的情况下不是),请同时加密用户名和密码。如果同时加密两者,请将它们加密为一次加密运行,例如
userAndPass=(user+“:”+pass);
encryptInit();
加密(盐);
encrypt(userAndPass);
cipherText=encryptFinal();
并存储单数blob,以便减少短密文的发生,这些短密文更容易破解,并且用户名进一步限制了密码。
PS:我不用PHP编程,所以不能在那个环境中评论合适的加密软件。