php – 在网络应用程序中收集熵以创建(更多)安全的随机数
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史
here)
当用户访问我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVER['REMOTE_ADDR'].$_SERVER['REMOTE_PORT']. $_SERVER['HTTP_USER_AGENT'].serialize($_POST).serialize($_GET).serialize($_COOKIE)); 注意:胡椒是一个每个站点/设置随机字符串手工设置. 那么我执行以下(My)SQL查询: $query="update `crypto` set `value`=sha1(concat(`value`,'$entropy')) where name='entropy'"; 这意味着我们将访客请求的熵与已经收集的其他人的熵相结合. 就这样. 那么当我们要生成随机数时,我们将收集的熵与输出结合起来: $query="select `value` from `crypto` where `name`='entropy'"; //... extract(unpack('Nrandom',pack('H*',sha1(mt_rand(0,0x7FFFFFFF).$entropy.microtime())))); 注意:最后一行是phpseclib的crypt_rand函数的修改版本的一部分. 请告诉我你有关熵收集/随机数生成的方案和其他想法/信息的意见. ps:我知道像/ dev / urandom这样的随机源.
在最好的情况下,您最大的危险是本地用户披露信息泄露.在最坏的情况下,整个世界都可以预测你的数据.任何可以访问您执行的相同资源的用户:相同的日志文件,相同的网络设备,相同的边界网关或与您和远程连接之间运行的同一行允许他们通过解开您的随机数来嗅探您的流量发电机.
他们会怎么做?为什么,information theory的基本应用和knowledge of cryptography当然是! 你没有错误的想法,虽然!用真实的随机来源种植您的PRNG通常是非常有用的,以防止上述攻击发生.例如,如果系统具有低熵或其随机性来源是可重现的,那么这个相同级别的攻击可以被理解为how 如果您可以充分确保种植您的熵池的流程(例如,通过通过安全路线收集来自多个来源的数据),有可能收听的可能性越来越小,越来越接近理想的one-time pad的加密质量. 换句话说,不要在PHP中使用一个单一的随机源将其输入单个Mersenne扭转器.在reading from your best,system-specific alternative to 这仍然会受到本地用户认识熵来源的攻击,但是保护机器并增加/ dev / random内的真实熵将使得他们在man-in-the-middle attack之前做肮脏的工作变得更加困难. 对于/ dev / random确实可以访问的情况,您可以很容易地种下它: >查看您的系统上使用 保护您的应用程序最好的运气. PS:您可能想在Security.SE和Cryptography.SE将来提出这样的问题? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |