首先,您正在生成 128 个随机字节,而不是随机位。但是您的澄清使一切变得不同:
我正在以安全的方式构建服务器/客户端应用程序。用户连接到服务器后,要与连接到该服务器的其他用户通信,必须对其进行身份验证。用户向服务器询问身份验证,服务器用 128 位随机数回答客户端。
在这种情况下,即使您考虑到您生成的比特数是八倍多的事实,您的解决方案也是非常非常错误的。System.Random
只是伪随机的,实际上在你做种子时只有 31 位熵。(*) 为了安全起见,您需要所有 128 位熵。
请记住,每一个缺失的部分都会使问题变得容易攻击一半;如果你需要 128 位熵而你有 31 位,那么问题就不会比攻击更容易四倍。问题是 2 128-31 = 10 29倍更容易攻击!
巧合的是,我刚刚写了一篇关于此的博客文章。我挑战读者找出我在Random
只给出前五六张牌时洗过的一副牌的其余部分。有人在几个小时内通过蛮力找到了解决方案。随机性非常弱。. 见http://ericlippert.com/2013/05/06/produce-permutations-part-seven/
如果您需要安全系统的加密强度随机性,那么您需要使用具有超过 128 位熵的特殊用途随机源。
因此 CodeInChaos 的答案是正确的。
这个故事有两个寓意:
首先,这就是设计安全系统如此困难的原因。有很多细节需要做对,你必须把所有细节都做对,否则系统就不安全。
其次,确保您在问题中提供足够的信息以获得好的答案。
(*) 事实上,它的数量要少得多,因为这 2 31个可能的种子中的一些比其他种子更有可能。