生成10位数的安全令牌

时间:2012-02-12 23:53:22

标签: c# security

我正在研究生成10位数安全令牌的算法和方法。我尝试了以下内容:

        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        var buffer = new byte[4];
        rng.GetBytes(buffer);
        int result = BitConverter.ToInt32(buffer, 0);
        var token = Math.Abs(result).ToString();

问题是RNGCryptoServiceProvider似乎返回大约9到10位数。我考虑添加一个额外的随机数,如果它包含少于10位,但我不相信这是最好的方法。

感谢任何建议或建议。

2 个答案:

答案 0 :(得分:1)

只需用零填充结果即可得到10位数。此外,您应该使用ulong来获取10位数的全部范围。

var buffer = new byte[8]; // 8 bytes for a long
rng.GetBytes(buffer);
ulong result = BitConverter.ToUInt64(buffer, 0); // unsigned to avoid having to use Abs
var token = result.ToString("D10"); // pads the result to 10 digits
token = token.Substring(token.Length - 10); // strip out extra digits, if any

答案 1 :(得分:1)

使用

var buffer = new byte[5];
...
long result = BitConverter.ToInt64(buffer, 0);

并且可选地删除一些数字(使用模运算或字符串运算)