Go 如何使用md5生成随机令牌

Go 如何使用md5生成随机令牌,go,Go,我试图生成一个随机令牌,在实现重置密码功能时可以使用它。这()是令人眼花缭乱的非功能性代码:(我第一次尝试时想到的代码。它不能像我希望的那样工作,因为它一次又一次地生成相同的令牌(我假设它是时间的函数,不会改变)。我如何使用md5生成一个每次都会改变的随机令牌 package main import "fmt" import "strconv" import "time" import "crypto/md5" import "io" func main() { time :=

我试图生成一个随机令牌,在实现重置密码功能时可以使用它。这()是令人眼花缭乱的非功能性代码:(我第一次尝试时想到的代码。它不能像我希望的那样工作,因为它一次又一次地生成相同的令牌(我假设它是时间的函数,不会改变)。我如何使用md5生成一个每次都会改变的随机令牌

package main

import "fmt"
import "strconv"
import "time"
import "crypto/md5"
import "io"


func main() {


    time := strconv.FormatInt(time.Now().Unix(), 10)
    fmt.Println(time)
    h := md5.New()
    io.WriteString(h, time)
    fmt.Printf("%x", h.Sum(nil))
}

它每次都生成相同的结果,只是因为它在操场上,时间被冻结,页面被缓存

不过,这不是一个好主意,因为可以根据发出请求的时间猜测重置密码

为什么必须是md5?这是一个随机令牌生成器:


uuid是另一个选择。请参阅

go get  "code.google.com/p/go-uuid/uuid"

以及funcuuid.New()就是你想要的。

你能用一个随机数吗?比如我正在写这篇文章,但是你写得很快。这更简单。谢谢。只有当他们知道时间被用来生成令牌,然后也猜到时间时,才能猜到重置密码。@Leahcim:永远不要指望一个模糊的过程是安全的因为它不知道。与您尝试的系统类似的系统一直处于崩溃状态。+1表示Jim的响应。几乎不需要使用MD5(或任何哈希算法)。或者,如果您想稍微缩短输出,您也可以
base64.URLEncoding
输出,尽管十六进制对于密码重置系统来说是完全合适的。不过,我可能会将随机字节数增加到至少~16个,并确保有效过期(注意,在围棋场中,它不会生成随机令牌。UUID的设计没有考虑安全性(即它们是可预测的)
go get  "code.google.com/p/go-uuid/uuid"