diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-10-24 15:18:39 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-10-24 15:18:39 -0700 |
| commit | 466cbd5a1be7d274a45506add79c21e06ee53381 (patch) | |
| tree | 2cd1049b0e063aa7d37da46721365117ef53614f | |
| parent | edd01c62855ff5d1b0ef50a1d9350718cb033c84 (diff) | |
| download | sym-466cbd5a1be7d274a45506add79c21e06ee53381.tar.zst | |
Use argon2 for password hashing
| -rw-r--r-- | dec.go | 6 | ||||
| -rw-r--r-- | enc.go | 6 | ||||
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | oae.go | 18 | ||||
| -rw-r--r-- | pwhash.go | 9 | ||||
| -rw-r--r-- | sym_test.go | 4 |
7 files changed, 24 insertions, 22 deletions
@@ -10,7 +10,7 @@ import ( ) func (o *decryptOptions) decrypt(w io.Writer, r io.Reader, password string) error { - _, err := io.Copy(w, newDecryptingReader(r, password, o.iterations)) + _, err := io.Copy(w, newDecryptingReader(r, password, o.memory)) return err } @@ -27,14 +27,14 @@ func (f *decryptFlags) registerFlags(fs *flag.FlagSet) { type decryptOptions struct { decryptFlags - iterations int + memory int passwordIn func() (string, error) stdin io.Reader stdout io.Writer } var defaultDecryptOptions = decryptOptions{ - iterations: defaultPBKDF2Iters, + memory: defaultArgon2Memory, passwordIn: termReadPassword, stdin: os.Stdin, stdout: os.Stdout, @@ -28,7 +28,7 @@ func (f *encryptFlags) registerFlags(fs *flag.FlagSet) { type encryptOptions struct { encryptFlags - iterations int + memory int passwordIn func() (string, error) passwordOut io.Writer stdin io.Reader @@ -36,7 +36,7 @@ type encryptOptions struct { } var defaultEncryptOptions = encryptOptions{ - iterations: defaultPBKDF2Iters, + memory: defaultArgon2Memory, passwordIn: termReadPassword, passwordOut: os.Stderr, stdin: os.Stdin, @@ -44,7 +44,7 @@ var defaultEncryptOptions = encryptOptions{ } func (o *encryptOptions) encrypt(w io.Writer, r io.Reader, password string) error { - writer := newEncryptingWriter(w, password, o.iterations) + writer := newEncryptingWriter(w, password, o.memory) if _, err := io.Copy(writer, r); err != nil { return err } @@ -3,6 +3,7 @@ module roseh.moe/cmd/sym go 1.25.0 require ( + golang.org/x/crypto v0.43.0 golang.org/x/term v0.36.0 roseh.moe/pkg/wordlist v1.0.2 ) @@ -1,5 +1,7 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= @@ -21,15 +21,15 @@ const ( ) type segmentEncrypter struct { - password string - iterations int + password string + memory int aead cipher.AEAD nonce [nonceSize]byte } func (se *segmentEncrypter) initialize(salt []byte) error { - key, err := hashPassword(se.password, salt, se.iterations) + key, err := hashPassword(se.password, salt, se.memory) if err != nil { return err } @@ -83,12 +83,12 @@ type encryptingWriter struct { initialized bool } -func newEncryptingWriter(w io.Writer, password string, iterations int) *encryptingWriter { +func newEncryptingWriter(w io.Writer, password string, memory int) *encryptingWriter { return &encryptingWriter{ w: w, encrypter: segmentEncrypter{ - password: password, - iterations: iterations, + password: password, + memory: memory, }, } } @@ -181,12 +181,12 @@ type decryptingReader struct { readFinalBlock bool } -func newDecryptingReader(r io.Reader, password string, iterations int) *decryptingReader { +func newDecryptingReader(r io.Reader, password string, memory int) *decryptingReader { return &decryptingReader{ r: bufio.NewReaderSize(r, 0), // we only need .UnreadByte decrypter: segmentEncrypter{ - password: password, - iterations: iterations, + password: password, + memory: memory, }, } } @@ -1,17 +1,16 @@ package main import ( - "crypto/pbkdf2" - "crypto/sha256" "os" + "golang.org/x/crypto/argon2" "golang.org/x/term" ) -const defaultPBKDF2Iters = 35_000_000 +const defaultArgon2Memory = 64 * 1024 -func hashPassword(password string, salt []byte, iters int) ([]byte, error) { - return pbkdf2.Key(sha256.New, password, salt, iters, 32) +func hashPassword(password string, salt []byte, memory int) ([]byte, error) { + return argon2.IDKey([]byte(password), salt, 1, uint32(memory), 4, 32), nil } func termReadPassword() (string, error) { diff --git a/sym_test.go b/sym_test.go index 4d648d3..bb81ab8 100644 --- a/sym_test.go +++ b/sym_test.go @@ -9,13 +9,13 @@ import ( var testEncryptOptions = func() encryptOptions { opts := defaultEncryptOptions - opts.iterations = 10 + opts.memory = 1 return opts }() var testDecryptOptions = func() decryptOptions { opts := defaultDecryptOptions - opts.iterations = 10 + opts.memory = 1 return opts }() |
