对于 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 字符字母数字标记的最佳方法是什么?
最佳答案
正如已经提到的那样,您做错了,这是非常不安全的。
- 使用加密包生成安全 token 。此 token 完全随机且不与任何电子邮件相关联。
func GenerateSecureToken(length int) string {
b := make([]byte, length)
if _, err := rand.Read(b); err != nil {
return ""
}
return hex.EncodeToString(b)
}
- 创建将此 token 映射到用户标识符的数据库表,并在 API 请求期间对其进行验证。
关于go - 如何在 Golang 中生成唯一的随机字母数字标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45267125/