gpt4 book ai didi

go - golang中的等效盐和哈希

转载 作者:IT老高 更新时间:2023-10-28 13:07:36 25 4
gpt4 key购买 nike

这是一个在 python 中对给定密码进行加盐和散列的示例。

import scrypt
import os

# Length of salt
PW_SALT_BYTES = 32
# Length of scrypt hash of passwords
PW_HASH_BYTES = 64
# test password
password = "hello"

salt = os.urandom(PW_SALT_BYTES).encode('hex')
# hash(password, salt, N=1 << 14, r=8, p=1, buflen=64)
hashed_password = scrypt.hash(str(password), salt.decode('hex'), buflen=PW_HASH_BYTES).encode('hex')
print(hashed_password)

这会给我们一个散列和加盐的字符串作为返回:-

4d1da45b401961fccb10e094ecd70ec79510f05483ca293d300bbd0024e35866ca39fe09fbc15f83a359431021a1ed9644f7d2b871b357e37a186300877edb18

我将如何在 golang 中实现这一点?

最佳答案

而不是使用 scrypt,在 Golang 中使用随机盐安全地散列密码的一个很棒的库是 golang.org/x/crypto/bcrypt ,如以下答案所述:

Bcrypt password hashing in Golang (compatible with Node.js)?

使用 bcrypt 代替 scrypt 的几个好处:

  1. 盐是在对密码进行哈希处理时自动(随机)生成的,因此您不必担心盐的生成。
  2. 在数据库中存储散列密码时,您不必再担心存储每个密码散列的盐值。
  3. 简化了哈希和检查密码的语法。
  4. bcrypt 产生的哈希包括 bcrypt 版本、成本、盐和密码,而不仅仅是密码。

这是从上述答案中提取的使用 bcrypt 的示例:

package main

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

func main() {
password := []byte("MyDarkSecret")

// Hashing the password with the default cost of 10
hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
if err != nil {
panic(err)
}
fmt.Println(string(hashedPassword))

// Comparing the password with the hash
err = bcrypt.CompareHashAndPassword(hashedPassword, password)
fmt.Println(err) // nil means it is a match
}

关于go - golang中的等效盐和哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23039458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com