我必须为一个生成密码的程序生成一个在给定范围内的统一的、安全的随机整数。
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] rand = new byte[4];
rng.GetBytes(rand);
int i = BitConverter.ToUInt16(rand, 0);
int result = i%max; // max is the range's upper bound (the lower is 0)
此方法用于加密目的安全吗?如果不安全,我应该如何做?
4条答案
按热度按时间tcomlyy61#
你可以看看 niik/CryptoRandom.cs 中的CryptoRandom类,这是Stephen Toub和Shawn Farkas的 * 原始 * 版本,在这个类中,他们实现了几个看起来加密安全的随机数生成器。
我在我的项目中使用了下面的版本来生成随机整数。
s2j5cfk02#
公认的答案有两个问题。
用法
bbuxkriu3#
在.NET 6中,前面答案中使用的
RNGCryptoServiceProvider
现在是obsolete。对于加密随机数,只需使用
RandomNumberGenerator
静态方法,例如:ubbxdtey4#
从你的代码中我可以看出,你想从一个区间中得到一个随机整数。
.NET中包含了一个新的加密random number generator(从版本Core 3.0、Core 3.1、.NET 5、.NET 6、.NET 7 RC 1和.NET标准2.1开始)。
正如jws所提到的,以前使用的类RNGCryptoServiceProvider已被弃用。
你可以使用这个帮助器方法。它也可以很容易地替换不安全的System.Random的。
要模拟掷骰子,请按如下方式使用
如果你更喜欢用.Next()的“老方法”来使用它,你可以这样创建一个类(注意,这里用fromInclusive和toExclusive参数来代替seed):
示例:
注:
GetInt32(...)
的重载,它接受一个参数作为最大互斥值,该值从最小值0开始。如果需要,请随时更新代码并创建一个重载方法。