有人对password_verify()
函数的工作方式有想法吗?我在网上到处都搜索过有关该函数的信息,但是我从未找到关于如何比较其两个参数的具体答案。以下是根据php.net的上述函数的正确语法:
bool password_verify ( string $password , string `$hash` )
问题是,函数是否先对$password
进行哈希处理,然后将其与$ hash进行比较?或
它已消散$hash
,然后与$password
进行了比较?
答案 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
永远不会返回相同的值。