go - 如何在 Golang 中生成唯一的随机字母数字标记?

标签 go token

对于 RESTful 后端 API,我想生成唯一 url token 以用于对用户进行身份验证。

注册时提供的用于生成 token 的唯一数据是电子邮件地址。但是在生成 token 并将其发送给用户之后,我不需要解密收到的 token 来获取电子邮件或其他信息。因此加密可以是单向的。

最初我使用 bcrypt 来这样做:

func GenerateToken(email string) string {
    hash, err := bcrypt.GenerateFromPassword([]byte(email), bcrypt.DefaultCost)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Hash to store:", string(hash))

    return string(hash)

}

但由于 token 作为 url 参数(如 /api/path/to/{token})出现,我无法使用 bcrypt因为它会生成包含 / 的 token ,如下所示:

“$2a$10$NebCQ8BD7xOa82nkzRGA9OEh./zhBOPcuV98vpOKBKK6ZTFuHtqlK”

这会破坏路由。

所以我想知道在 Golang 中基于电子邮件生成一些独特的 16-32 字符字母数字标记的最佳方法是什么?

最佳答案

正如已经提到的那样,您做错了,这是非常不安全的。

  1. 使用加密包生成安全 token 。此 token 完全随机且不与任何电子邮件相关联。
func GenerateSecureToken(length int) string {
    b := make([]byte, length)
    if _, err := rand.Read(b); err != nil {
        return ""
    }
    return hex.EncodeToString(b)
}
  1. 创建将此 token 映射到用户标识符的数据库表,并在 API 请求期间对其进行验证。

关于go - 如何在 Golang 中生成唯一的随机字母数字标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45267125/

相关文章:

go - 执行外部程序/脚本并检测它是否请求用户输入

api - Power BI 在使用 API 时刷新在线数据集

c - CGO block 中的全局变量-GO中的内存泄漏和线程安全

go - 将 64 位整数 -1 打印为十六进制的格式在 golang 和 C 之间有所不同

go - 如何在循环中创建 map 键?

json - 在没有所有键名的情况下在 Go 中解码 JSON

javascript - Angular js : $locationChangeStart checking token

c# - JwtSecurityToken 是否有最短到期时间?

Drupal token 当前页面 :query

node.js - 如何使用feathersjs-authentication将JWT token 发送到客户端?