Я пытаюсь сгенерировать 6-значный код для двухфакторной аутентификации, на первый взгляд, я мог бы сделать что-то вроде этого:
Random random = new Random();
var securitycode = random.Next(1000000, 10000000);
Однако мне это кажется несколько небезопасным, потому что, вероятно, есть способ предсказать следующее число, если вы можете вычислить семена, взяв множество кодов безопасности.
Я думаю, что есть лучший способ получить безопасный код, используя RNGCryptoServiceProvider
, но я немного смущен тем, как я могу гарантировать, что сгенерированный код состоит из 6 цифр.
private string GenerateSecurityCode(int length)
{
var provider = new RNGCryptoServiceProvider();
var byteArray = new byte[8];
provider.GetBytes(byteArray);
var code = BitConverter.ToUInt32(byteArray, 0);
//how can I assure the code is 6 digits
}
Является ли это безопасным способом генерации кодов MFA, если нет, что было бы хорошим методом для генерации числовых кодов?
@DavidYenglin, существуют меры, предотвращающие получение пользователем большого количества кодов. Но они не являются полным доказательством, например, злоумышленник регистрируется с несколькими пользователями и получает много кодов, используя несколько IP-адресов.
Я не уверен, что это самый безопасный, но в итоге я сделал это:
private string GenerateSecurityCode()
{
var buffer = new byte[sizeof(UInt64)];
var cryptoRng = new RNGCryptoServiceProvider();
cryptoRng.GetBytes(buffer);
var num = BitConverter.ToUInt64(buffer, 0);
var code = num % 1000000;
return code.ToString("D6");
}
почему ваше приложение позволяет получить достаточно кодов, чтобы это имело значение в первую очередь?