$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.SE和Cryptography.SE将来提出这样的问题?