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)提供前两位即可,所以加密出来的是一样的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 但凡一个有点追求的iOS开发,总得会点加密技术,要不然用户信息就有可能被其他人获取用来做一些对我们不利的事情。 一...
    软件iOS开发阅读 618评论 1 6
  • 0x01 目录 常见编码: ASCII编码 Base64/32/16编码 shellcode编码 Quoted-p...
    H0f_9阅读 12,930评论 2 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 2,974评论 0 7
  • 日复一日,才有年复一年。 年关近,“夕”将除。 “夕”,说是每一年的所有晦气,不如意。家家户户已经在张罗...
    黑_子阅读 276评论 1 1