首先,说明(希望)显而易见的是,如果可以任何方式避免存储用户名和密码这样做;这是一个很大的责任,如果您的凭据存储被破坏,它可能会为同一用户提供访问许多其他地方(由于密码共享)。
第二,如果您必须存储凭据,而不是使用不可逆的,加密的密码散列来存储密码,那么如果您的数据受到威胁,则密码不能轻易被逆向设计,并且根本不需要存储解密密钥。
如果您必须存储可解密凭据:
>选择一个很好的加密算法 – AES-256,3DES(注明日期)或公钥密码(尽管我认为这是不必要的)。使用来自信誉良好的源代码的加密软件 – 不要尝试滚动您自己,您会误以为是错误的。
>使用安全的随机生成器来生成你的密钥。弱随机性是加密相关安全失败的首要原因,而不是加密算法。
>将加密/解密密钥与您的数据库分开存储在O / S安全文件中,只能在应用程序运行时配置文件中访问。这样,如果您的数据库被破坏(例如通过SQL注入),则您的密钥不会自动受到攻击,因为这将需要访问硬盘。如果您的O / S支持与配置文件相关联的文件加密,请使用它 – 它只能帮助您,并且通常是透明的(例如NTFS加密)。
>如果可行,请存储使用主密码加密的密钥。这通常意味着你的应用程序。将需要在启动时键入的密码 – 在脚本的参数中提供该密码并不好,因为如果您的硬盘被破坏,您必须假定可以查看密钥文件和脚本。
>对于每个凭证集,存储盐(未加密)以及加密数据;这用于“加密”加密密码,使得两个相同的密码不会产生相同的密文 – 因为这样做会导致密码相同。
>如果用户名不需要找到帐户记录(在你的情况下不是这样),请加密用户名和密码。如果您加密两者,则将其加密为一个加密运行,例如
userAndPass =(用户“:”pass);
encryptInit();
加密(盐);
加密(userAndPass);
密文= encryptFinal();
并存储单个blob,使得发生较短的密码文本,这更容易中断,用户名进一步使密码失效。
PS:我不用PHP编程,所以不能在那个环境中评论合适的加密s / w。