撒了盐的加密方法

package main

import (
	"bytes"
	"crypto/rand"
	"crypto/sha1"
	"encoding/base64"
	"fmt"
	"io"
)

const SaltSize = 16

func hashWithSalted(plain string) string {
	buf := make([]byte, SaltSize, SaltSize+sha1.Size)
	_, err := io.ReadFull(rand.Reader, buf)
	if err != nil {
		fmt.Println("random read failed ->", err)
	}

	h := sha1.New()
	h.Write(buf)
	h.Write([]byte(plain))

	return base64.URLEncoding.EncodeToString(h.Sum(buf))
}

func match(secret, plain string) bool {
	data, _ := base64.URLEncoding.DecodeString(secret)
	if len(data) != SaltSize+sha1.Size {
		fmt.Println("wrong length of data")
		return false
	}
	h := sha1.New()
	h.Write(data[:SaltSize])
	h.Write([]byte(plain))
	return bytes.Equal(h.Sum(nil), data[SaltSize:])
}

func main(){
  h := hashWithSalted("888888")
  fmt.Println(len(h), h)


  fmt.Println(match(h, "888888"))
}

原理:http://outofmemory.cn/code-snippet/33788/method

猜你喜欢

转载自blog.csdn.net/zhizhengguan/article/details/89316492
今日推荐