ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Go语言(Golang)密码加密存储(数据库中密码存储)

2020-06-30 09:10:26  阅读:767  来源: 互联网

标签:存储 err fmt Golang 密码 Println Password bcrypt


很多系统都是将密码进行一次 MD5 或 SHA1 Hash后存入数据库中。这样的密码抵挡不住字典攻击。所谓字典攻击,就是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。

为了抵御字典攻击,推荐的做法是使用 密码 + 盐(一串随机数) 再Hash的方式。每个密码对应一个不同的随机数。这个方法,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者无法构造这么大的一个字典。

Go语言提供了一种较为安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模块,通过该模块可以快速实现密码的存储处理。

package main

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

type User struct {
	Name     string `json:"name"`
	Password string `json:"password"`
}

func main() {
	fmt.Println("====模拟注册====")
	u0 := User{}
	u0.Password = "pwd" //模拟注册是传递的密码
	hash, err := bcrypt.GenerateFromPassword([]byte(u0.Password), bcrypt.DefaultCost) //加密处理
	if err != nil {
		fmt.Println(err)
	}
	encodePWD := string(hash) // 保存在数据库的密码,虽然每次生成都不同,只需保存一份即可
	fmt.Println(encodePWD)

	fmt.Println("====模拟登录====")
	u1:=User{}
	u1.Password=encodePWD //模拟从数据库中读取到的 经过bcrypt.GenerateFromPassword处理的密码值
	loginPwd:="pwd" //用户登录时输入的密码
	// 密码验证
	err = bcrypt.CompareHashAndPassword([]byte(u1.Password), []byte(loginPwd)) //验证(对比)
	if err != nil {
		fmt.Println("pwd wrong")
	} else {
		fmt.Println("pwd ok")
	}

}

运行效果:

第一次运行:

第二次运行:

说明:每次运行,计算的密码值都不同。因此使用GoLang golang.org/x/crypto/bcrypt 模块对密码进行处理,可以避免字典攻击。

附:密码强弱的判断

方法1:正则表达式判断(长度、大小写、特殊字符)

方法2:建立一个若密码表,依据表中的密码判断是否为若密码

注:以上2种方法可以结合使用

标签:存储,err,fmt,Golang,密码,Println,Password,bcrypt
来源: https://blog.csdn.net/weixin_42117918/article/details/107003197

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有