Cryptographically secure unique id

前端 未结 3 711
故里飘歌
故里飘歌 2021-01-01 23:54

I want to generate cryptographically secure unique uuids using php.

uniqid() provides unique but not secure ids and openssl_random_pseudo_bytes() provides secure but

3条回答
  •  粉色の甜心
    2021-01-02 00:11

    I want to generate cryptographically secure unique uuids using php.

    Okay, that's easily done.

    uniqid() provides unique but not secure ids and openssl_random_pseudo_bytes() provides secure but not unique ids.

    What makes you think a cryptographically secure pseudorandom number isn't unique?

    /**
     * Return a UUID (version 4) using random bytes
     * Note that version 4 follows the format:
     *     xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
     * where y is one of: [8, 9, A, B]
     * 
     * We use (random_bytes(1) & 0x0F) | 0x40 to force
     * the first character of hex value to always be 4
     * in the appropriate position.
     * 
     * For 4: http://3v4l.org/q2JN9
     * For Y: http://3v4l.org/EsGSU
     * For the whole shebang: https://3v4l.org/LNgJb
     * 
     * @ref https://stackoverflow.com/a/31460273/2224584
     * @ref https://paragonie.com/b/JvICXzh_jhLyt4y3
     * 
     * @return string
     */
    function uuidv4()
    {
        return implode('-', [
            bin2hex(random_bytes(4)),
            bin2hex(random_bytes(2)),
            bin2hex(chr((ord(random_bytes(1)) & 0x0F) | 0x40)) . bin2hex(random_bytes(1)),
            bin2hex(chr((ord(random_bytes(1)) & 0x3F) | 0x80)) . bin2hex(random_bytes(1)),
            bin2hex(random_bytes(6))
        ]);
    }
    

    The above example conforms to the UUIDv4 specification and uses PHP7's random_bytes() function.

    For PHP 5 projects, you can use random_compat to polyfill random_bytes() from PHP 7.

提交回复
热议问题