php – 在网络应用程序中收集熵以创建(更多)安全的随机数

前端之家收集整理的这篇文章主要介绍了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 /dev/random gets populated on a per-system basis的人利用.

如果您可以充分确保种植您的熵池的流程(例如,通过通过安全路线收集来自多个来源的数据),有可能收听的可能性越来越小,越来越接近理想的one-time pad的加密质量.

换句话说,不要在PHP中使用一个单一的随机源将其输入单个Mersenne扭转器.在reading from your best,system-specific alternative to /dev/random之前,请妥善处理熵池,尽可能多的安全,不同的“真实”随机来源.我明白你已经表示这些随机性来源是无法访问的,但是当所有主要操作系统都提供相似的功能时,这个概念是奇怪的.所以,我想我在这个上下文中发现一个“辅助系统”的概念是可疑的.

这仍然会受到本地用户认识熵来源的攻击,但是保护机器并增加/ dev / random内的真实熵将使得他们在man-in-the-middle attack之前做肮脏的工作变得更加困难.

对于/ dev / random确实可以访问的情况,您可以很容易地种下它:

>查看您的系统上使用/dev/hw_random有哪些选项
>拥抱rngd(或一个很好的选择)来定义你的随机来源
>使用rng-tools检查和改进您的随机
>最后,如果你需要一个很好的强大的随机来源,那么考虑投资in more specialized hardware.

保护您的应用程序最好的运气.

PS:您可能想在Security.SECryptography.SE将来提出这样的问题?

猜你在找的PHP相关文章