random_bytes() - WordPress 函数参考中文文档

返回介绍

random_bytes()

发布于 2017-09-11 字数4016 浏览 916 评论 0

random_bytes( int $bytes )

Unless open_basedir is enabled, use /dev/urandom for random numbers in accordance with best practices


描述

Why we use /dev/urandom and not /dev/random


参数

$bytes

(int)
(Required)


返回值

(string)


源代码

File: wp-includes/random_compat/random_bytes_dev_urandom.php

function random_bytes($bytes)
{
    static $fp = null;
    /**
     * This block should only be run once
     */
    if (empty($fp)) {
        /**
         * We use /dev/urandom if it is a char device.
         * We never fall back to /dev/random
         */
        $fp = fopen('/dev/urandom', 'rb');
        if (!empty($fp)) {
            $st = fstat($fp);
            if (($st['mode'] & 0170000) !== 020000) {
                fclose($fp);
                $fp = false;
            }
        }

        if (!empty($fp)) {
            /**
             * stream_set_read_buffer() does not exist in HHVM
             * 
             * If we don't set the stream's read buffer to 0, PHP will
             * internally buffer 8192 bytes, which can waste entropy
             * 
             * stream_set_read_buffer returns 0 on success
             */
            if (function_exists('stream_set_read_buffer')) {
                stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
            }
            if (function_exists('stream_set_chunk_size')) {
                stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
            }
        }
    }

    try {
        $bytes = RandomCompat_intval($bytes);
    } catch (TypeError $ex) {
        throw new TypeError(
            'random_bytes(): $bytes must be an integer'
        );
    }

    if ($bytes < 1) {
        throw new Error(
            'Length must be greater than 0'
        );
    }

    /**
     * This if() block only runs if we managed to open a file handle
     * 
     * It does not belong in an else {} block, because the above 
     * if (empty($fp)) line is logic that should only be run once per
     * page load.
     */
    if (!empty($fp)) {
        $remaining = $bytes;
        $buf = '';

        /**
         * We use fread() in a loop to protect against partial reads
         */
        do {
            $read = fread($fp, $remaining); 
            if ($read === false) {
                /**
                 * We cannot safely read from the file. Exit the
                 * do-while loop and trigger the exception condition
                 */
                $buf = false;
                break;
            }
            /**
             * Decrease the number of bytes returned from remaining
             */
            $remaining -= RandomCompat_strlen($read);
            $buf .= $read;
        } while ($remaining > 0);
        
        /**
         * Is our result valid?
         */
        if ($buf !== false) {
            if (RandomCompat_strlen($buf) === $bytes) {
                /**
                 * Return our random entropy buffer here:
                 */
                return $buf;
            }
        }
    }

    /**
     * If we reach here, PHP has failed us.
     */
    throw new Exception(
        'Error reading from 源代码 device'
    );
}

Collapse full 源代码 code

View on Trac


相关函数

Uses

  • wp-includes/random_compat/cast_to_int.php:
    RandomCompat_intval()
  • wp-includes/random_compat/byte_safe_strings.php:
    RandomCompat_strlen()
  • wp-includes/random_compat/byte_safe_strings.php:
    RandomCompat_substr()

Used By

  • wp-includes/random_compat/random_int.php:
    random_int()

User Contributed Notes

上一篇:RandomCompat_substr()

下一篇:random_int()

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!