On 7/6/2014 9:38 AM, Kagamin wrote:
On Saturday, 5 July 2014 at 18:06:34 UTC, Nick Sabalausky wrote:
On 7/5/2014 8:23 AM, Kagamin wrote:

There was a study, showing that most security vulnerabilities are caused
by client code rather than cryptographic library code.

Interesting. Link?

Dunno, can't find it right now. I thought, I found it following links
from hap thread, but there's nothing there.

For example, how
would you prevent client code from generating weak encryption keys or
from using weak algorithm for hash comparison, or how would you force it
to do what's not required to get the code compiled? How would you do
that with the quality of library code? Even if you can do that, it's
still not a cryptographic task, but a general programming task, the
standard only hints you that those things are necessary.

FWIW, DAuth (pending a possible name change, to prevent confusion with
the completely unrelated OAuth) maintains a list of non-recommended
algos:

https://github.com/Abscissa/DAuth/blob/master/src/dauth/core.d#L109

Cryptographic algorithms don't cause cryptographic weaknesses as bad as
ones from user code.
Example: http://samate.nist.gov/SRD/view_testcase.php?tID=58


Well, of course there are algorithms that *are* inherently insecure at the algorithmic level, regardless of implementation. Like MD4/MD5, CRC32, non-crypto DRNGs, etc. But yea, user code is a big giant attack vector.

Also, DAuth encourages passwords to be stored in a special structure:

https://github.com/Abscissa/DAuth/blob/master/src/dauth/core.d#L311

which attempts to zero-out the password from memory as early as it can
(and encourages the user to populate it via char[] not string to avoid
having an un-wipable immutable plain-text copy in memory. See
'toPassword' vs 'dupPassword'). I'm certain the implementation can be
improved. And I'd kinda like to make it scoped if I can, instead of
refcounted. But it's something.

Yeah, better than nothing, but as it integrates poorly with the rest of
user code, people will hack it around by writing byte[]
hashPassword(string) function. Nobody estimates security by defending
the system, one do it by breaking it.

Yea, it *is* a calculated compromise. Definitely. It doesn't prevent anyone from doing the wrong thing since it really *can't* prevent it.

But what it does do is attempt to nudge the user in the right direction the best it can. Namely, a function is *already* provided to directly construct a Password struct from a string: dupPassword (as opposed to the recommended toPassword which requires a mutable char array).

Granted, this dupPassword is a bad thing to use, but just like unsafe casts, people will occasionally need it or otherwise think they need it. (Heck, *I've* needed to use it, just because vibe provides its POST vars in string form.) So by providing this function directly (instead of omitting dupPassword or just accepting "string password" everywhere), I'm hoping to:

1. Increase the likelihood people are at least *aware* of what they're doing: Using a discouraged function (the docs warn about its use) and "dup"ing a plaintext password that will still remain in memory.

2. Decrease the likelihood of homemade workarounds that may not be as easily identifiable or greppable.

It's no guarantee of anything, since that's wouldn't be realistic anyway. But it's a nudge in the right direction, which is the next best thing.

Reply via email to