加密函数--Password Hashing

2021-03-10

加密与验证

//获取可用的密码哈希算法ID
password_algos():array

//使用足够强度的单向散列算法创建密码的散列,兼容crypt();在交互的系统上,推荐在自己的服务器上测试此函数,调整cost参数直至函数时间开销小于100毫秒
password_hash(string $password, mixed $algo, array $options = ?):string|false
    password 用户的密码
    algo 用来在散列密码时指示算法的密码算法常量
        当前支持的算法
            PASSWORD_DEFAULT  使用bcrypt算法,使用此常量生成结果的长度将在未来有变化
            PASSWORD_BCRYPT   使用CRYPT_BLOWFISH算法创建散列,结果将会是60个字符的字符串
            PASSWORD_ARGON2I  使用Argon2i散列算法创建散列,需要支持Argon2
            PASSWORD_ARGON2ID 使用Argon2id散列算法创建散列,需要支持Argon2
    options 包含有选项的关联数组,与密码算法相关。省略后将使用随机盐值与默认cost;cost在8-10是个不错的底线,在服务器够快的情况下,越高越好

//如果传入的散列值(hash)是由password_hash()支持的算法生成的,就会返回关于此散列的信息数组
password_get_info(string $hash):array
    hash  由password_hash()创建的散列值
    返回值
        algo 匹配密码算法的常量
        algoName 人类可读的算法名称
        options 调用password_hash()时提供的选项

//检测指定的散列值是否实现了提供的算法和选项。
password_needs_rehash(string $hash,mixed $algo, array $options = ?):bool
    hash 由password_hash()创建的散列值。
    algo 在散列密码时指定算法的密码算法常量。
    options 包含有选项的关联数组

//验证密码是否和散列值匹配
password_verify(string $password,string $hash):bool

算法常量

// 使用CRYPT_BLOWFISH算法创建新的密码哈希,哈希后的字符始终为60个字符
PASSWORD_BCRYPT
  option:
    salt(string):手动提供一个盐,以便在对密码进行哈希时使用。将覆盖并防止盐自动生成。省略将生成随机盐,自PHP7.0.0起,salt选项已弃用。
    cost(int):应使用的算法成本,默认10;

// 使用Argon2i算法创建新的密码哈希,PHP7.2.0起可用
PASSWORD_ARGON2I 
   option:
     memory_cost(int):用于计算Argon2哈希值的最大内存(以字节为单位)。默认为PASSWORD_ARGON2_DEFAULT_MEMORY_COST。
     time_cost(int):计算Argon2哈希值可能花费的最长时间。默认为PASSWORD_ARGON2_DEFAULT_TIME_COST。
     threads(int):用于计算Argon2哈希的线程数。默认为PASSWORD_ARGON2_DEFAULT_THREADS

// 使用Argon2id算法创建新的密码哈希,选项与PASSWORD_ARGON2I相同,PHP7.3.0起可用
PASSWORD_ARGON2ID

// 默认算法,在更新的PHP版本中,当支持更新、更强的散列算法时,这一点可能会改变。应以可以存储60个以上字符(建议的宽度为255)的方式存储结果散列
PASSWORD_DEFAULT

其他常量

// Argon2lib在尝试计算哈希值时将使用的默认内存量(以字节为单位)。PHP7.2.0起可用
PASSWORD_ARGON2_DEFAULT_MEMORY_COST

// Argon2lib尝试计算哈希所花费的默认时间。PHP7.2.0起可用
PASSWORD_ARGON2_DEFAULT_TIME_COST

// Argon2lib将使用的默认线程数。PHP7.2.0起可用
PASSWORD_ARGON2_DEFAULT_THREADS

 

{/if}