嗨,我正在开发一个与3方解决方案集成的PHP网站,我必须注册该API凭据才能为请求生成令牌。
我已经知道,将密码存储在数据库中最安全的方法是获取哈希值或对密码进行加密,但是在这种情况下,我需要使用明文形式的密码来生成令牌。
如何将该密码安全地存储在数据库或配置文件中?
如果我必须使用加密功能,如何存储盐以恢复密码?
主要是我需要以明文形式恢复密码,但是如果我的数据库遭到破坏,攻击者将无法恢复该密码。
答案 0 :(得分:1)
加密密码,请勿将其散列。
当您对密码进行哈希处理时,您将永远丢失密码,并且会得到密码本身的“投影”,该投影不允许返回并产生原始密码。散列通常是最安全的身份验证选项,因为任何人都无法重现原始密码。但是您不能对其进行哈希处理,因为有时需要返回密码。
因此,对其进行加密。有几种加密级别,从最基础的级别到最强的级别。我不知道您想要加密的安全性。这是典型选项的简单列表(不全面):
1。编码
编码不是加密。当我们编码一些数据时,我们用其他字符替换字符。想想尤利乌斯·凯撒(Julius Caesar)使用的具有2000年历史的ROT-13(不是吗?)。 A
变成H
,B
变成T
,依此类推。无论如何,这不是加密,而只是一个简单的转换,它将欺骗孩子或没有技术的人仅背景。其他最典型的编码包括Base-64和简单的十六进制。
2。弱加密
弱加密包括所有不加盐的对称加密,以及内部或短密钥(少于256位)。典型的情况是使用简单的密码。
3。中级加密
这包括使用较大的密码(或位长度为256或更大的密钥)的对称加密,加盐,但使用内部密码/密钥。这非常有用,我已经多次采用了这种策略。盐存储为编码值的前16个字节。取消加密时,盐值与编码值(始终为16个字节)分开。
4。高度加密
本质上是中级加密,但是增加了密钥管理解决方案。密钥不再固定,也不存储在应用程序本身中,而是在需要时从外部安全地恢复。密钥由外部流程管理,并定期更改。这需要在应用程序中进行一些额外的处理。
底线
对于您的情况,除非您有充分的理由尝试使用选项#4,否则我将使用选项#3中级加密。对我来说#4太过分了。
答案 1 :(得分:1)
首先,请确保您需要密码,这是没有其他方法的,因为如果您可以访问用户密码,那么用户和用户都将承担严重责任。
保存密码会带来较大的安全性问题,需要大量的保护措施。
需要对密码进行加密以及对每个密码随机添加盐分。加密的问题在于密钥必须是可用的,并且如果管理员和管理员都在服务器上,则拥有管理员特权(并且将获得)的攻击者将获得加密密钥以及加密密码。届时,攻击者将拥有所有个密码。
相反,加密密钥和/或加密密码应位于单独的设备上,例如HSM或安全站点中专用的受速率限制和受速率警报的计算机。
很明显,加密密钥必须是好的,通常意味着128位或更高(256位是一个不错的选择)随机对称密钥,密码是不可接受的。