将 .NET Web API 令牌转换为 6 位数字 OTP

Converting .NET Web API Token to 6 digits number OTP

如何将以下令牌转换为 6 位数字,反之亦然。

Hash/Encrypt

Q3XMaFgx3l0n9Nkb8XIUTZ9jqWDOJtefhPtv0yXPQhFBUq_hhGyW9p54apIDTpFs5Am_6Rs8VSKLClDJjFfOtM78I8EDLjwd4zjvWK0WBN9g7I2_F2D9uxEWfSUrgIIzAqw2jqGkOweW7avOmdtAdaTzlqtAY1eXJfgZg1JrkWmr9oqxsEeedViYMrJgGLssIGJM_pjTEnlwsmQiVdH5wJWwDgj5No8Wt7YdsV1sKs_44rrjfavhI4tez0vbMoeWAj5sXqTaVGH4AeVLrIUkyN7XsNJhBFTOEWyqC3L5uOXkqT_KRXOF6DV0fdMIfBmUx05hw4A =========>123456

Reverse Hashing/ Decrypt [to get back the original token]

你问的其实是不可能的。虽然哈希函数可以产生一定范围内的输出,但它们不能被逆转,并且加密(广义上讲)要求密文与明文长度相同..

根据评论,您需要做的是生成一个 6 位数字并将其存储很短的时间以方便登录。

可以使用MemoryCache class (Full framework) or IMemoryCache(net core)接口来存储由用户id或电子邮件键入的随机生成的数字,并检查该值是否存在和与用户提供的匹配。

但是我会认真考虑评论中提出的观点 ,因为正确生成 "Random" 数字有很多陷阱,并且有可能攻击者猜测数字的准确性远高于真正的随机数。

假设这确实是最终目标,您应该考虑使用已建立的库来管理 SMS 2FA。快速 google 发现了这个:

https://docs.microsoft.com/en-us/aspnet/identity/overview/features-api/two-factor-authentication-using-sms-and-email-with-aspnet-identity