5

我有一个需要生成的链接,以便可以将其放置在电子邮件中。当用户单击此链接时,系统将匹配电子邮件中发送给用户的代码,因此它可以提取该用户的记录。

但是,我不太确定要使用哪种加密/散列方法。对于本站管理系统的登录,我使用数据库中的 PBKDF2 作为密码(加盐)和 AES 加密,当它发送到会话变量时,但我不知道 PBKDF2 和 AES 使用的字符是否网址兼容。

基本上,我需要散列/生成随机代码以存储在数据库中的最佳方法和加密方法,以便我可以将年份和代码(我之前提到过)放在 url 中。如果有帮助,我正在使用 PHP 和 MySQL。

你们有什么感想?

4

2 回答 2

9

大多数加密(或散列等)例程的输出是任意二进制数据,如果不对其进行编码,就无法安全地将其包含在 URL 中。

正如 eggyal 所说,简单地使用urlencode()数据就足够了。然而,标准的 URL 编码可能不是编码随机二进制数据的最紧凑方式。 Base64编码会更有效,但不幸的是,由于它使用了+字符,它并不完全是 URL 安全的。

幸运的是,base64 编码存在标准化的 URL 安全变体,在RFC 4648中指定为“base64url”。这是一对在 PHP 中使用这种编码对数据进行编码和解码的函数,基于“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()。)


附言。为了首先安全地生成随机令牌,请参见例如这个问题

于 2012-05-09T12:10:03.713 回答
6

根据需要执行散列,然后urlencode()在将其插入 URL 之前执行结果。

于 2012-05-09T09:13:44.783 回答