V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
horsley
V2EX  ›  奇思妙想

如何做一个有公信力的随机数服务?

  •  
  •   horsley · 2013-12-28 16:22:15 +08:00 · 6102 次点击
    这是一个创建于 3985 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前面的风风火火的送Air事件,规则制定问题引起我的思考。
    突然想做一个提供随机数的网站,网上有random.org但那是提供制定参数并产生随机数的服务,这不是我想要的。

    看看我们的抽奖,都是需要一个类似于随机数的东西,但是要保证有公信力这个随机数一般来源于我们所不能直接有效控制的东西,例如双色球开奖结果。但是双色球一周才开3次。

    于是我想了一些办法,核心是找一种东西(属性是:大家可以方便获得,大家能够获得同样的结果,大家不能控制,下面称:随机源),然后做sha1 hash,做完之后去掉其中的字母得出来一个数字。然后这个数字就可以拿来用了,包括取尾数、跟楼层号取余什么的。如何确保这个数字不是我乱编的?答案就是我能提供hash计算的源数据,基于一个认识:我不能通过hash逆向出源数据,即便是通过hash碰撞的话,我提供的源数据也不会被大家接受(这里假定我要造出与真实数据格式一致,例如一个合法的js,并且能够碰撞hash的概率无限小)

    如何确保我没有作弊?我想这套程序可以开源,大家可以很方便的自己部署,在同一个时间段内,使用相同的随机源,应该能够得到一样的结果。随机源举例http://www.zhcw.com/kaijiang/kjData/2012/zhcw_3d_index_last30.js
    这是中彩网 福彩3d的最近30期开奖信息的数据js,开奖是每天20:30

    上述这个我想到的一个缺点是:不能根据时间需要随时得到结果,而受制于随机源的变化周期(例如开奖时间,甚至是网站的数据更新时间)。

    所以后来我又想了另一种激进的办法,利用公开的验证码服务,例如google的recaptcha,例如通过challenge接口,可以取得一个随机的challenge值(k参数是我开的一个账号的公钥)
    http://www.google.com/recaptcha/api/challenge?k=6LfZTewSAAAAALFcRd1tedv6_r4Wkbff_EBKlsIe

    把这个作为随机源,那么可以认为这个随机源没有时间限制,可以不受限制的取得(当然频率过高还是感觉会被ban的),如何确保我不是为了一己之利故意制造一个特定的challenge值,然后让最终产生的数字满足我的利益?
    第一,这个challenge值由google产生,不正确(伪造)的challenge值不能调取到正确的验证码图片
    图片接口(c参数为challenge值)
    http://www.google.com/recaptcha/api/image?c=03AHJ_VutjpecRFGdtpVWFCR5J7KMfYR-aeog71PiAjb7O1ZOl9wikMj-d3GaFOjbmvgHP7E1REvu0F0DaUCNik4Deeur78dpgCW14g3C8evs10dBlzhmBs1d4rHFfMTv44kvEw3vLSYg2vCECfjsuALpDwUrCSwMN-MGykkza7vkUNffhpSGKgUU

    但是,如何确保我不是通过大量刷新不停的尝试直到找到合适的值?想了一下好像没有办法,如果recaptcha这个接口里面加上生成时间戳的话或许可以。这个方法还有缺点就是他不像第一个描述的方法那样可以在别处重现相同结果了。


    说的有点乱,希望大家不吝赐教
    35 条回复    1970-01-01 08:00:00 +08:00
    niseter
        1
    niseter  
       2013-12-28 16:28:09 +08:00
    电脑都是随机数表,你要完全随机不如扔硬币
    horsley
        2
    horsley  
    OP
       2013-12-28 16:30:05 +08:00
    @niseter 我上面描述的都是通过hash得到数字,而不是系统的伪随机数
    hzlzh
        3
    hzlzh  
       2013-12-28 16:30:28 +08:00
    反证法:如果你做出来了这个服务叫A,我不需要去刷新A找到适合的值,我只需要Hack掉A所在的主机服务器,然后篡改随机数即可,所以公信力不足。

    思路:做随机数服务还是应该去中心化,比如用 比特币 的思路,每个人都能取到数据,公信力自然就不用说了。
    faceair
        4
    faceair  
       2013-12-28 16:31:35 +08:00   ❤️ 1
    比特币系统每隔10分钟会产生一个新的block,同时产生一组比特币,这个过程类似彩票开奖,同时会产生一个Blockhash值,这个值可以类比于彩票的中奖号码,想提前猜中这个值几乎不可能。
    查询网址:https://blockchain.info/


    via:http://www.zhihu.com/question/22298502
    hzlzh
        5
    hzlzh  
       2013-12-28 16:35:00 +08:00
    补充一下,也就是说我不信任 random.org 这样的服务,建议看一下楼上提到的那个知乎的问题,比特币的不可篡改性
    horsley
        6
    horsley  
    OP
       2013-12-28 16:35:37 +08:00
    @hzlzh 有道理,我想到的是通过简单的办法。
    例如描述的第一种,开源,大家使用相同的随机源,相同的代码能够得到相同的值,即便你黑掉A,其他镜像可以随时建立起来,并且能够得出相同的值
    但是如果你要黑掉随机源……那还真没办法的感觉,只能找一个强壮的源例如google并且假定能被黑掉的概率足够小
    hzlzh
        7
    hzlzh  
       2013-12-28 16:39:45 +08:00
    @horsley 当利益大到一定的程度的时候,你能确保 Google 的某个员工不会动一下时间戳什么的?
    比如很多人把截图发到 新浪微博 或者 百度贴吧 去证明上传时间,因为他们信任这些服务。
    但是贴吧里那么多预言贴谁能保证不是 管理员修改时间戳来炒作呢?
    horsley
        8
    horsley  
    OP
       2013-12-28 16:43:57 +08:00
    @hzlzh 有理,那我们求一个在小利益下(例如抽奖Air)的合适方案吧,也就是说不考虑极限情况
    hzlzh
        9
    hzlzh  
       2013-12-28 16:48:18 +08:00
    @horsley 双色球 或 比特币Blockhash 完美
    horsley
        10
    horsley  
    OP
       2013-12-28 16:51:33 +08:00
    @hzlzh 如果要求1分钟的生成周期呢,比特币了解一些,刚才也看了下blockchan上面的hash,生成时间好像不是10min稳定值。双色球的话一周三次周期太长了
    hzlzh
        11
    hzlzh  
       2013-12-28 16:57:56 +08:00
    @horsley 既然说了不考虑极限情况,需要1分钟随机数生成周期的是个什么活动?金额多少?
    金额不超过1w,可以直接用 random.org,每人会为了1W块去hack这个站的
    Sunyanzi
        12
    Sunyanzi  
       2013-12-28 17:05:41 +08:00
    @horsley 其实我觉得在电子领域的随机没有那么复杂 ... 你甚至可以直接取当前时间戳的 hash ...

    这类似于一个伪随机数列 ... 虽然每一个结果都是固定的 ... 但你无法决定结果是什么 ...

    如果这样还是让你觉得不安心 ... 那么我们可以加上类似随机种子的机制 ...

    比如用比特币的 hash 拼上时间戳再取 hash ... 保证下一个十分钟会产生的值无法被预知 ...
    jacy
        13
    jacy  
       2013-12-28 17:41:37 +08:00
    可以自己建个算法脚本,用rar打包,提前上传就可以了,让大家下载,但是设置密码,开奖时公布密码,大家可以查看脚本。
    yelite
        14
    yelite  
       2013-12-28 17:50:15 +08:00 via iPhone
    @jacy rar打包带有结果的文本就行了,不需要脚本了吧
    loading
        15
    loading  
       2013-12-28 18:05:11 +08:00 via iPhone
    @yelite 既然知道结果,叫熟人去刷那一个数?
    est
        16
    est  
       2013-12-28 18:26:58 +08:00   ❤️ 4
    搞那么复杂干嘛。不如抢楼层。
    panlilu
        17
    panlilu  
       2013-12-28 19:22:23 +08:00 via iPhone
    比特币block的hash是个好主意
    scg16
        18
    scg16  
       2013-12-28 19:33:42 +08:00
    抢指定楼层、抢某时某秒第一个回复的楼层。
    hzlzh
        19
    hzlzh  
       2013-12-28 20:26:37 +08:00
    @scg16 不科学,比如在 V2 抢楼前提是你信任V2的数据库。
    反观问题之初:如何做一个有**公信力**的随机数服务?
    yelite
        20
    yelite  
       2013-12-28 21:13:34 +08:00 via iPhone
    @loading 等活动结束再公布rar的密码
    Hyperion
        21
    Hyperion  
       2013-12-28 22:09:16 +08:00
    其实重点不是block的hash, 是P2P啊……
    icanc
        22
    icanc  
       2013-12-28 22:10:50 +08:00
    收集所有用户回复合并成文本,并公开,保证所有用户都能在文本里找到自己的回复, 利用文本做散列,再用该散列做随机数种子。
    icanc
        23
    icanc  
       2013-12-28 22:12:42 +08:00
    不用做随机数种子,散列本身就能做随机数了。
    txlty
        24
    txlty  
       2013-12-28 23:02:24 +08:00
    @icanc 结果就是,还没开奖,谁都知道出什么数了。相当于每一个新回复,刷新一下随机数结果。
    yangff
        25
    yangff  
       2013-12-28 23:33:17 +08:00
    某支股票的收盘价格。
    别提64.89了好么,
    likuku
        26
    likuku  
       2013-12-29 00:17:39 +08:00
    @hzlzh 截图…额,他们忘记世上有家软件公司叫Adobe了么...
    hzlzh
        27
    hzlzh  
       2013-12-29 00:47:56 +08:00
    @likuku 你讲什么图片? 你跟一个前端谈Adobe PS?
    我那是举例子,谈的是图片的发布时间可以用 BTC 来证明
    hzlzh
        28
    hzlzh  
       2013-12-29 00:50:45 +08:00
    @likuku 上面那条字敲错了,撤销。
    的确他们不知道PS,而且不知道视频也能作假和伪造。
    likuku
        29
    likuku  
       2013-12-29 00:51:58 +08:00
    @hzlzh 「比如很多人把截图发到 新浪微博 或者 百度贴吧 去证明上传时间」

    我是说,这样以为截图就能证明真相就不靠谱,伪造截图并非不可能。
    hzlzh
        30
    hzlzh  
       2013-12-29 00:53:10 +08:00
    @likuku 是啊,这种截图经常遇到,太容易ps了
    (刚我看错了你的回复,囧)
    likuku
        31
    likuku  
       2013-12-29 00:56:37 +08:00
    @hzlzh 看到了,没事,没关系的~
    tywtyw2002
        32
    tywtyw2002  
       2013-12-29 08:45:48 +08:00
    彩票的某一期 然后hash一下呗。
    Lone
        33
    Lone  
       2013-12-29 14:47:50 +08:00
    股市收盘指数,A股H股美股伦敦东京等等,甚至石油价格也可以
    loading
        34
    loading  
       2013-12-29 15:16:07 +08:00 via iPhone
    用北京mp2.5某时某刻指数,最时髦。当然要指定数据提供商
    quake0day
        35
    quake0day  
       2013-12-31 02:56:51 +08:00
    @loading 这个熵源的熵值未必够,而且bias比较大。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.