C# 中 HashCode 的随机种子可以被认为是密码随机的吗?
Can the random seed of HashCode in C# be considered cryptographically random?
HashCode
的 documentation 提到使用 'random seed' 即 'only deterministic within the scope of an operating system process'。
我的问题是:
- 这个随机种子是如何实现的?这个随机种子可以被认为是密码随机的吗?
一起来看看吧。 HashCode
is here 的来源。我们可以看到这一行:
private static readonly uint s_seed = GenerateGlobalSeed();
那么让我们来看看GenerateGlobalSeed
:
private static unsafe uint GenerateGlobalSeed()
{
uint result;
Interop.GetRandomBytes((byte*)&result, sizeof(uint));
return result;
}
Sys.GetNonCryptographicallySecureRandomBytes(buffer, length);
相当大 give-away 那里:NonCryptographicallySecureRandomBytes。这不是加密源。
如果我们进一步观察 the implementation,我们可以看到它使用 arc4random_buf
或 lrand48
,这肯定不是加密的。
即使种子是加密的,请注意它在整个过程中都是不变的。根据您要防范的攻击类型,弄清楚它是什么并不难。
HashCode
的 documentation 提到使用 'random seed' 即 'only deterministic within the scope of an operating system process'。
我的问题是:
- 这个随机种子是如何实现的?这个随机种子可以被认为是密码随机的吗?
一起来看看吧。 HashCode
is here 的来源。我们可以看到这一行:
private static readonly uint s_seed = GenerateGlobalSeed();
那么让我们来看看GenerateGlobalSeed
:
private static unsafe uint GenerateGlobalSeed()
{
uint result;
Interop.GetRandomBytes((byte*)&result, sizeof(uint));
return result;
}
Sys.GetNonCryptographicallySecureRandomBytes(buffer, length);
相当大 give-away 那里:NonCryptographicallySecureRandomBytes。这不是加密源。
如果我们进一步观察 the implementation,我们可以看到它使用 arc4random_buf
或 lrand48
,这肯定不是加密的。
即使种子是加密的,请注意它在整个过程中都是不变的。根据您要防范的攻击类型,弄清楚它是什么并不难。