简介
PHPpassword_hash

对于这个例子,我将创建一个控制台应用程序,用于演示如何获取用户输入的密码并使用它生成 salt 哈希值。 完成此操作后,我将通过比较密码与其散列版本来验证密码是否正确。

获取用户输入的密码

开始我们先创建一个可以在控制台读取用户输入的的方法。

func getPwd() []byte {
    fmt.Println("Enter a password")
    var pwd string

    // 读取用户输入
    _, err := fmt.Scan(&pwd)
    if err != nil {
        log.Println(err)
    }
    return []byte(pwd)

}
Hash & Salt 用户的密码
GenerateFromPassword(password []byte, cost int)([]byte, error)
GenerateFromPassword
GenerateFromPassword
func hashAndSalt(pwd []byte) string {
    hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost)
    if err != nil {
        log.Println(err)
    }
    return string(hash)
}
目前我们做了什么

到目前为止,我们已经创建了一个接受来自控制台的用户输入并将其作为字节切片返回的函数。 然后,
我们再创建一个可以接收用户输入并返回 salted 哈希值的函数。下面就是代码事例。

package main

import (
    "fmt"
    "log"
    "golang.org/x/crypto/bcrypt"
)

func main() {
   for {
        pwd := getPwd()
        hash := hashAndSalt(pwd)
        fmt.Println("Salted Hash", pwd)
     }
}

如果你运行上面的代码,将会得到下面的结果

> $ Enter a password
> $ foobar
> Salted Hash $2a$10$...........
while (true){}
验证密码
CompareHashAndPassword(hashedPassword, password []byte) error
CompareHashAndPassword
func comparePasswords(hashedPwd string, plainPwd []byte) bool {

    byteHash := []byte(hashedPwd)
    err := bcrypt.CompareHashAndPassword(byteHash, plainPwd)\
    if err != nil {
        log.Println(err)
        return false
    }
    return true
}
更新 Main 函数

我们现在可以更新我们的主要功能,以便我们能够输入密码,获取其盐渍哈希,然后再次输入密码,并查明我们的第二个密码是否与我们输入的第一个密码相匹配。
我们现在修改一个 main 函数,当我们输入密码的时候,获取 salted 哈希值,然后再次输入密码,来检查我们的密码是否匹配。

func main() {
    for {
        pwd := getPwd()
        hash := hashAndSalt(pwd)
        pwd2 := getPwd()
        pwdMatch := comparePasswords(hash, pwd2)
        fmt.Println("Passwords Match?", pwd)
    }
}
全部代码
package main

import (
    "fmt"
    "log"
    "golang.org/x/crypto/bcrypt"
)

func main() {
    for {
       // 输入密码 获取 hash 值
        pwd := getPwd()
        hash := hashAndSalt(pwd)
       // 再次输入密码验证
        pwd2 := getPwd()
        pwdMatch := comparePasswords(hash, pwd2)
        fmt.Println("Passwords Match?", pwd)
    }
}

func getPwd() []byte {
    fmt.Println("Enter a password")
    var pwd string
    _, err := fmt.Scan(&pwd)
    if err != nil {
        log.Println(err)
    }
    return []byte(pwd)
}

func hashAndSalt(pwd []byte) string {
    hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost)
    if err != nil {
        log.Println(err)
    }
    return string(hash)
}

func comparePasswords(hashedPwd string, plainPwd []byte) bool {
    byteHash := []byte(hashedPwd)

    err := bcrypt.CompareHashAndPassword(byteHash, plainPwd)
    if err != nil {
        log.Println(err)
        return false
    }
    return true
}

以上便是 GO 转 php 的加密函数的过程,如果有任何错误或者不当的地方欢迎进行改进