基于【GO】的cmf_password加密密码的逻辑,和校验密码逻辑

这篇具有很好参考价值的文章主要介绍了基于【GO】的cmf_password加密密码的逻辑,和校验密码逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 导入必要的包:

    import (
        "crypto/rand"
        "crypto/sha256"
        "encoding/hex"
        "fmt"
        "io"
    )
    

    这里导入了一些标准库的包,用于生成随机数、计算SHA-256哈希和处理十六进制编码。

  2. main 函数:

    • main 函数中,首先定义了要加密的原始密码 password
    • 使用 generateSalt 函数生成一个随机的盐值 salt
    • 然后,使用 hashPassword 函数将原始密码和盐值一起加密,生成 hashedPassword
    • 打印原始密码、加密后的密码和盐值的十六进制字符串表示。
    • 将盐值转换为十六进制字符串 saltString,以便将其存入数据库(这里没有实际的数据库操作,只是演示)。
    • 模拟密码验证过程,使用用户输入的密码 inputPassword 调用 verifyPassword 函数来验证密码是否有效。
  3. verifyPassword 函数:

    • 这个函数用于验证用户输入的密码是否与存储的哈希密码匹配。
    • 它使用相同的盐值和用户输入的密码来计算哈希值,并将其与存储的哈希密码进行比较。
    • 如果哈希值匹配,返回 true,否则返回 false
  4. generateSalt 函数:

    • 这个函数生成一个随机的盐值,用于密码加密。
    • 它创建一个长度为 32 字节的字节数组,然后使用 crypto/rand 包中的 ReadFull 函数填充数组以获取随机数据。
  5. hashPassword 函数:

    • 这个函数接受原始密码和盐值作为输入,并将它们连接在一起。
    • 然后,它使用 SHA-256 哈希函数计算连接后的数据的哈希值。
    • 最后,它将哈希值转换为十六进制字符串,并返回结果。

总之,这段代码演示了如何使用盐值和哈希函数来加密和验证用户密码,以提高密码安全性。盐值使得相同的密码在每次加密时都生成不同的哈希值,增加了密码的安全性,同时也可以防止彩虹表攻击等密码破解技术的应用。
完整代码:文章来源地址https://www.toymoban.com/news/detail-698268.html

package main

import (
	"crypto/rand"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"io"
)

func main() {
	// 要加密的密码
	password := "your_password_here"

	// 生成随机盐值
	salt, err := generateSalt()
	if err != nil {
		fmt.Println("生成盐值时发生错误:", err)
		return
	}

	// 使用盐值加密密码
	hashedPassword, err := hashPassword(password, salt)
	if err != nil {
		fmt.Println("加密密码时发生错误:", err)
		return
	}

	fmt.Println("原始密码:", password)
	fmt.Println("加密后的密码:", hashedPassword)
	fmt.Println("盐值:", hex.EncodeToString(salt))
	// 存入数据库时将盐值转换为十六进制字符串
	saltString := hex.EncodeToString(salt)

	// 将 saltString 存入数据库中的 user_salt 列
	// 你可以使用合适的数据库操作库来实现这一步
	// 例如,如果你使用了数据库/SQL库,你可以执行 INSERT 操作
	// 将 saltString 插入到相应的用户记录中
	// 假设从数据库中读取的 user_salt 列的值是 saltString
	saltS, err := hex.DecodeString(saltString)
	if err != nil {
		fmt.Println("从数据库中读取盐值时发生错误:", err)
		return
	}
	// 模拟验证过程
	inputPassword := "your_password_here" // 用户输入的密码
	isPasswordValid, err := verifyPassword(inputPassword, hashedPassword, saltS)
	if err != nil {
		fmt.Println("验证密码时发生错误:", err)
		return
	}

	if isPasswordValid {
		fmt.Println("密码验证成功")
	} else {
		fmt.Println("密码验证失败")
	}
}

// 验证密码
func verifyPassword(inputPassword string, storedHashedPassword string, salt []byte) (bool, error) {
	// 使用相同的盐值和输入密码计算哈希值
	hashedInputPassword, err := hashPassword(inputPassword, salt)
	if err != nil {
		return false, err
	}

	// 比较计算出的哈希值与存储的哈希密码是否相等
	return hashedInputPassword == storedHashedPassword, nil
}

// 生成一个随机的盐值
func generateSalt() ([]byte, error) {
	salt := make([]byte, 32) // 32字节的盐值
	_, err := io.ReadFull(rand.Reader, salt)
	if err != nil {
		return nil, err
	}
	return salt, nil
}

// 使用盐值对密码进行加密
func hashPassword(password string, salt []byte) (string, error) {
	// 将密码和盐值连接起来
	saltedPassword := append([]byte(password), salt...)

	// 计算SHA-256散列值
	hash := sha256.Sum256(saltedPassword)

	// 将散列值转换为十六进制字符串
	hashedPassword := hex.EncodeToString(hash[:])

	return hashedPassword, nil
}

到了这里,关于基于【GO】的cmf_password加密密码的逻辑,和校验密码逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Go编写一个可视化Navicat本地密码解析器

    开发小组在测试环境基于 docker 构建和迁移一个 MySQL8.x 实例,过程中大意没有记录对应的用户密码,然后发现某开发同事本地 Navicat 记录了根用户,于是搜索是否能够反解析 Navicat 中的密码掩码(这里可以基本断定 Navicat 对密码是采用了对称加密算法),于是发现了这个仓库

    2024年02月14日
    浏览(38)
  • 微信小程序使用CryptoJS加密PassWord(MD5)

    背景及环境: 微信小程序登录页面,需要加密登录密码发送给后端,使用 MD5 来加密密码 开发工具:微信开发者工具 npm安装CryptoJS 查看有哪些crypto的包 npm search crypto 找到自己需要的包安装 npm install crypto-js 构建 npm 使用微信开发者工具构建 npm 解决警告 出现警告报错,打开

    2024年02月04日
    浏览(53)
  • 身份证号码,格式校验:@IdCard(Validation + 原生实现校验逻辑)

    自定义一个用于校验 身份证号码 格式的注解 @IdCard ,能够和现有的 Validation 参数校验机制兼容,使用方式和其他校验注解保持一致(使用 @Valid 注解接口参数)。 本文使用原生方式实现校验逻辑,校验规则的实现较为基础;Hutool工具提供了更加完善的校验工具,可以考虑使

    2024年02月07日
    浏览(47)
  • Windows 11: 登录电脑不需要用 pin code 或者密码password

    家用电脑,每次登录都必须输入密码, 或者pin code, 特别麻烦。 百度了好几次, 一直没有找到好办法, 直到昨天, 终于找到了办法, 现在分享如下: 1. 鼠标放在任务栏上, 按右键,出现任务栏设置,进入“任务栏设置” 2. 点击账户-登录选项 3. 点开“PIN”,选择“取消”

    2024年02月16日
    浏览(214)
  • docker login 明文密码登录提示WARNING! Using --password via the CLI is insecure. Use --password-stdin.

    官方参考文档 要以非交互方式运行该命令,您可以设置 flag 以提供密码通过。使用防止密码最终出现在外壳的历史记录中, 或日志文件。 下面的示例从文件中读取密码,并使用以下命令将其传递给命令: 也可以以环境变量形式登录,以下示例从变量读取密码,然后使用ST

    2024年02月11日
    浏览(87)
  • uniapp 在ios中u-input password显示密码 不生效

    找到u-input文件  修改源码 将原本的:password=\\\"password || type === \\\'password\\\' || undefined加上||false即可

    2024年01月25日
    浏览(38)
  • 【Error】elasticsearch修改密码报错,elasticsearch-setup-passwords interactive

    报错信息: 解决方法 需要删除.security-7索引文件 将 elasticsearch.yml 配置文件中的 xpack.security.enabled: true 注释掉 重启es 查看索引 curl -XGET \\\"127.0.0.1:9200/_cat/indices\\\" -H \\\'Content-Type: application/json\\\' 如果显示 connection refused ,将 127.0.0.1 替换成真实ip地址 执行成功后会看见 .security-7 的索引

    2024年02月14日
    浏览(39)
  • MySQL基础学习: linux系统mysql 密码插件 validate_password安装

    1、没有安装mysql密码插件,执行命令:SHOW VARIABLES LIKE ‘validate_password%’; 2、安装mysql密码插件,执行命令:install plugin validate_password soname ‘validate_password.so’; 3、再次执行:SHOW VARIABLES LIKE ‘validate_password%’; 4、卸载mysql密码插件,执行命令:UNINSTALL PLUGIN validate_password; 5、再

    2024年02月03日
    浏览(51)
  • ES集群重新设置密码(第二次执行.elasticsearch-setup-passwords interactive报错)

    错误信息 当为es集群设置完一次密码之后,再次执行相同的命令 报错: 解决办法: 删除 .security-7 索引,然后重新执行上面命令即可,不用重启es集群

    2024年02月11日
    浏览(40)
  • Gitee ---- 在clone的时候需要用户密码 -- Incorrect username or password (access token)

    在gitee 使用 git clone 指令进行克隆的时候会出现一个弹出框 第一种 注意这里用户名是输入 邮箱地址、邮箱地址、邮箱地址 密码还是自己的登陆(gitee)的密码 问题: 凭证用户名和密码还是以前的,导致无法自动登陆(ps: 成功登陆过一次会自动生成凭证) 文字版: win + R 打开命令

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包