php单向字符串散列-加密封装

方文锋  2022-04-15 13:34:48  1412  首页学习PHP

代码如下:

 <?php

/**
 * 密码字符加密 crypt CRYPT_SHA512
 * @param string $str 加密字符串
 * @param string $salt 盐值,最大长度是16,中英文都可以,不过要注意一个中文字符占3个字节(utf-8)
 * @param int $rounds 循环次数,最小是 1000,最大是 999999999
 * @return string
 */
function pass_sha512($str = '', $salt = '', $rounds = 6000)
{
    $salt = substr($salt, 0, 16);
    ($rounds < 1000) && ($rounds = 1000);
    ($rounds > 999999999) && ($rounds = 999999999);
    return crypt($str, '$6$rounds=' . $rounds . '$' . $salt);
}

/**
 * 密码字符加密 crypt CRYPT_SHA256
 * @param string $str 加密字符串
 * @param string $salt 盐值,最大长度是16,中英文都可以,不过要注意一个中文字符占3个字节(utf-8)
 * @param int $rounds 循环次数,最小是 1000,最大是 999999999
 * @return string
 */
function pass_sha256($str = '', $salt = '', $rounds = 6000)
{
    $salt = substr($salt, 0, 16);
    ($rounds < 1000) && ($rounds = 1000);
    ($rounds > 999999999) && ($rounds = 999999999);
    return crypt($str, '$5$rounds=' . $rounds . '$' . $salt);
}

/**
 * 密码字符加密 crypt CRYPT_BLOWFISH,(>=PHP 5.3.7)
 * @param string $str 加密字符串
 * @param string $salt 盐值,长度是22,字符串只能是 [./0-9A-Za-z]
 * @param int $rounds 循环次数,04-31
 * @return string
 */
function pass_blowfish($str = '', $salt = '', $rounds = 11)
{
    ($rounds < 4) && ($rounds = '04');
    ($rounds > 31) && ($rounds = '31');
    $rounds = substr('0' . $rounds, -2);
    $salt = preg_replace('/[^\.\/0-9A-Za-z]/', '', $salt);
    (strlen($salt) < 22) && ($salt = str_pad($salt, 22, '.'));
    return crypt($str, '$2y$' . $rounds . '$' . $salt);
}

/**
 * 密码字符加密 crypt CRYPT_EXT_DES
 * @param string $str 加密字符串
 * @param string $salt 盐值,长度是4,字符串只能是 [./0-9A-Za-z]
 * @param string $rounds 循环次数,长度是4,字符串只能是 [./0-9A-Za-z]
 * @return string
 */
function pass_ext_des($str = '', $salt = '', $rounds = 'J1'){
    $rounds = ltrim($rounds . '', '0');
    $rounds = preg_replace('/[^\.\/0-9A-Za-z]/', '', $rounds . '');
    $rounds = substr($rounds, 0, 4);
    (strlen($rounds) !== 4) && ($rounds = str_pad($rounds, 4, '.'));
    $salt = preg_replace('/[^\.\/0-9A-Za-z]/', '', $salt);
    $salt = substr($salt, 0, 4);
    (strlen($salt) !== 4) && ($salt = str_pad($salt, 4, '.'));
    return crypt($str, '_' . $rounds . $salt);
}

/**
 * 密码字符加密 crypt CRYPT_STD_DES
 * @param string $str 加密字符串
 * @param string $salt 盐值,长度是2,字符串只能是 [./0-9A-Za-z]
 * @return string
 */
function pass_std_des($str = '', $salt = '')
{
    $salt = preg_replace('/[^\.\/0-9A-Za-z]/', '', $salt);
    $salt = substr($salt, 0, 2);
    (strlen($salt) !== 2) && ($salt = str_pad($salt, 2, '.'));
    return crypt($str, $salt);
}

/**
 * 密码字符加密 crypt CRYPT_MD5
 * @param string $str 加密字符串
 * @param string $salt 盐值,最大长度是8,超过部分还是取前面8个字符为盐值
 * @return string
 */
function pass_md5($str = '', $salt = '')
{
    $salt = substr($salt, 0, 8);
    return crypt($str, '$1$' . $salt);
}

function sha224($data = '', $raw_output = false)
{
    return hash('sha224', $data, $raw_output);
}

function sha256($data = '', $raw_output = false)
{
    return hash('sha256', $data, $raw_output);
}

function sha384($data = '', $raw_output = false)
{
    return hash('sha384', $data, $raw_output);
}

function sha512($data = '', $raw_output = false)
{
    return hash('sha512', $data, $raw_output);
}

function sha3_224($data = '', $raw_output = false)
{
    return hash('sha3-224', $data, $raw_output);
}

function sha3_256($data = '', $raw_output = false)
{
    return hash('sha3-256', $data, $raw_output);
}

function sha3_384($data = '', $raw_output = false)
{
    return hash('sha3-384', $data, $raw_output);
}

function sha3_512($data = '', $raw_output = false)
{
    return hash('sha3-512', $data, $raw_output);
}

?> 

如图: