大多数加密(或散列等)例程的输出是任意二进制数据,如果不对其进行编码,就无法安全地将其包含在 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()。)
附言。为了首先安全地生成随机令牌,请参见例如这个问题。