电子邮件确认码的最佳实践

2023-11-25

我正在创建一个涉及用户注册的 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,表示“激活”、“电子邮件更改”或“密码重置”。这是一个好方法吗?你有更好的办法吗?

使用与上述类似的方法,我可以在不使用 cron-jobs 的情况下自动删除超过两天的内容吗?我的主机(nearlyfreespeech.net)不支持它们。如果可能的话,我想避免在外部主机上执行 cron 作业,其中 wget 是一个删除内容的脚本,因为这很混乱 =P。

Thanks!
Mala

Update:
澄清一下:我已经意识到安全地完成此任务的唯一方法是使用数据库,这正是原始函数试图避免的。我的问题是如何构建该表(或多个表?)。有人建议我取消 codePK,只让代码成为 PK。简而言之,我的问题是:这是你所做的吗?


当我需要这些技巧时,通常是您提到的两个原因之一:

  1. 作为发送给用户的验证电子邮件的密钥
  2. 作为用于密码重置链接的密钥

当然,还有许多其他场合您会考虑使用这种结构。

首先,您应该始终使用某种隐藏的、只有您知道的盐。请注意,每个用户的盐值应该不同。例如,盐可以计算为sha256(something random)。然后,该盐应与用户名和密码(用盐散列)一起存储在数据库中。

发送密码重置链接时我会做的是创建另一个盐(不要让用户访问用你的盐哈希的任何内容。他知道他的密码,所以使用暴力他可能会找出你的盐)。另一种盐,本质上只是随机字符串的散列(您可能想要在这里使用 md5,正如您提到的长度是一个问题),然后您应该将其保存到数据库中。

通常,您只需向用户表添加一个附加列即可。不过这样也有一些问题,主要是一旦重置了密码或者激活了用户,就会从数据库中删除这个key,导致大部分行都是空值,进而带来一些其他的麻烦。

这本质上可以归结为:

  • 使用用户独有的盐对用户的密码进行哈希处理(and也许是一种全球性的秘密盐)。
  • 通过散列许多随机或伪随机源(例如时间戳)来生成密钥,mt_rand()如果你真的想要随机的东西,甚至是 random.org。
  • 切勿使用全局盐或用户独有的盐来对用户可以访问的任何内容进行哈希处理,包括密码重置密钥、激活密钥等。

请注意,我绝不是安全专家,我可能忘记了很多事情,而且我可能提到了一些非常糟糕的做法。只是我的 5 美分;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

电子邮件确认码的最佳实践 的相关文章

随机推荐

  • 如何在android中创建弯曲的底部边框矩形?

    如何使用 xml 创建具有完美弧形底部的 Android 可绘制对象 如下所示 我已经尝试过这个xml 但结果并不完美
  • 排斥网络边缘的文本

    在绘制网络时 如果节点的标签也能避开网络边缘就好了 例如 在下面的示例中 可以将所有标签移到网络之外 我已经尝试了几个软件包 但到目前为止还没有找到一种简单的方法来做到这一点 有办法吗 下面的例子 library ggraph librar
  • mybatis 生成器“列名模式不能为 NULL 或空”

    我在 eclipse 中使用 MyBatis Generator 这是generatorConfig xml 文件 当我右键单击并选择 生成 MyBatis 工件 时 它会显示错误消息 例如 列名称模式不能为 NULL 或空
  • 数据库连接字符串信息

    在 Net中是否有一个类 您可以在其中获取数据库名称和所有连接字符串信息 而无需在连接字符串上实际执行子字符串 EDIT 我没有创建连接 而是尝试从连接字符串中获取信息 所以我基本上是在寻找需要连接字符串 arg 并具有 dbName 连接
  • 是否有一个本机功能可以将基于字符串的 JSON 转换为 Mongoose Schema 对象实例?

    我正在使用 Express 我正在寻找一种便捷的方法来转换此类对象 应要求提供 req body myObject name Foo someNumber 23 someBoolean on 进入此架构的一个实例 var myObjectS
  • 密码学与散列法

    我的问题很简单 加密将信息隐藏到只有想要查看该信息的人才能真正看到它的程度 您可以加密信息然后解密 如果哈希无法解密 为什么会被视为加密 我说散列被视为加密 因为您将 MD5 称为加密散列函数 正确 散列是一种单向函数 但散列不被视为加密
  • 使用 jquery 检查 HTML5 视频是否正在播放

    我编写了一个小的 jquery 代码来覆盖 HTML 5 播放功能 但是 我无法检查视频是否正在播放 这是我的 jquery 代码 video click function var video myvideo get 0 video pla
  • 如何获取嵌套属性

    我想检索 PropertyInfo 这里是代码 string propertyName Text PropertyInfo pi control GetType GetProperty propertyName 它工作正常 但如果我想检索嵌
  • 如何使用 .shp 将空间多边形应用于传单地图

    我正在尝试使用传单绘制加利福尼亚州各县的地图 我没有收到任何错误 但地图没有产生正确的结果 我找到了一个 shp县线文件位于https data ca gov dataset ca geographic boundaries 我导入了 sh
  • 使用 django-allauth

    我在使用 django allauth 时遇到问题 我收到这个错误 NoReverseMatch 位于 accounts login 找不到参数 和关键字参数 的 facebook channel 的反向操作 到目前为止 我已经严格遵循了一
  • SKScene 中的 UIPanGestureRecognizer

    我一直在尝试UIGestureRecognizers和新的SKScene SKNode s in SpriteKit 我遇到了一个问题 我即将解决它 但我对一件事感到困惑 本质上 我有一个平移手势识别器 允许用户在屏幕上拖动精灵 我遇到的唯
  • Spring 已弃用的 ExpressionEvaluationUtils 评估方法的替代方案?

    自上课以来 org springframework web util ExpressionEvaluationUtils自 Spring 3 x 版本以来已弃用 我正在寻找在我的 java 代码中进行 EL 表达式求值的另一种替代方法 阅读
  • 如何在不为每个函数运行新的浏览器窗口的情况下运行 PHPUnit Selenium 测试?

    我正在尝试使用 PHPUnit 运行硒测试用例 我做的第一件事是尝试登录功能 这很完美 但随后我想运行一个功能来检查登录后页面上的信息 但它会打开一个新浏览器 而不是在当前浏览器窗口中继续 这是一个问题的原因是因为该页面设置为在窗口关闭时删
  • 从表单数据创建 PDF 并保存

    我正在使用可编辑的 pdf 文件 由硝基 PDF 软件 在我的应用程序中 这些 pdf 文件有很多可编辑字段 如文本框 和一个按钮 如提交 每当用户打开该 pdf 文件 输入文本并单击提交按钮时 他们就会被重定向到 aspx 页面 如何获取
  • 我应该怎么做才能从命令行获取c程序的整个返回值?

    我有一个简单的 C 程序 my program include
  • 使用 for 循环在 ggplot2 的单个图中绘制多条线

    我尝试在单个图中绘制多条线 如下所示 y lt matrix rnorm 100 10 10 m lt qplot NULL for i in 1 10 m lt m geom line aes x 1 10 y y i plot m 然而
  • 如何使用 mongoose 创建上限集合?

    我正在尝试使用 Mongoose 创建一个有上限的集合 但是以下内容创建了一个没有上限的集合 var schema new mongoose Schema Name type String Text type String capped m
  • 路径问题:NameError:名称“__file__”未定义

    import os path as osp import torch import torch nn as nn import torch nn functional as F from torch geometric datasets i
  • 找不到 appcfg.py 或 dev_appserver.py?

    我的电脑说 bash appcfg py 找不到命令 怎么了 我可以使用 google app engine launcher 运行我的应用程序 并且预装了 python 我正在尝试使用 appcfg py update 上传我的应用程序m
  • 电子邮件确认码的最佳实践

    我正在创建一个涉及用户注册的 PHP 网站 我想知道 电子邮件确认 代码的最佳实践 新用户必须确认他们的电子邮件地址 我通过生成代码并将其通过电子邮件发送给用户来做到这一点 然后用户可以使用该代码来激活他的帐户 我没有将此密钥存储在数据库中