我正在尝试找到一个安全的解决方案来解决我遇到的关于 Cookie/会话和数据库数据的问题。
我已经阅读了不同的文章,例如http://www.devshed.com/c/a/PHP/Sessions-and-Cookies/,这些文章解释了不同的 Cookie 盗窃和会话固定方法,以了解我的安全问题要去面对。
问题如下:我有存储数据条目的数据库表AES_ENTRYPT()
,使用用户密码对其进行加密。这意味着,即使要读取信息,我也必须使用明文密码来解密数据。
如果我只将密码存储在变量中,这可能不会成为问题,$_SESSION
但这将拒绝通过 cookie 保持登录数天的能力。
换句话说,我必须将明文密码存储在 cookie 中(至少,以使该功能保持登录状态)
现在,您可以使用加盐的 MD5() 或 SHA-256() 哈希作为标识符,而不是密码。但我不能用哈希解密数据。这意味着我必须存储密码服务器端(在数据库中?还是有其他安全方式?),将它连接到标识符 - 但是密码对于有权访问数据库的每个人来说都是可以访问的,并且可以直接解密那里的数据。
有没有一种安全的方法来连接我存储在 cookie 中的标识符,并将其连接到服务器存储的用户输入(密码/帐户名),而实际上却让可以访问数据库的人有可能读取该服务器端存储用户输入?
要求是,即使在最坏的情况下,有人转储了数据库和 cookie(但无法访问服务器 RAM),该人不应该能够访问用户密码并用它解密存储的数据。
为避免混淆,简单回顾一下:
这不是用户识别问题 - 登录过程单独发生(通过通常的方式:密码/登录数据的 md5() 哈希)。我的问题是,用户数据(如地址、姓名、电子邮件)是用用户密码加密的。所以我需要登录密码来解密它们。如果用户只是登录,这没问题,因为我在 $_POST 数据中有密码,并且可以使用它。但是登录后呢?只要 $_POST 或 $_SESSION 消失,我就无法再次解密数据。
可能的解决方案
经过一些输入后,我可能想出了一个方法——它并不完全安全,但它应该工作得很好:
(这里与登录/用户认证过程是分开的,我只指加密/密钥部分)
user registers OR changes password:
generate a new hash out of $email and $password => $auth
do NOT store $auth in the usertable, just keep it
generate a new random key for the user => $key (only on registering, not on pw change)
encrypt $key with $auth, storing it into the usertable
encrypt all user data with $key
user logs in (or after registering / password change):
generate $auth ($password + $email)
set cookie with $auth as variable
user is logged in (cookie / session / after login):
decrypt $key with $auth
use $key for data encryption / decryption (serverside)
这里唯一的问题是,如果有人可以获得 $auth,他们可以解密 $key,然后解密数据。我正在考虑为每次登录生成一个新的 $auth,但这会引发一个问题,如果旧的 $auth 丢失,我如何解密密钥。这与令牌之间的区别在于,这增加了另一层,其中令牌不是加密密钥本身。无论如何,我认为解决方案是最接近我想要的,在公钥/私钥之外。非常感谢你。