1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package passwords
import (
"golang.org/x/crypto/argon2"
"crypto/subtle"
"crypto/rand"
"bytes"
"log"
)
const version = 0
func doHash(ver int, password string, salt []byte) []byte {
return argon2.IDKey([]byte(password), salt, 1, 64*1024, 4, 32)
}
func Hash(password string) []byte {
var buf bytes.Buffer
buf.WriteByte(version)
salt := make([]byte, 32)
_, err := rand.Read(salt)
if err != nil {
log.Fatal("error generating password hash:", err)
}
buf.Write(doHash(version, password, salt))
buf.Write(salt)
return buf.Bytes()
}
func Check(password string, hash []byte) bool {
ver := int(hash[0])
hashData := hash[1:33]
salt := hash[33:]
check := doHash(ver, password, salt)
return subtle.ConstantTimeCompare(hashData, check) == 1
}
|