How can I generate a cryptographically secure pseudorandom number in C#?
Asked Answered
S

3

69

Is there any fast implementation of cryptographically secure pseudorandom number generator (CSPRNG) for C# 3.0 (.NET Framework 3.5), for authentication tokens?

Sula answered 3/11, 2009 at 16:13 Comment(0)
V
127
using System.Security.Cryptography;
...
using(RandomNumberGenerator rng = new RNGCryptoServiceProvider())
{
    byte[] tokenData = new byte[32];
    rng.GetBytes(tokenData);

    string token = Convert.ToBase64String(tokenData);
}
Vadnais answered 3/11, 2009 at 16:15 Comment(3)
Cryptanalysis of the WinAPI GUID generator shows that, since the sequence of V4 GUIDs is pseudo-random, given the initial state one can predict up to the next 250 000 GUIDs returned by the function UuidCreate. This is why GUIDs should not be used in cryptography, e.g., as random keys. (from en.wikipedia.org/wiki/Globally_Unique_Identifier)Torras
This isn't specifically cryptography, tho. And, it would be difficult to predict the initial state of the machine.Vadnais
A common attack is to DDoS a server until it is restarted. Then predicting the initial state (system clock) is much easier.Kun
K
15

Upd 2022 in .Net 6 RNGCryptoServiceProvider() is obsolete, usage of static methods of RandomNumberGenerator is recommended

private string GetRandomlyGenerateBase64String(int count)
{
    return Convert.ToBase64String(RandomNumberGenerator.GetBytes(count));
}
Kwabena answered 23/1, 2022 at 23:54 Comment(0)
S
3

That depends on what you mean by fast...

There is no really fast secure random generator. If you want fast, you should use the regular Random class. If you want secure you should use the random generator in the Cryptography namespace, but that is significantly slower. You simply can't have both.

Schram answered 3/11, 2009 at 16:30 Comment(2)
If you're willing to do interop with a native crypto implementation you can have both excellent performance (several times faster than System.Random) and security.Enugu
@CodesInChaos: So; fast, secure, simple - pick any two. :)Schram

© 2022 - 2024 — McMap. All rights reserved.