6 ms·
Copy and paste-friendly Go crypto
- Royalaid 10y agoThis is a really great idea! I would like to see it for other langs too.
- sdrapkin 10y ago.NET is covered: http://securitydriven.net/inferno/ http://securitydriven.net/inferno/
- deleted 10y ago[deleted]
- Titanous 10y agoNaCl is basically this, but as a library instead of copy/paste. It's available in most languages if you look around. https://nacl.cr.yp.to/index.html https://nacl.cr.yp.to/index.html
- dannyobrien 10y agoYou could argue that https://tweetnacl.cr.yp.to/ https://tweetnacl.cr.yp.to/ is well-suited to cut-and-paste crypto.
- daenney 10y agoYou can basically `go get` this and use it as it is though. I'm not entirely sure why they spin it as copy-pasta crypto.
- nathan7 10y agohttps://golang.org/x/crypto/nacl https://golang.org/x/crypto/nacl for the Gophers among us (it provides only box/secret_box, though)
- kevinburke 10y ago> You should not go below work factor 12. Out of curiosity, how do people determine 12 is the right work factor? When should/will this go to 13?
- psiclops 10y agoIt is relative to cpu performance. https://en.wikipedia.org/wiki/Bcrypt https://en.wikipedia.org/wiki/Bcrypt
- tmd83 10y agoWhat is the current recommendation for iteration count for pbkdf2?
- Natanael_L 10y agoWhat your slowest hardware can handle in a reasonable timeframe
- Etzos 10y agoI was actually at this talk (excellent way to go over this kind of topic!) and I have just a small thing to add. You'll notice the "Asymmetric Signature" section mentions using ESDSA on P-256 because "the Go implementation of P-256 is constant time to protect against side-channel attacks." However, someone mentioned that this may not be on all platforms because it is hand-coded assembly. After a quick check of the Go source code, this is indeed true. In fact, the constant time guarantee assembly version is only available on amd64 compatible systems[1]. Just something to take note of. [1] https://golang.org/src/crypto/elliptic/ https://golang.org/src/crypto/elliptic/ Edit: Formatting and grammar and spelling, oh my.
- gtank 10y agoAuthor here, glad you enjoyed the talk! Looking into it more I noticed that there's a Go implementation[1] that is noted to be constant-time with a !amd64 build tag. So it isn't just the assembly one. [1] https://golang.org/src/crypto/elliptic/p256.go https://golang.org/src/crypto/elliptic/p256.go
- Etzos 10y agoWow, I completely missed that (largely because I assumed a Go implementation could not guarantee constant time), sorry about that and thanks for looking deeper than I did. On that note, how much of a guarantee is there in the Go implementation? I assume in most cases it's going to be constant time, but isn't that a little harder to guarantee when compared to the asm version? And if not why not just use the Go implementation everywhere for consistency?
- deleted 10y ago[deleted]
- wbl 10y agoThe asm version is much more performant. The Go version is a port of the version in NSS, but the compiler is free to screw it up in various ways. Furthermore correctness is always a concern: cleverness in unsaturated arithmetic code can be hard.
- dawkins 10y agoIn the encrypt examples I always wonder why they assume that you have a fixed 32 bit key (password). Shouldn't they include a padding function? Is use this one: edit: deleted in case some is so crazy to use it :)
- e12e 10y agoI'm not sure what you looked at, but the first example I found used a 32 byte key (256 bits = 8 * 32). From the readme : > 5. Key generation functions will panic if they can't read enough random bytes to generate the key. Key generation is critical, and if crypto/rand fails at that stage then you should stop doing cryptography on that machine immediately. Having less than a full encryption key is a fatal error! Not something to be padded around. Apologies if there are some examples for key derivation from a password that somehow doesn't use only part of an array initialized to zero (which would be bad, adding random unitialized data to the kdf - good luck decrypting!).
- dawkins 10y agoBut what if I want to encrypt "my secret" with "password1234"?. You can't require everybody to memorize exactly 32 bit passwords
- CiPHPerCoder 10y agoStop saying 32 bit, please. It's 32 byte, or 256 bit. Furthermore, use a KDF to stretch your password into a key suitable for encryption.
- dawkins 10y agoSorry, of course I mean 32 byte.
- natedub 10y agoPasswords are not keys, but you can generate a key from a password with a Password-Based Key Derivation Function. See https://en.wikipedia.org/wiki/PBKDF2 https://en.wikipedia.org/wiki/PBKDF2
- niftich 10y agoYour recommendations and defaults are sane, and the code looks solid, thanks for publishing. I just don't know why you call this 'copy and paste-friendly'. This is essentially a minimalistic library, not a bunch of code examples (ie. "usage"). Stackoverflow (as awful as roll-your-own-crypto is,) is great for seeing code examples in context of a domain problem, rather than a crypographic primitive. This is a decent wrapper for goland stdlib's crypto, but doesn't particularly help a person who's trying to understand how to apply crypto to their particular usecase, and would therefore be most susceptible to googling it.
- baby 10y ago1. How do I protect my password, umm, I heard I have to hash it. 2. Goes to https://github.com/gtank/cryptopasta/blob/master/hash.go#L41 https://github.com/gtank/cryptopasta/blob/master/hash.go#L41 3. This `HashPassword()` and `CheckPasswordHash()` functions look interesting 4. Copy/Pasted into the project, it just works!
- ashitlerferad 10y agoDon't copy and paste code! Instead, use a well maintained library.
- verroq 10y agoSuch as nacl/secretbox for encryption instead of rolling your own AES-GCM https://godoc.org/golang.org/x/crypto/nacl/secretbox https://godoc.org/golang.org/x/crypto/nacl/secretbox
- Bromskloss 10y agoI'm not sure, but isn't this post about showing how to use such libraries?
- ashitlerferad 10y agoNo: "Copy and paste-friendly Go crypto"
- saynsedit 10y agoP-256 is not a safe curve! http://safecurves.cr.yp.to http://safecurves.cr.yp.to