我创建一个PHP网站,其中涉及的用户签名了,我想知道关于最佳做法"的电子邮件确认"代码。

新用户必须确认他们的电子邮件地址-我这样做是通过产生的代码发送到用户的电子邮件,然后,他可以用来激活了他的账户。而不是储存这一关键数据库中,我使用的是一个方便点的解决办法:代码是一样的结果:

md5("xxxxxxxxx".$username."xxxxxxxxxxx".$timestamp."xxxxxxxxx");

其中$timestamp是指用户创作的时间。整体上,我很高兴这一点,但然后我想,这是安全的足够了吗?和什么有关冲突的可能性?并且我还需要产生的代码的密码重置,等等。如果我用了一个类似的方法,碰撞可能会导致在一个用户无意间重新设置另一个用户密码。这就是没有好处。

那么,你如何做这些事情?我的想法是一个表的格式如下:

codePK (int, a-I), userID (int), type (int), code (varchar 32), date (timestamp)

其中'type',将1、2或3的意思是"激活"、"电子邮件变化"或"密码重置"。这是一个很好的方式这样做?你有更好的办法?

使用的方法类似于上述,我可以自动删除任何超过两天的不使用计划的工作?我的主人(nearlyfreespeech.net)不支持他们。如果可能的话,我想为了避免具有一个计划工作上的一个外部主机wget的脚本中删除的事情,因为这只是混乱=P.

谢谢!
麻辣烫

更新:
为了澄清:我已经实现的唯一方式安全地和安全地开展这一任务是通过使用一个数据库,该数据库是什么原有的功能是在试图避免的。我的问题是如何表(或表?) 应当以结构化。有人建议我做codePK和刚刚作出的代码一PK。因此,在短期,我的问题是:这是你做了什么?

有帮助吗?

解决方案

当我需要这些种类的技巧这是正常的一个原因有两个,都提到过你:

  1. 作为一个关键用于验证电子邮件发送给用户
  2. 作为一个关键用于密码重置链接

当然会有许多其他场合下,你将会考虑使用这种建设。

首先,你应该总是使用某种类型的盐就是隐藏的,只有你知道的。注意,这盐应该是不同的,对每个用户。盐例如可以被计算为 sha256(something random).这盐然后应将储存在该数据库以及用户名和密码,(hashed与盐)。

我会做什么的时候发送密码重置链接是创造另一个盐(不得用户访问为什么哈你的盐。他知道他的密码,因此,使用暴力破解他有可能找出你的盐)。其他盐,这基本上是唯有的散列的随机的字符串(你可能想去为md5在这里,正如你提到的长度是一个问题),应你然后存入数据库。

通常你就可以得到与增加一栏,用户表。然而,这还有几个问题,主要是,一旦密码已经被重置或用户已经被激活,将删除的关键数据库,其结果在大多数行具有空值,这反过来带来了一些其他的麻烦。

什么,这基本上可以归结为:

  • 哈你的用户密码的使用一个独特的用户盐( 也许是一个全球性的,秘密的盐)。
  • 产生的一个关键通过散列一定数量的随机或伪随机的来源,如时间戳 mt_rand() 甚至random.org 如果你真的想要的随机的东西。
  • 从来没有使用你的全球盐或盐,是独一无二的用户散列的任何东西的用户访问,包括密码重置键,激活的钥匙,等等。

请不,我绝不意味着一个安全专家,以及我可能忘记一些事情,并且我可能已经提到了一些非常糟糕的做法的事情。只是我的5美分;-)

其他提示

为什么使用任何用户的数据为基础的授权钥匙?

我猜你是存de活数据库中的数据,所以为什么不仅仅是添加一个额外的记录,只是随机的关键(也许md5'ed uniqid 一些额外的操纵)和然后检查,对吗?

它是安全的足够的权利,直到那一点你发表了你的方法在互联网上!这是因为你依靠的安全通过默默无闻,这不是一个好主意。

你应该使用某种钥散列函数或MAC理想的情况,其中包括一个秘密的关键只有你知道。

为什么不让码领域唯一的指数?所以不会有collsisions?

还有,如果你不需要创建的散列从用户输入和与之相匹配数据库哈(电子邮件确认,密码重置等)的-你可以增加随机的字符串散体,喜欢 md5('xxx'.$username.'xxx'.time().'xxx'.rand())

为什么不要求用户输入自己的用户名 他们的代码,从而消除了任何问题,与冲撞?你不会失去什么安全的明智的,因为你还询问的关键,他们会得到从电子邮件,但是你会阻止他们能够重置其他用户密码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top