password_hash()和password_verify() 的一些问题

1.password_hash()是php中的一个加密方法:


图1

2.password_verify() 是验证密码是否和散列值匹配:


图2

3.问题:

3.1:在password_hash()方法中,可以不用指定固定的salt,系统会随机产生一个salt值,但是在password_verify()是怎么知道这个盐值的?

答:

3.1.1.我居然发现这个东西,居然里面有。。。。,但是只有第21位,22位没有(心里mmp)。

图3

3.1.2.我继续看文档发现:


图4

mmp,返回的不是加密后的字符串,怎么就包含了这些信息了,继续百度。

3.1.3.百度后结论是:$2y$10$26d96bc3bcfd231ef987auSruUppNwFKFkRoz32E3mEzdCqUOyQA.

$2y:加密的版本号

$10:指明算法递归的层数

$26d96bc3bcfd231ef987a:salt(但是只有21位,但我输入了22位,mmp)

3.1.4.为什么是21位,这里有一个连接说得很清楚了(https://stackoverflow.com/questions/16280194/crypt-for-password-hashing-blowfish-produces-weird-output/16280909#16280909)

因为salt是base64的22个字节,base64的一个字节是6位的,所以21个就是126位,但是解码时,126位只能转成15.75 个字节(8位一个字节的),所以需要第22个字符(base64-6位的字符,6位的)的2位,所以需要22个6位字节,但是因为22位字节剩下的位数不够组成8位的字节所以被抛弃了

3.2,22位不同,加密后的却是一样的


图5


图6

因为2和3字节(base64)的前2位是相同的,而把22位(base64)字节转成16个8位的字节,只需要22位的字节(base64)提供前两位即可,所以加密出来的是一样的

你可能感兴趣的:(password_hash()和password_verify() 的一些问题)