首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在php中生成安全的激活字符串?

如何在php中生成安全的激活字符串?
EN

Stack Overflow用户
提问于 2009-05-18 03:29:05
回答 6查看 31.3K关注 0票数 19

用户订阅电子邮件后,我的网站。我的网站将生成一个电子邮件确认,并发送给他们。在电子邮件内容中,我需要包含激活密钥,如下所示:

www.domain.com/activate.php?key=$generatedKey

密钥是如何生成的?使用sha1($email)??

生成密钥后,我将其存储在数据库中,这样当用户单击链接时,我可以与数据库进行验证。我是个新手,请指教..我需要一个电子邮件确认脚本..

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-18 03:34:07

就我个人而言,我只是使用了以下几种东西的组合:

$generatedKey = sha1(mt_rand(10000,99999).time().$email);

冲突的可能性很小,但我建议在发送之前先检查数据库(使用唯一约束是一种简单的方法)。

票数 26
EN

Stack Overflow用户

发布于 2009-05-18 04:34:21

你基本上有几个选择:

1)创建一个看似随机的唯一标识符,并将其存储在数据库中与其对应的用户名

2)生成随机密码,并在链接中包含用户id和密码,并将密码存储在数据库中

3)使用单向散列函数(md5、sah1等)和秘密标识符对用户标识符进行加密。您不必将加密的用户标识符存储在数据库中。

选择1比较困难,因为您必须检查数据库以查看键是否已经存在。但是,URL不包含被激活的用户名是一件很好的事情。

如果将来您已经打算使用某种数据库来存储用户信息(可能至少需要一个密码),那么可以使用选项2。向数据库中添加另一列并不需要花费太多时间。发送电子邮件时,保存用户名和类似$key = sha1(rand(1,99999) )的内容。$username)在包含用户名的行的另一列中。然后让你的链接看起来像这样:http://you.com/activation.php?user=$username&key=$key。在activation.php中,您可以检查键是否等于数据库中存储的值。

如果你想在你的数据库中使用更少的存储空间,选择3是可行的。您可以使用类似$key = sha1($mysecret .$username)作为秘密标识符。使用一些只有你自己知道的奇怪东西,比如‘aaafj_my_ $mysecret _adfaf’。使用与选项2相同类型的URL。但是,因为您只能基于$username生成$key,所以不需要存储它。因此,当您在activation.php中进行处理时,只需检查sha1($mysecret。$_GETusername) == $_GETkey。如果是这样的话,您就知道您找到了正确的用户。从理论上讲,有了足够的注册,有人可以计算出你的$mysecret值,并生成激活密钥。然而,你肯定会注意到,在他们开始计算它是什么之前,它需要数十亿甚至更多的注册。所需的激活次数基于散列函数的密钥大小。使用sha1 (160位)与md5 (128位)来使您的$mysecret值更难猜测。

票数 8
EN

Stack Overflow用户

发布于 2009-05-18 03:34:37

$guid=md5(uniqid(mt_rand(), true));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/876139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档