概述

PBKDF2(Password-Based Key Derivation Function) 是一个用来导出密钥的函数,常用于生成加密的密码。原理是通过 password 和 salt 进行 hash 加密,然后将结果作为 salt 与 password 再进行 hash,多次重复此过程,生成最终的密文。如果重复的次数足够大(几千数万次),破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。

用户密码采用PBKDF2算法存储,比较安全。

代码

package pbkdf2import ("crypto/rand""crypto/sha256""encoding/base64"mathrand "math/rand""golang.org/x/crypto/pbkdf2"
)const (saltMinLen = 8saltMaxLen = 32iter       = 1000keyLen     = 32
)// EncryptPwd 加密密码
func EncryptPwd(pwd string) (encrypt string, err error) {// 1、生成随机长度的盐值salt, err := randSalt()if err != nil {return}// 2、生成加密串en := encryptPwdWithSalt([]byte(pwd), salt)en = append(en, salt...)// 3、合并盐值encrypt = base64.StdEncoding.EncodeToString(en)return
}func randSalt() ([]byte, error) {// 生成8-32之间的随机数字salt := make([]byte, mathrand.Intn(saltMaxLen-saltMinLen)+saltMinLen)_, err := rand.Read(salt)if err != nil {return nil, err}return salt, nil
}func encryptPwdWithSalt(pwd, salt []byte) (pwdEn []byte) {pwd = append(pwd, salt...)pwdEn = pbkdf2.Key(pwd, salt, iter, keyLen, sha256.New)return
}// CheckEncryptPwdMatch 验证密码是否与加密串匹配
func CheckEncryptPwdMatch(pwd, encrypt string) (ok bool) {// 1、参数校验if len(encrypt) == 0 {return}enDecode, err := base64.StdEncoding.DecodeString(encrypt)if err != nil {return}// 2、截取加密串 固定长度salt := enDecode[keyLen:]// 3、比对enBase64 := base64.StdEncoding.EncodeToString(enDecode[0:keyLen])pwdEnBase64 := base64.StdEncoding.EncodeToString(encryptPwdWithSalt([]byte(pwd), salt))ok = enBase64 == pwdEnBase64return
}

参考:
用户密码到底要怎么加密存储?

golang pbkdf2加密存储用户密码相关推荐

  1. 程序员必备基础:如何安全传输存储用户密码?

    前言 我们开发网站或者APP的时候,首先要解决的问题,就是「如何安全传输和存储用户的密码」.一些大公司的用户数据库泄露事件也时有发生,带来非常大的负面影响.因此,如何安全传输存储用户密码,是每位程序员 ...

  2. 如何安全存储用户密码/数据库安全存储密码的方式

    总的来讲,目前公认比较安全的存储密码方式是PBKDF2, BCrypt 或 SCrypt 算法产生的密码. 历史上密码加密存储经历了如下几个阶段: 1. 单向hash(MD5) 做单向的hash加密, ...

  3. 获取令牌密码_如何真正存储用户密码和api令牌(即密码)

    获取令牌密码 A cliché in posts detailing password storage schemes is to finish by telling the syadmins and ...

  4. 存储用户密码应该使用什么加密算法?比较合适

    概述 编程开发中,像用户登录注册这种功能很常见,那么对于用户密码处理,我们该选择什么样的加密算法呢?在这种场景下,算法需要满足下面两个条件: 算法需不可逆,这样才能有效防止密码泄露. 算法需相对慢,可 ...

  5. 如何安全的存储用户密码

    文章目录 1.明文存储(极不推荐) 2.使用MD5或其它算法哈希后存储(较不推荐) 3.加盐后哈希存储(较推荐) 4.使用BCrypt算法加密后存储(非常推荐) 5.Spring Boot中使用jbc ...

  6. php mysql md5加密_php 用户密码MD5加密存入数据库问题//

    比如说用户注册后,后台给用户密码MD5加密了在存入数据库,用户在登入的时候输入的密码要与数据库保存的密码对比.我想问的是,用户登入时,后台要把密码用MD5加密后才能与数据库的密码比较吗? 对,确实如此 ...

  7. Dropbox怎么安全地存储用户密码?

    使用的朋友都知道,DropBox是一个文件云端存储.备份.共享的软件.在 Dropbox 平台上,用户可以进行线上储存.共享协作.管理文档照片等各类资料.DropBox同时提供Windows.Linu ...

  8. 如何安全的存储用户密码?(中)代码篇

    PHP PBKDF2 密码hash代码 <?php /* * Password Hashing With PBKDF2 (http://crackstation.net/hashing-secu ...

  9. 用户密码加密存储十问十答,一文说透密码安全存储

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 程序员赵鑫 来源 | cnblogs.com/xinzh ...

最新文章

  1. 进阶学习(3.7) Flyweight Pattern 享元模式
  2. 开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo项目分析
  3. 标准库 - 输入输出处理(input and output facilities) lua
  4. Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
  5. English trip -- VC(情景课)10 C I like to watch TV. 我爱看电视
  6. Python 爬虫 实例项目 大全
  7. mybatis源码分析(方法调用过程)
  8. 解析取值_圆锥曲线——高中解析几何全归纳
  9. 苏宁张近东:春节期间拿出3亿补贴一线员工
  10. VALSE学习(十七):VALSE 2019报告总结
  11. mysql查询优化~group by知多少
  12. java影院座位订票代码_基于jsp的影院订票-JavaEE实现影院订票 - java项目源码
  13. 用Axure做页面原型设计
  14. 不瞒你说,我也参加过培训
  15. XML与XSD两兄弟
  16. Firefox火狐浏览器优化加速about:config配置
  17. 删除联想硬盘OEM分区——最简单方法
  18. linux的一些命令
  19. 【Matlab电力负荷预测】粒子群算法优化支持向量机预测电力负荷【含源码 1225期】
  20. Java8 IF ELSE IF 优化

热门文章

  1. 信管网2012下半年(11月)信息系统项目管理师论文预测与押题
  2. android压感测试,安卓最强压感识别的正确玩法
  3. 【项目】员工管理系统
  4. uni-app项目配置手机端底部的tab栏(一)
  5. 科普-牛顿第二定律的矢量形式
  6. Tizen系统开发尝试,写一个简单的游戏
  7. SOLO:Segmenting Objects by Locations
  8. PMDG Boeing 737NGX启动程序
  9. MQL4课程-交易函数下单及挂单
  10. 美容饮料俘获女性用户,是边喝边美还是鸡肋养颜?