zoukankan      html  css  js  c++  java
  • 随机数大揭秘

    参考文章:杨中科老师的《随机数是骗人的,.Net、Java、C为我作证》
    http://www.cnblogs.com/rupeng/p/3723018.html#!comments
     
    1.随机数的原理:
     "线性同余法":  第n+1个数=(第n个数*29+37) % 1000
    2.写一个自己的random
     1  static void Main(string[] args)
     2         {
     3             MyRandom mr = new MyRandom(8);//相同的种子,每次都会生成相同的随机数列,为了保证生成的随机数不同,就要每次都要有不同的种子,Envoironment.TickCount
     4             for (int i = 0; i < 10; i++)
     5             {
     6                 Console.WriteLine(mr.Next()); ;
     7             }
     8             Console.ReadKey();
     9         }
    10     }
    11     class MyRandom
    12     {
    13         private int seed;//字段seed
    14         public MyRandom(int seed)//构造函数
    15         {
    16             this.seed = seed;
    17         }
    18         public int Next()
    19         {
    20             int next = (seed * 29 + 37) % 1000;
    21             seed = next;
    22             return next;
    23         }
    24     }
    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命名空间下)来生成真随机数
  • 相关阅读:
    docker 构建带健康检查的redis镜像
    HP服务器 开启ILO
    [转]如何取得当前正在执行的shell脚本的绝对路径?
    解决方案:centos运行shell脚本时报“$' ': 未找到命令”
    Js控制滚动条
    json_decode时含有中文是解码问题(json_decode返回为null)
    Phaser开源2d引擎 html5游戏框架中文简介
    js 开启video全屏模式
    修改mysql用户名密码 和 PHPmysqlAdmin对应密码修改
    用javascript判断一个html元素是否存在的五种方法:
  • 原文地址:https://www.cnblogs.com/lucyliang/p/4749171.html
Copyright © 2011-2022 走看看