【问题标题】:How to auto generate password in sql database?如何在sql数据库中自动生成密码?
【发布时间】:2025-12-31 19:25:03
【问题描述】:

我正在做一个关于银行账户的小项目。前端是 ASP.NET,后端是 SQL SERVER
当一个人创建一个帐户时,自动生成的帐号和密码将保存在数据库中,并且该帐号和密码将发送到该用户的电子邮件ID。

这样用户就可以使用提供的帐号和密码登录。 所以我的问题是如何自动生成该帐号和密码。我不知道该怎么做。

希望是最好的。谢谢!

【问题讨论】:

  • "自动生成的帐号和密码将保存在数据库中,并且该帐号和密码将发送到该用户的电子邮件 ID" 不,他们真的不应该。
  • @PrestonGuillot 他们为什么不应该这样做?
  • 电子邮件不安全。通过电子邮件发送密码是不明智的。让他们生成密码,并对其进行哈希处理。如果他们忘记了密码,请通过电子邮件向他们发送链接以重置密码(询问安全问题)。
  • @ChaseFlorell 啊谢谢。
  • 不要忘记接受有用的答案。

标签: asp.net sql-server auto-generate


【解决方案1】:

首先,允许他们创建自己的密码和HASH that bugger。永远不要通过电子邮件发送他们的密码。如有必要,通过电子邮件发送链接以重置,并在发送后不久使链接失效。

其次,要生成帐号,我会使用 Guid

var accountNumber = new Guid.NewGuid();

在您的数据库中,您存储密码的哈希版本,在登录时,您对登录密码进行哈希处理并将其与数据库哈希进行比较。

同样在数据库中,如果您选择使用 Guid,帐号将是 UniqueIdentifier

【讨论】:

    【解决方案2】:

    这是我能想到的最随意的方式:

    Select NewID() as UserName, NewID() as Password
    

    当然,你的用户不会喜欢这个,因为它真的很长:

    UserName                             Password
    ------------------------------------ ------------------------------------
    F050EF1A-1D6C-4A20-991C-F6B034AEBD2E 86C8D5FC-D09E-45FF-9A4F-041239082C5E
    

    所以让我们把它缩短到 8 个字符:

    Select 
        SubString (Cast (NewID() as VarChar(50)), 1, 8) as UserName, 
        SubString (Cast (NewID() as VarChar(50)), 1, 8) as Password
    

    这看起来更好:

    UserName Password
    -------- --------
    63B1A547 D5566B8C
    

    由于您希望在保存行时生成此信息,因此您可能有一个 INSERT 语句将帐户所有者的信息放入数据库中。修改该特定代码行以执行此插入:

    Insert Into AccountTable (UserName, Password)
    Select 
        SubString (Cast (NewID() as VarChar(50)), 1, 8) as UserName, 
        SubString (Cast (NewID() as VarChar(50)), 1, 8) as Password
    

    当然.. 由于您知道帐户所有者的姓名,因此您可以查询回来以获取所有者。一个更好的主意是在表上设置一个标识列,并使用Scope_Identity 来获取您刚刚插入的行。

    【讨论】:

    • Guids are NOT secure enough to use for passwords。它们都是可预测的,并且通过使用显着减少的字符集(仅 16 个可能的字符!)来增加暴力破解的机会!
    • @Richard,OP 正在做一个迷你项目,他正在通过电子邮件发送用户名和密码。如果这是一项严肃的工作,参数会非常严格,就像你说的那样 - HTTPS、单向哈希存储、加密的 Web 服务.. 你的名字!
    • OP 可能会在没有完全了解后果的情况下要求一些事情。如果这只是一个小黑客项目,那么您的 hack 答案就足够了,但如果这是实际上处理银行业务(在任何级别),那么这个答案可能会导致某人走上非常错误的道路。 /cc @理查德