如何创建公司提供给批准用户的帐户设置验证码?

How to create a validation code for account setup that is provided by the company to an approved user?

我正在尝试创建一个网站,当一个人在该网站注册时,他们必须有一个访问 pin(或代码)才能完成帐户创建。从某种意义上说,创建帐户的人将提交申请以获得查看数据的权限。我了解如何阻止匿名用户,但想要生成代码并将其发送给员工,他们将审查应用程序以查看数据并确定是否发送批准代码。补充一下,我希望有一个轮换密钥,必须由我们公司提供,供人们在我们这里创建帐户。

我希望帐户获得批准后页面如下:

电子邮件地址

密码

帐户密码(我想知道如何解决的部分)

我知道的电子邮件地址和密码是前两个的内置函数;然而,在他们确认用户符合我们的可接受使用指南后,考虑使用密码来激活公司必须提供的帐户。


编辑:数据本身不是机密的,只是最佳实践以及如何使用我们支持的医疗产品的指南。主要重点是防止患者在互联网上查找信息并进行自我治疗。不使用任何重要信息、秘密或机密信息。

补充一下,这几乎就像拥有一辆汽车的车主手册,您只希望经过认证的机械师使用,因为您担心普通人会误解信息、使用不当或最终造成伤害自己不正确使用工具。


编辑:哦亲爱的(上帝,上帝,岩石,无论你相信什么),请不要使用这种方法来保护机密医疗数据。


像您描述的那样创建旋转 PIN 码的最简单方法是计算出您希望它旋转的时间间隔(小时、天、周等),将当前日期和时间减少到该时间间隔,然后将其散列为更短、更易于输入的数字,您可以根据需要提供给用户。整个计划是否是个好主意,我会留给你,但这不是我推荐的。

作为一个非常简单的示例,这是一种(非常糟糕)为特定日期生成 PIN 的方法。请不要在您的实际程序中使用此方法,它仅用于演示目的。如果您使用它并被黑,我概不负责。

static void Main(string[] args)
{

    Console.WriteLine(GetPinForDate(new DateTime(2017, 7, 26)));
    Console.WriteLine(GetPinForDate(new DateTime(2017, 7, 27)));
    Console.WriteLine(GetPinForDate(new DateTime(2017, 7, 28)));
    Console.WriteLine(GetPinForDate(new DateTime(2017, 7, 29)));

    Console.ReadLine();
}

static string GetPinForDate(DateTime targetDate)
{
    var days = Math.Floor((targetDate - new DateTime(2000, 1, 1)).TotalDays);
    return (days.GetHashCode() << 8).ToString().Substring(6);
}

它产生以下输出:

33760
68224
02688
37152

在您的真实程序中,您将在注册期间从用户那里收集 PIN,并将其与此函数为当前日期生成的 PIN 进行比较。如果它们匹配,则允许用户继续,如果不匹配,则对它们大喊大叫。你可以有一个小程序,它只显示当前日期的 PIN,在你的办公室使用相同的方法 运行,当有人打电话要创建一个帐户时你会给出它。


简单说明一下,我不推荐这种模式有两个主要原因。

  • 首先,它只是一个奇怪的认证机制,对你来说似乎很不方便,如果有人知道如何生成 PIN 模式,很容易被绕过。

  • 在这个特定的例子中,散列非常弱,并且未经测试。我在 30 秒内想出了它,并且只针对 5 个日期进行了测试。它可能存在(而且很可能存在)密码学弱点,使得猜测特定日期的 PIN 变得相当微不足道。

我更好的方法是使用 MVC 中现有的身份验证机制。将 Approved 标志添加到默认设置为 false 的用户帐户。让用户创建一个帐户,然后打电话给您请求批准和激活,这在您这边通过 Web 界面修改标志来完成。

我认为你问题的核心是你没有将认证与授权分开。

我也在医疗保健行业工作。我们保护数据的方式如下:

  1. 任何人都可以在我们的应用程序上注册。但是,一旦他们注册,他们只能访问不需要安全性的功能和数据。
  2. 另一个应用程序只能由我们的员工访问。此应用程序允许我们的员工授予和撤销用户的权限。
  3. 我们有建立用户帐户的程序。这是身份验证,由您自己决定。身份验证是一个庞大而复杂的问题,超出了 Whosebug 的范围。
  4. 一旦我们确信某个用户帐户确实属于他们声称的身份,我们就会授予该帐户权限。
  5. 从现在开始,用户可以访问医疗数据和安全功能。

现在如果您想坚持您的 PIN 解决方案,您必须牢记以下几点:

首先,PIN 码的安全性与其长度直接相关。在 IT 安全术语中,PIN 是所谓的共享机密。目前,根据 OWASP,可接受的共享秘密长度为 256 位。我实际上建议您阅读大量 OWASP,因为它将指导您如何保护您的应用程序。

如果在阅读所有这些内容后您仍然坚持使用 PIN,我建议您找到一个熵源来生成您的客户会信任的 GUID。