我正试着从PHP切换到Go,但我在一点上被困住了,我请求你的帮助.

我正在try 使用Argon2创建密码散列函数,但当我使用"argon2.Config{}"时,我一直收到错误"unfined:argon2.Config".我重新编译了这个项目很多次,但我似乎找不到解决方案.在这个问题上,我请求您的帮助.

func hashPassword(password string) []byte {
    // Şifreleme parametreleri
    timeCost := 1                 // İşlem süresi
    memory := 64 * 1024           // // Bellek miktarı
    threads := 4                  //  İş parçacığı sayısı
    keyLength := 32               // Oluşturulacak hash uzunluğu
    salt := []byte("unique_salt") // Her kullanıcı için benzersiz

    // Argon2 işlemi için hasher oluştur
    hasher := argon2.Config{
        Time:    uint32(timeCost),
        Memory:  uint32(memory),
        Threads: uint8(threads),
        KeyLen:  uint32(keyLength),
    }

    // Şifreyi hashle
    hashedPassword := hasher.Hash(password, salt, nil)

    return hashedPassword
}

undefined: argon2.Config

推荐答案

如果你用的是套餐"golang.org/x/crypto/argon2",你可以用argon2.IDKey()的方法.以下是一个有效的示例:

func HashPassword(password string) (hashedPassword string) {

    const (
        timeCost  uint32 = 1         // İşlem süresi
        memory    uint32 = 64 * 1024 // // Bellek miktarı
        threads   uint8  = 4         //  İş parçacığı sayısı
        keyLength uint32 = 32        // Oluşturulacak hash uzunluğu
    )

    salt := []byte("unique_salt") // Her kullanıcı için benzersiz

    // generate hashedpassword
    hash := argon2.IDKey([]byte(password), salt, timeCost, memory, threads, keyLength)

    // Base64 encode the salt and hashed password.
    b64Salt := base64.RawStdEncoding.EncodeToString(salt)
    b64Hash := base64.RawStdEncoding.EncodeToString(hash)

    format := "$argon2id$v=%d$models=%d,t=%d,p=%d$%s$%s"

    // final password in recommended format
    hashedPassword = fmt.Sprintf(format, argon2.Version, memory, timeCost, threads, b64Salt, b64Hash)
    return hashedPassword
}

Go相关问答推荐

使用恶意软件 scanner (ClamAV)时的Google云存储桶上传文件验证

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

使用Golang的Lambda自定义al2运行时,初始化阶段超时

Go Template if 条件

在 Cloud Run 中找不到默认凭据

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

如何使用带有方法的字符串枚举作为通用参数?

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

查找、解析和验证邮箱地址

为什么 Go 被认为是部分抢占式的?

未定义 protoc protoc-gen-go 时间戳

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

Golang grpc go.mod 问题

Golang 使用 docker 将敏感数据作为参数传递

K8s 算子读取原始数据

使用 LoadLibraryA(path_to_dll) 加载 DLL 会将文件描述符 0、1 和 2 的继承句柄标志 (HANDLE_FLAG_INHERIT) 从 1 更改为 0

手动下载并放置一个 golang mod 文件

如何使用通用字段初始化匿名struct数组

如何在 Prometheus 中正确检测区域和环境信息?

如果在调用 http.Get(url) 时发生错误,我们是否需要关闭响应对象?