Go 如何实现 PHP 的密码加密解密 | Go 技术论坛


本站和网页 https://learnku.com/articles/27561 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Go 如何实现 PHP 的密码加密解密 | Go 技术论坛
Go
话题列表
社区 Wiki
优质外文
招聘求职
Go 实战教程
社区文档
登录
注册
Go
首页
Laravel
Go
PHP
Python
Vue.js
Java
MySQL
Rust
LK
Elasticsearch
F2E 前端
程序员
Server
Database
DevTools
Computer Science
手机开发
AdonisJS
社区
Wiki
教程
Go 实战教程首页
《G01 Go 实战:Web 入门》
《G02 Go API 实战》
《GX1 Golang 五分钟视频》
文档
社区文档首页
《高效的 Go 编程 Effective Go》
《Go Blog 中文翻译》
《Go 简易教程》
《Go 编程实例 Go by Example》
《Go 入门指南》
《Go 编程基础(视频)》
《Go Web 编程》
《Iris 框架中文文档》
《通过测试学习 Go 编程》
《Gin 框架中文文档》
《GORM 中文文档》
《Go SQL 数据库教程》
登录
注册
微信登录
Go 如何实现 PHP 的密码加密解密
14
17
JaguarJack 的个人博客
2569
创建于 4年前
更新于 7个月前
最近正在迁移自己的小项目,项目之前是基于 Laravel5.5 开发的。整个用户登陆也是基于框架的 Auth 包认证的。其中用户密码这块也是用到了 PHP 内置的函数 password_hash,用它进行密码加密。而且 PHP 默认使用的 PASSWORD_BCRYPT 算法。在使用 Go 的迁移过程中需要认证密码,所以就把这个过程记录下来。使用下面的例子来说明如何使用 GO bcrypt 包来对你的密码进行 hash 和 salt 加密
对于这个例子,我将创建一个控制台应用程序,用于演示如何获取用户输入的密码并使用它生成 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 用户的密码
现在我们可以使用 Go 的 bcrypt 包提供的GenerateFromPassword(password []byte, cost int)([]byte, error)方法对用户的密码进行 hash 和 salt 加密了。
GenerateFromPassword 方法以给定 cost 值返回密码的 Bcrypt 算法的 Hash 值,如果提供的 cost 值小于 Mincost 的话,将会默认使用 DefaultCost 代替
使用 GenerateFromPassword 函数的一个优势就是我们不需要自己来编写函数来生成 Salt,因为它会为我们自动生成一个 Salt。
下面的函数使用 GenerateFromPassword 生成 salted 哈希值,该哈希值作为字节切片返回。 然后我们将字节切片作为字符串返回,以便我们可以将 salted 哈希存储在数据库中作为用户密码。
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$...........
这里需要的注意的是我使用 for 循环调用函数,直到我强制停止它。对于那些不熟悉 GO 的人来讲,这个就和其他语言的 while (true){}是一样的效果。
验证密码
最后一件事儿就是需要验证密码的正确性来登陆我们的系统,我们可以使用 bcrypt 包提供的CompareHashAndPassword(hashedPassword, password []byte) error函数
CompareHashAndPassword 将 bcrypt 哈希密码与其纯文本进行比较。 成功时返回nil,失败时返回错误
我们使用CompareHashAndPassword函数来创建另一个返回 bool 值的函数让我们知道密码是否匹配。
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 的加密函数的过程,如果有任何错误或者不当的地方欢迎进行改进。
加密解密
go
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
举报
JaguarJack
Laravel 9.x 译者
578 声望
开发 @ catchadmin
见山是山,见水是水。亲见知识有个入处,见山不是山, 见水不是水。
14 人点赞
推荐文章:
更多推荐...
博客
GO面试题集锦快答[持续更新]
49
10
11个月前
博客
从开发到部署微服务保姆级视频教程
29
1年前
博客
构建 Go 应用 docker 镜像的十八种姿势
73
13
1年前
博客
史上最强代码自测方法,没有之一!
29
1年前
分享
分享一下最近的面试笔记
51
25
1年前
博客
微服务从代码到k8s部署应有尽有系列(一)
23
12
1年前
讨论数量: 1
排序:
时间
投票
Leesinyii
见习版主
13 声望
CEO @ 斗麦科技
:+1:
1年前
评论
评论
举报
讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
<a href="javascript:;" class="mr-2 ui popover text-mute" data-html="黏贴或拖拽图片至输入框内皆可上传图片">
<a href="javascript:;" class="mr-2 ui popover text-mute hide-on-mobile" data-html="支持除了 H1~H6 以外的GitHub 兼容 Markdown">
支持 MD
帮助
关注本文
评论
JaguarJack
开发 @ catchadmin
文章
45
粉丝
57
喜欢
174
收藏
196
排名:27
访问:23.4 万
关注
私信
所有博文
阅读模式
文章归档
1 篇
2023 年 6 月
1 篇
2023 年 3 月
3 篇
2023 年 2 月
1 篇
2023 年 1 月
1 篇
2021 年 4 月
1 篇
2020 年 7 月
1 篇
2020 年 2 月
1 篇
2019 年 9 月
4 篇
2019 年 8 月
5 篇
2019 年 7 月
2 篇
2019 年 6 月
1 篇
2019 年 5 月
13 篇
2019 年 4 月
1 篇
2019 年 3 月
9 篇
2018 年 5 月
最新文章
最受欢迎
1周前
分享一个非常好用的前后端分离开发小工具 clockwork
3个月前
面试了 Hypref 技术栈的公司
3个月前
Laravel 要发布两个新包, Laravel Folio 和 Laravel Volt
4个月前
基于 Laravel 的 CatchAdmin 新版本发布啦🎉
4个月前
Laravel 10 正式发布了
35
深度解密 Go 语言之 context
26
go 的 [] rune 和 [] byte 区别
19
Go Modules 详解使用
14
Go 如何实现 PHP 的密码加密解密
14
坚守岗位最后一天,又来了新的 Laravel Dashboard ✨
博客标签
laravel
channel
dingo
thinkphp
tp
面向对象
goroutine
雪花算法
j w t
模块
加密解密
源码
tp6
yuan ma
桃花源系列
go
社区赞助商
成为赞助商
社区赞助商
成为赞助商
关于 LearnKu
LearnKu 是终身编程者的修道场
做最专业、严肃的技术论坛
LearnKu 诞生的故事
资源推荐
《社区使用指南》
《文档撰写指南》
《LearnKu 社区规范》
《提问的智慧》
服务提供商
其他信息
成为版主
所有测验
联系站长(反馈建议)
粤ICP备18099781号-6
粤公网安备 44030502004330号
违法和不良信息举报
由 Summer 设计和编码 ❤
请登录
提交
忘记密码?
or
注册
第三方账号登录
微信登录
GitHub 登录
内容举报
匿名举报,为防止滥用,仅管理员可见举报者。
我要举报该,理由是:
垃圾广告:恶意灌水、广告、推广等内容
无意义内容:测试、灌水、文不对题、消极内容、文章品质太差等
违规内容:色情、暴利、血腥、敏感信息等
不友善内容:人身攻击、挑衅辱骂、恶意行为
科学上网:翻墙、VPN、Shadowsocks,政策风险,会被关站!
不懂提问:提问太随意,需要再做一遍《提问的智慧》测验
随意提问:提问没有发布在社区问答分类下
排版混乱:没有合理使用 Markdown 编写文章,未使用代码高亮
内容结构混乱:逻辑不清晰,内容混乱,难以阅读
标题随意:标题党、标题不释义
尊重版权:分享付费课程、破解软件(付费),侵犯作者劳动成果
其他理由:请补充说明
举报
取消