Skip to content

Instantly share code, notes, and snippets.

@wickedev
Created November 4, 2016 04:48
Show Gist options
  • Save wickedev/0434031b4ef1c09593bafaf348441145 to your computer and use it in GitHub Desktop.
Save wickedev/0434031b4ef1c09593bafaf348441145 to your computer and use it in GitHub Desktop.
package utils
import (
"bytes"
"crypto/rand"
"crypto/sha1"
"github.com/iris-contrib/errors"
"golang.org/x/crypto/scrypt"
"io"
)
const SaltSize = 10
const secret = "8klGgUxAr0"
const cpuCost = 16384
const memCost = 8
const parallel = 1
const keyLen = 31
var (
passDoNotMatch = errors.New("Wrong password")
)
func SaltedHash() ([]byte, error) {
buf := make([]byte, SaltSize, SaltSize+sha1.Size)
if _, err := io.ReadFull(rand.Reader, buf); err != nil {
return nil, err
}
h := sha1.New()
h.Write(buf)
h.Write([]byte(secret))
return h.Sum(buf), nil
}
func GenerateDigest(pass, salt []byte) (digest []byte, err error) {
digest, err = scrypt.Key([]byte(pass), salt, cpuCost, memCost, parallel, keyLen)
if err != nil {
return nil, err
}
return digest, nil
}
func PassChecker(pass, digest, salt []byte) (err error) {
var genDigest []byte
genDigest, err = GenerateDigest(pass, salt)
if err != nil {
return err
}
if !bytes.Equal(digest, genDigest) {
return passDoNotMatch
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment