Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个Guid是随机的还是可以猜测的_C# - Fatal编程技术网

C# 这个Guid是随机的还是可以猜测的

C# 这个Guid是随机的还是可以猜测的,c#,C#,我正在用以下代码生成一个反CSRF令牌: TokenCSRF = new Random(Guid.NewGuid().GetHashCode()).Next(1, 9999).ToString(); 这个标记是可猜测的还是真正随机的 编辑:我用以下内容替换了令牌生成器: byte[] byt = new byte[sizeof(Int32)]; RNGCryptoServiceProvider rngCrypto = new RNGCryptoServiceProvider()

我正在用以下代码生成一个反CSRF令牌:

TokenCSRF = new Random(Guid.NewGuid().GetHashCode()).Next(1, 9999).ToString();
这个标记是可猜测的还是真正随机的

编辑:我用以下内容替换了令牌生成器:

    byte[] byt = new byte[sizeof(Int32)];
    RNGCryptoServiceProvider rngCrypto = new RNGCryptoServiceProvider();

    rngCrypto.GetBytes(byt);

    return BitConverter.ToInt32(byt, 0);
这个标记是可猜测的还是真正随机的

这是一个错误的问题

Mike z的评论是正确的。guid保证是唯一的,而不是随机的。有不同的guid生成技术,其中一些技术比其他技术更随机。特别是,允许guid生成器生成顺序guid。大多数情况下不会,但如果您对唯一性以外的内容使用guid,则使用的是标签外的guid。我不喜欢在有安全隐患的时候做任何不符合规定的事情

特别是,我们没有证据表明任何安全专业人员审查了guid生成器或哈希生成器中的代码,以确保其具有足够的熵来击败攻击者。您的安全性应该基于经过专家审查的工具

当我们这样做的时候:代码本身很奇怪。它假定guid的哈希具有足够的熵来为随机数生成器种子,然后从该RNG生成一个5位十进制数字。假设你手头已经有一个32位的随机数;如果它已经是随机性的一个来源,足以成为一个种子,你为什么不把它作为你的随机数呢?你有一个随机种子,它的大小足以成为你寻找的随机数!把它输入到Random中并不会使它变得更随机

也就是说,你根本不应该使用它

正确的问题是:

出于安全目的,生成随机数的正确方法是什么

使用一个加密强度随机生成器,其标签上的用途正是这样。.NET运行时库中有一个可用的;用它

进一步阅读:

第三部分与你的问题特别相关

这个标记是可猜测的还是真正随机的

这是一个错误的问题

Mike z的评论是正确的。guid保证是唯一的,而不是随机的。有不同的guid生成技术,其中一些技术比其他技术更随机。特别是,允许guid生成器生成顺序guid。大多数情况下不会,但如果您对唯一性以外的内容使用guid,则使用的是标签外的guid。我不喜欢在有安全隐患的时候做任何不符合规定的事情

特别是,我们没有证据表明任何安全专业人员审查了guid生成器或哈希生成器中的代码,以确保其具有足够的熵来击败攻击者。您的安全性应该基于经过专家审查的工具

当我们这样做的时候:代码本身很奇怪。它假定guid的哈希具有足够的熵来为随机数生成器种子,然后从该RNG生成一个5位十进制数字。假设你手头已经有一个32位的随机数;如果它已经是随机性的一个来源,足以成为一个种子,你为什么不把它作为你的随机数呢?你有一个随机种子,它的大小足以成为你寻找的随机数!把它输入到Random中并不会使它变得更随机

也就是说,你根本不应该使用它

正确的问题是:

出于安全目的,生成随机数的正确方法是什么

使用一个加密强度随机生成器,其标签上的用途正是这样。.NET运行时库中有一个可用的;用它

进一步阅读:


第3部分与您的问题特别相关。

GUID是可以猜测的,因为它的一部分由生成它的机器标识,另一部分是时间戳。没有什么比植入当前时间戳更好的了,这也是可以猜测的

如果要生成安全令牌,您可能希望使用System.Security.Cryptography.RNGCryptoServiceProvider类或其他类似方法


请注意,不要将您的令牌限制为10K值或任何如此小的值。你会对暴力攻击敞开心扉。至少使用64位之类的代码,这样您就安全了。如果您依赖加密RNG,您可能希望生成8或16个字节,然后将它们转换为带base-64编码的字符串。这听起来很安全。

GUID是可以猜测的,因为它的一部分由生成它的机器标识,而另一部分是时间戳。没有什么比植入当前时间戳更好的了,这也是可以猜测的

如果要生成安全令牌,您可能希望使用System.Security.Cryptography.RNGCryptoServiceProvider类或其他类似方法

请注意,不要将您的令牌限制为10K值或任何如此小的值。你会对暴力攻击敞开心扉。至少使用64位,然后使用y

你会安全的。如果您依赖加密RNG,您可能希望生成8或16个字节,然后将它们转换为带base-64编码的字符串。这听起来很安全。

为什么不仅仅是Guid.NewGuid?谁说Guid是随机的?Guid是唯一性而不是随机性的来源。对应该是随机的东西使用适当的随机性来源,因为1到10000之间的数字就足够了;也可以在1到100K或100万之间。@mikez:实际上,我正在生成一个随机数,guid是用来给生成器种子的。为什么不仅仅是guid.NewGuid?谁说guid保证是随机的?Guid是唯一性而不是随机性的来源。对应该是随机的东西使用适当的随机性来源,因为1到10000之间的数字就足够了;也可以使其介于1到100K或一百万之间。@mikez:实际上,我正在生成一个随机数,guid是用来为生成器种子的。guid的可能副本不能保证由计算机地址和当前时间组成;这是类型1 guid。由NewGuid生成的guid实际上是随机类型4的guid。但你不应该为了安全目的而依赖这一事实;无法保证guid生成器已经过安全专家的审核,是否适合此用途。实际上,它是一个用于ajax请求的令牌,每个请求都会发出一个新令牌,以便令牌仅对一个请求有效。如果攻击者可以发出一系列请求,然后他可以推断出模式,如果有的话,然后猜出下一个。情况可能并非如此,但根据Lippert先生的解释,GUID并不能保证随机性。它的主要作用是保持唯一性,所有的GUID算法主要处理这个问题,还有一些问题,仍然与安全性无关……在实践中,type-4 GUID生成器使用的是一个加密强度小于的随机数生成器。这很好,但它的设计并不能抵抗分析攻击;这是类型1 guid。由NewGuid生成的guid实际上是随机类型4的guid。但你不应该为了安全目的而依赖这一事实;无法保证guid生成器已经过安全专家的审核,是否适合此用途。实际上,它是一个用于ajax请求的令牌,每个请求都会发出一个新令牌,以便令牌仅对一个请求有效。如果攻击者可以发出一系列请求,然后他可以推断出模式,如果有的话,然后猜出下一个。情况可能并非如此,但根据Lippert先生的解释,GUID并不能保证随机性。它的主要作用是保持唯一性,所有的GUID算法主要处理这个问题,还有一些问题,仍然与安全性无关……在实践中,type-4 GUID生成器使用的是一个加密强度小于的随机数生成器。这很好,但它的设计并不是为了抵御分析攻击。好吧,我将进入加密类。如果目标是生成一个既随机又唯一的数字,该怎么办?@devuxer:从非常仔细地定义唯一开始。例如,类型4 GUID在统计上是唯一的。如果我们有一台随机生成guid的计算机,那么我们预计会在30万亿年左右的时间里与特定的guid发生冲突。这就是你所关心的独特性吗?如果我们让世界上每台计算机都生成guid,而任何两台计算机都可能发生碰撞,那么我们预计大约一小时后会发生碰撞。这就是你所关心的唯一性吗?还是你关心其他的唯一性指标?一旦您仔细定义了唯一性度量,我们就可以讨论如何生成既不可预测又唯一的数字。对于我的特定用例,所有数字都将由一台机器生成,您描述的类型4 GUID的统计唯一性程度将非常充分。好,我将进入加密类。如果目标是生成一个既随机又唯一的数字,该怎么办?@devuxer:从非常仔细地定义唯一开始。例如,类型4 GUID在统计上是唯一的。如果我们有一台随机生成guid的计算机,那么我们预计会在30万亿年左右的时间里与特定的guid发生冲突。这就是你所关心的独特性吗?如果我们让世界上每台计算机都生成guid,而任何两台计算机都可能发生碰撞,那么我们预计大约一小时后会发生碰撞。这就是你所关心的唯一性吗?还是你关心其他的唯一性指标?一旦您仔细定义了唯一性度量,我们就可以讨论如何生成既不可预测又唯一的数字。对于我的特定用例,所有数字都将由一台机器生成,您描述的Type4 GUID的统计唯一性程度就足够了。