如何在Base62中执行编码/解码功能,结果中没有明显的模式?

时间:2011-09-05 15:13:38

标签: php encryption decode encode base62

我有一个网站,用户必须使用典型的电子邮件确认脚本确认他们的电子邮件,该脚本包含每个用户的特定(但很长)确认链接,其中包含通常的哈希参数。

我遇到的问题是由于他们使用的设备,一些用户在长而复杂的确认链接上遇到问题。

因此,我需要创建一种替代方法,为每个用户生成唯一的确认链接,这样就不会出现明显的模式,因此无法识别和滥用。

我一直在研究Base62编码和解码,但我发现的只是基于数字,这限制了我使用顺序唯一用户ID,然后在编码结果中创建一个明显的顺序模式,容易被滥用。

最好,我想要一个不需要我改变数据库的解决方案。

理想情况下,我希望基本上创建一个缩短的URL,类似于Bit.ly和其他url缩短器创建其唯一URL的方式,但可以使用用户ID,用户名或电子邮件对其进行编码和解码,并且最好使用唯一键对编码/解码进行“腌制”,以使编码结果中不出现任何模式。

实施例

因此,而不是看起来像确认链接:

http://domain.com/confirm?email=blah@blah.com&hash=1f3870be274f6c49b3e31a0c6728957f

我希望它看起来像:

http://domain.com/confirm/Sg5rdn

然后,我只需解码Sg5rdn即可获取用户的用户名,用户ID或电子邮件并进行确认。

这可能吗?

3 个答案:

答案 0 :(得分:1)

相反,只需创建一个包含确认码的表格。当用户进行确认时,创建一个唯一的代码(使用base62或其他),将其插入该表并将其分配给用户ID。

然后,当用户点击确认链接时,只需从确认代码表中获取用户ID等(并检查代码是否存在且仍未确认等)。

答案 1 :(得分:1)

我建议您将代码存储在用户表的列中: 示例表非常简短:

id--user---email--------------key-----confirmed----other stuff
1   bob    bob@example.com    1h323f   1            ...
2   rob    rob@example.com    18gg3f   0            ...
3   steve  steve@example.com  a862gf   1            ...
4   tom    tom@example.com    17g23f   0            ...

当用户注册帐户时,请先创建密钥并将其与用户名ect

一起存储

然后,当点击链接时,检查电子邮件的密钥,然后将确认更新为1。 您可以在链接上使用.htaccess使其更短:

RewriteRule ^confirm/(.*)/([a-zA-Z0-9]+)$ confirm.php?email=$1&hash=$2 [L]

例如:HTTP://domain.com/confirm/tom@example.com/17g23f

希望这有帮助

答案 2 :(得分:0)

我担心你的期望有点夸张 你唯一能做的就是缩短哈希值。

从Sg5rdn中“解码”用户名,用户ID和电子邮件的唯一方法是从数据库中获取所有这些内容。