password_verify()如何比较密码和哈希密码?

时间:2018-10-15 09:36:02

标签: php

有人对password_verify()函数的工作方式有想法吗?我在网上到处都搜索过有关该函数的信息,但是我从未找到关于如何比较其两个参数的具体答案。以下是根据php.net的上述函数的正确语法:

bool password_verify ( string $password , string `$hash` )

问题是,函数是否先对$password进行哈希处理,然后将其与$ hash进行比较?

它已消散$hash,然后与$password进行了比较?

2 个答案:

答案 0 :(得分:4)

由于哈希函数的全部意义是不能反转,因此package main import ( "os" "syscall" ) const ( // defined base colors ForegroundBlue uint = 1 ForegroundGreen uint = 2 ForegroundRed uint = 4 ForegroundIntensity uint = 8 BackgroundBlue uint = 16 BackgroundGreen uint = 32 BackgroundRed uint = 64 BackgroundIntensity uint = 128 // colors can also be mixed ForegroundGrey = ForegroundBlue | ForegroundGreen | ForegroundRed ForegroundWhite = ForegroundBlue | ForegroundGreen | ForegroundRed | ForegroundIntensity ) func main() { kernel32 := syscall.NewLazyDLL("kernel32.dll") setConsoleTextAttribute := kernel32.NewProc("SetConsoleTextAttribute") stdOutHandle := os.Stdout.Fd() attributes := ForegroundWhite | BackgroundRed ret, _, err := setConsoleTextAttribute.Call(stdOutHandle, uintptr(attributes)) if err != nil { panic(err) // calling kernel32.SetConsoleTextAttribute failed } if ret == 0 { print("Could not set the desired attributes") // TODO: call GetLastError to get more information } print("OK") } 不能使用选项2。

剩下选项1。

您还可以查看the source code,在那里您可以看到…

password_verify

...它先加密密码,然后...

zend_string *ret = php_crypt(ZSTR_VAL(password), (int)ZSTR_LEN(password), ZSTR_VAL(hash), (int)ZSTR_LEN(hash), 1);

…将哈希密码(/* We're using this method instead of == in order to provide * resistance towards timing attacks. This is a constant time * equality check that will always check every byte of both * values. */ for (i = 0; i < ZSTR_LEN(hash); i++) { status |= (ZSTR_VAL(ret)[i] ^ ZSTR_VAL(hash)[i]); } )与传入的哈希值(ret)比较

答案 1 :(得分:3)

没有“散列”之类的东西。哈希是一种单向函数。

password_verify的实际作用是,从password_hash给出的“哈希”中读取salt和哈希函数,然后使用给定的参数再次进行完全相同的哈希。

因此,使用password_verify而不是仅仅做$hash == password_hash('...')之类的事情很重要,因为password_hash可以使用另一个哈希算法并每次创建一个新的随机盐值。因此,在同一台计算机上用相同的输入多次调用password_hash永远不会返回相同的值。