随机数大揭秘
2015-08-21 22:22
417 查看
参考文章:杨中科老师的《随机数是骗人的,.Net、Java、C为我作证》 http://www.cnblogs.com/rupeng/p/3723018.html#!comments
1.随机数的原理:
"线性同余法": 第n+1个数=(第n个数*29+37) % 1000
2.写一个自己的random
View Code
3..net内部的Random()用反编译工具可以看到种子为Environment.TickCount,这样就保证每次生成的随机数是基本上不同的。
4.然而Random ran=new Random()必须放在for循环的外面,
原因是for循环的运行速度很快,所以运行时Enviroment.ClickCount还是上次的值,所以产生的是相同的随机数
5.然而网站如果用随机数生成验证码,遇到高并发情况时,一微秒内会有多个人同时访问,就会造成几个人请求的验证码是相同的,系统就存在潜在的漏洞。那么这样的问题要如何解决呢?
1)将Random对象做一个全局实例来使用,Java中的Random是线程安全的(内部加锁),而.net的Random是线程不安全的,需要加锁,加锁会降低效率,而且由于初始的种子是确定的,所以攻击者存在着根据得到的若干随机数序列推测出"随机数种子"的可能性。
2)用Guid值获取HashCode或者MD5值作为种子。但是Guid也是根据某种算法算出来的,虽然随机的可能性增大,但是并不是真正的随机数
3)真随机数发生器
.Net下也可以使用RNGCryptoServiceProvider 类(System.Security.Cryptography命名空间下)来生成真随机数
1.随机数的原理:
"线性同余法": 第n+1个数=(第n个数*29+37) % 1000
2.写一个自己的random
static void Main(string[] args) { MyRandom mr = new MyRandom(8);//相同的种子,每次都会生成相同的随机数列,为了保证生成的随机数不同,就要每次都要有不同的种子,Envoironment.TickCount for (int i = 0; i < 10; i++) { Console.WriteLine(mr.Next()); ; } Console.ReadKey(); } } class MyRandom { private int seed;//字段seed public MyRandom(int seed)//构造函数 { this.seed = seed; } public int Next() { int next = (seed * 29 + 37) % 1000; seed = next; return next; } }
View Code
3..net内部的Random()用反编译工具可以看到种子为Environment.TickCount,这样就保证每次生成的随机数是基本上不同的。
4.然而Random ran=new Random()必须放在for循环的外面,
原因是for循环的运行速度很快,所以运行时Enviroment.ClickCount还是上次的值,所以产生的是相同的随机数
5.然而网站如果用随机数生成验证码,遇到高并发情况时,一微秒内会有多个人同时访问,就会造成几个人请求的验证码是相同的,系统就存在潜在的漏洞。那么这样的问题要如何解决呢?
1)将Random对象做一个全局实例来使用,Java中的Random是线程安全的(内部加锁),而.net的Random是线程不安全的,需要加锁,加锁会降低效率,而且由于初始的种子是确定的,所以攻击者存在着根据得到的若干随机数序列推测出"随机数种子"的可能性。
2)用Guid值获取HashCode或者MD5值作为种子。但是Guid也是根据某种算法算出来的,虽然随机的可能性增大,但是并不是真正的随机数
3)真随机数发生器
.Net下也可以使用RNGCryptoServiceProvider 类(System.Security.Cryptography命名空间下)来生成真随机数
相关文章推荐
- 初读《围城》
- 检查二叉树是否平衡
- EntityFramework之DetectChanges's Secrets(三)(我为EF正名)
- 闭包作用
- 读博文有感
- js的DOM(节点属性)
- Centos 6.6 创建桌面图标
- The Doors 最短路 + 简单几何
- OC学习--<猜拳游戏> 之 通过面向对象思想实现 2.0版本
- 近期学习计划
- 将博客搬至CSDN
- hdu1532Drainage Ditches裸的网络流
- OC学习--<猜拳游戏> 之 通过面向对象思想实现 2.0版本
- leetcode3:Longest Substring Without Repeating Characters
- Classification and logistic regression
- windows下面常用的***测试命令
- Meteor.call Wrapper
- GDOI2016模拟8.21新Nim游戏
- C函数返回局部变量
- 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)