我有一个需要生成的链接,以便可以将其放入电子邮件中。当用户点击此链接时,系统会匹配电子邮件中发送给用户的代码,以便提取该用户的记录。
但是,我不太确定要使用哪种加密/散列方法。对于本网站管理系统的登录,我在数据库中使用 PBKDF2 作为密码(加盐),并在发送到 session 变量时使用 AES 加密,但我不知道 PBKDF2 和 AES 使用的字符是否是 url 兼容的。
基本上,我需要散列/生成随机代码以存储在数据库中的最佳方法和加密方法,以便我可以将年份和代码(我之前提到过)放在 url 中。如果有帮助,我正在使用 PHP 和 MySQL。
大家怎么看?
最佳答案
大多数加密(或散列等)例程的输出是任意二进制数据,如果不对其进行编码,则无法安全地将其包含在 URL 中。
As eggyal notes ,只需对数据使用 urlencode()
就足够了。然而,标准的 URL 编码可能不是编码随机二进制数据的最紧凑的方式。 Base64编码会更有效,但不幸的是,由于使用了 +
字符,因此不完全是 URL 安全的。
幸运的是,在 RFC 4648 中指定了 base64 编码的标准化 URL 安全变体。作为“base64url”。这是在 PHP 中使用此编码对数据进行编码和解码的一对函数,based on this answer by "gutzmer at usa dot net" :
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(strtr($data, '-_', '+/'));
}
(我稍微简化了解码函数,因为至少当前版本的 PHP 显然不需要在 base64_decode()
的输入中使用 =
填充字符.)
附言。为了首先安全地生成随机 token ,请参见例如this question .
关于php - 散列或加密要在 url 中发送的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513035/