如何生成备份代码并安全存储以在.NET 8中恢复帐户

问题描述 投票:0回答:1

我正在创建一个 ASP.NET Core Web 应用程序来为个人帐户设置 Web 应用程序。我正在考虑为新用户提供备份代码,以便在帐户创建期间进行帐户恢复,并且我正在寻找有关该过程的指导。

根据OWASP 备份代码应为8-12位。

我应该如何在 C# 中创建这些代码?

使用这个答案作为参考,这是创建随机备份代码的正确方法吗:

SecureRandom.RandomNumber(1, 12);

然后我想我可以存储使用 Microsoft.AspNetCore.Identity 中的 PasswordHasher 类创建和验证的每个哈希值。

c# asp.net-core security .net-8.0 recovery
1个回答
0
投票

是的,使用PasswordHasher 是个好主意。对于这样的事情,散列将是比任何类型的对称加密更合适的方法。 Identity 的 PasswordHasher 将使用 PBKDF2 和 HMAC-SHA256、128 位盐、256 位子密钥和默认情况下 10,000 次迭代,这足以安全地将任何数据持久保存到数据库。

var randomlyGeneratedCode = Guid.NewGuid().ToString().Substring(24);

这将为您提供一个 12 个字符长的随机字符串。您还可以生成随机数,但获取一部分 guid 会更安全。以下是如何对值进行哈希处理:

var passwordHasher = new PasswordHasher<ApplicationUser>(); // Or IdentityUser, if you are not extending the default identity user class
var randomlyGeneratedCode = Guid.NewGuid().ToString().Substring(24);
var hashedCode = passwordHasher.HashPassword(User, randomlyGeneratedCode); // you will need to provide the relevant user here, whoever the codes are being generated for

就像这样,您为特定用户散列了代码。您将需要一个表来存储哈希帐户恢复代码。它可能看起来像这样:

+--------------+--------+----------+
| RecoveryCode | UserId | IsActive |
+--------------+--------+----------+
|          ... |    ... | True     |
|          ... |    ... | False    |
+--------------+--------+----------+

这里的RecoveryCode列可以是字符串PK列。 UserId 列对于跟踪每个代码属于谁是必要的,IsActive 列将确定代码是否处于活动状态。您还可以在使用代码或以其他方式停用代码时删除行,而不是使用 IsActive 列,这也是一种有效的方法。

然后,确认恢复代码将涉及对用户输入进行哈希处理并简单地查找表。对用户输入进行哈希处理时,您需要向 PasswordHasher 提供相关用户,该用户将是尝试检索其帐户的用户。代码类似于:

var recoveryCodeExists = YourDatabaseContext.RecoveryCodes
        .Any(x => x.UserId == currentUser.Id && x.RecoveryCode == hashedRecoveryCode && x.IsActive);

不要忘记使使用过的代码失效。希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.