如何使用md5生成随机令牌

Lea*_*cim 10 go

我正在尝试生成一个随机令牌,我可以在实现重置密码功能时使用它.这个(http://play.golang.org/p/mmAzXLIZML)是令人眼花缭乱且不起作用的:(我第一次尝试的代码.它不起作用,因为它产生了反复使用相同的标记(我假设它是时间不变的函数).如何使用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))
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/mmAzXLIZML

Jim*_*imB 27

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

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

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

http://play.golang.org/p/3weHBU6YZr

func randToken() string {
    b := make([]byte, 8)
    rand.Read(b)
    return fmt.Sprintf("%x", b)
}
Run Code Online (Sandbox Code Playgroud)

  • @Leahcim:*永远不要指望一个不安全的过程,因为它不为人所知.类似于你所尝试的系统一直都在破碎. (3认同)
  • 为Jim的回复+1.几乎不需要使用MD5(或任何哈希算法).或者,如果你想缩短一点,你也可以`base64.URLEncoding`输出,虽然hex对于密码重置系统来说完全没问题.我可能会将随机字节数增加到至少~16,并确保积极地过期(<= 4小时?)令牌.Redis对此有好处 - 生成,添加到Redis到期,然后在验证令牌时检查Redis. (3认同)