选项 1:md5 散列 bcrypt 输出
支持 OP 主要回答他自己的问题 :)
我认为它会满足您正在寻找的一切(32 个字符长度):
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"log"
"golang.org/x/crypto/bcrypt"
)
// GenerateToken returns a unique token based on the provided email string
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))
hasher := md5.New()
hasher.Write(hash)
return hex.EncodeToString(hasher.Sum(nil))
}
func main() {
fmt.Println("token:", GenerateToken("bob@webserver.com"))
}
$ 运行 main.go
哈希存储:$2a$10$B23cv7lDpbY3iVvfZ7GYE.e4691ow8i7l6CQXkmz315fbg4jLzoue
令牌:90a514ab93e2c32fdd1072154b26a100
以下是我之前提出的 2 条建议,我怀疑它们是否对您更有效,但可能对其他人有所帮助。
选项 2:base64
过去,我使用 base64 编码使令牌在加密/散列后更易于移植。这是一个工作示例:
package main
import (
"encoding/base64"
"fmt"
"log"
"golang.org/x/crypto/bcrypt"
)
// GenerateToken returns a unique token based on the provided email string
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 base64.StdEncoding.EncodeToString(hash)
}
func main() {
fmt.Println("token:", GenerateToken("bob@webserver.com"))
}
$ 运行 main.go
哈希存储:$2a$10$cbVMU9U665VSqpfwrNZWOeU5cIDOe5iBJ8ZVa2yJCTsnk9MEZHvRq
代币:JDJhJDEwJGNiVk1VOVU2NjVWU3FwZndyTlpXT2VVNWNJRE9lNWlCSjhaVmEyeUpDVHNuazlNRVpIdlJx
如您所见,不幸的是,并没有为您提供 16-32 个字符的长度。如果您可以接受 80 长的长度,那么这可能适合您。
选项 3:url 路径/查询转义
我也试过 url.PathEscape 和 url.QueryEscape 来彻底。虽然它们与 base64 示例存在相同的问题(长度,虽然有点短),但至少它们“应该”在路径中工作:
// GenerateToken returns a unique token based on the provided email string
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))
fmt.Println("url.PathEscape:", url.PathEscape(string(hash)))
fmt.Println("url.QueryEscape:", url.QueryEscape(string(hash)))
return base64.StdEncoding.EncodeToString(hash)
}
url.PathEscape: $2a$10$wx1UL6%2F7RD6sFq7Bzpgcc.ibFSW114Tf6A521wRh9rVy8dp%2Fa82x2
url.QueryEscape: %242a%2410%24wx1UL6%2F7RD6sFq7Bzpgcc.ibFSW114Tf6A521wRh9rVy8dp%2Fa82x2