【问题标题】:Generate unique random number in ASP.NET Core在 ASP.NET Core 中生成唯一的随机数
【发布时间】:2020-04-16 18:53:10
【问题描述】:

我正在开发一个热点服务,使用 ASP.NET Core 构建一个 MVC 应用程序,我需要生成一个 6 位数(100000 到 999999)的号码作为用户连接和上网的密码使用权。该数字在数据库中必须是唯一的,并且会在一段时间后(一个月)被删除。

生成此唯一编号的最佳方法是什么?我也在使用实体框架,想知道这是否可以在某种程度上帮助我解决这个问题......

提前致谢!

【问题讨论】:

  • 密码是唯一授予访问权限的东西吗?是否还需要用户名等来授予访问权限?拥有 6 位密码仅允许 900,000 种可能性,这使其容易受到暴力猜测攻击。您是否考虑过需要更长的密码或其他方式来验证您的热点用户?您是否考虑过一次性密码协议?另请参阅我写的关于生成 random unique identifiers 的内容。
  • 最后,要自己生成密码,你应该使用加密RNG;请参阅我在existing APIs 上的部分。
  • EF 是一个 OR/映射器,它不关心生成随机数或任何东西。

标签: asp.net-mvc entity-framework asp.net-core random unique-key


【解决方案1】:

好吧,只需执行以下操作就很容易了:

var rand = new Random();
var uid = rand.Next(100000, 1000000);

但是,确保数据库唯一性的唯一方法是 1) 查询以确保该值首先不存在(尽管存在并发问题)或 2) 使列唯一,并捕获从约束验证。

简而言之,您必须与数据库一起做一些事情来确定它在数据库中是否真的是唯一的。如果池不到一百万,您可能会经常发生碰撞。

值得一提的是,正如@PeterO 指出的那样,这不会是远程安全的。从不到一百万的候选者池中暴力碰撞是非常容易的。但是,如果您仍然以 6 个字符的数字结尾,那么使用加密 RNG 将无济于事。 如何你得到一个随机数并不像这个数字实际上有多随机那么重要。这里的熵接近于零。

【讨论】:

    【解决方案2】:

    由于基于时间的随机化,您无法确定某个数字是唯一的。如果通过唯一您的意思是它在数据库中应该是唯一的,那么您可以做的是从数据库中检索所有密码并生成一个随机数(new Random().Next(100000, 1000000))并再次生成它,直到找不到匹配项。但我不建议在短时间内使用“基本”密码。

    【讨论】:

      【解决方案3】:

      要自己生成密码,您应该使用加密的 RNG(例如 .NET 中的 RNGCryptoServiceProvider);请参阅我在existing APIs for various programming languages 上的部分。在这里使用System.Random 是不合适的,因为随机密码是为身份验证而设计的,而System.Random 不是为安全而设计的。

      但是,您采用的方法存在几个问题。

      密码是唯一授予访问权限的东西吗?是否还需要用户名等来授予访问权限?

      拥有 6 位密码仅允许 900,000 种可能性,这使其容易受到暴力猜测攻击。由于birthday problem,略多于 900,000 次猜测的平方根(略多于 950)就足以命中有效密码,并且命中有效密码的机会增加了数据库中的密码数量。

      您是否考虑过要求更长的密码或其他方式来验证您的热点用户?

      您是否考虑过一次性密码协议?

      另请参阅我写的关于生成 random unique identifiers 的内容。

      【讨论】:

      • 我明白你的意思,我承认我从来没有想过暴力破解的想法......我可以提高数字,但问题是该公司已经只与密码,那是数字,你知道我可以把它输入多少位吗?我也可以看到与字符一起工作,比如“s9d8ge”而不是“652324”,你怎么看?
      • 一个 UUID(版本 4)包含连字符、32 个其他字符和 122 位随机性;您可以使用 .NET 中的Guid.NewGuid() 方法生成一个。它可以为您的目的提供密码,并且它有连字符来帮助记忆。或者,您可以使用加密 RNG 生成 16 个随机字节,并将这些字节转换为类似于 UUID 的“十六进制字符串”。
      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多