|
|
|
|
|
by garrettr_
3308 days ago
|
|
A quick look at the source code shows the generate_key() function [0] to be insecure. It generates 32 random bytes (good, that's what you need for an AES-256 key), but then it uses those random bytes to sample from a distribution which only has 62 characters. This significantly reduces the security of the key, from 256 bits of entropy to ~190 bits (log2(62^32)). And that would be in the best case, if it were sampling uniformly from the distribution - it is not. I recommend reading Section 9.7 of Cryptography Engineering [1] to understand why choosing random elements from a set is harder than it seems. A good example of a similar bug is the nasty bug in Cryptocat's PRNG from 2013 [2]. I assume this step was done so the AES key could be included in the URL fragment, since a set of random bytes may not be url safe. I recommend feeding the random bytes of the key directly into the underlying cryptographic functions, and using a urlsafe encoding at a higher level when necessary. Also, it appears you are using AES [3], a block cipher, but I cannot figure out what block cipher mode you are using. I'll have to dig into the CryptoJS code a little more to see what it defaults to, but I have a sinking feeling that it's ECB, which is completely insecure. Dan Boneh's Crypto I course on Coursera is a good way to learn the basics of block cipher modes. [0]: https://github.com/jes/hardbin/blob/c77c2d7eb93586e0e009ea4b...
[1]: https://www.amazon.com/Cryptography-Engineering-Principles-P...
[2]: https://nakedsecurity.sophos.com/2013/07/09/anatomy-of-a-pse...
[3]: https://github.com/jes/hardbin/blob/c77c2d7eb93586e0e009ea4b... |
|
It's using CBC mode.
[0] http://incoherency.co.uk/blog/stories/hardbin.html
EDIT:
> And that would be in the best case, if it were sampling uniformly from the distribution - it is not.
Can you please point out how it's not? It's intended to sample uniformly. It would be non-uniform if it were "randombytes[i] % alphabet.length".
EDIT2:
I see now how it's non-uniform. 256 values in randombytes doesn't map 1:1 onto 62 values in alphabet. I will fix this tonight, thanks for pointing it out.