TL;DR: New toy.
$ phidelius Phidelius 1.0: Entropy Spoofing Engine Author: Dan Kaminsky / Description: This code replaces most sources of an application's entropy with a psuedorandom stream seeded from a password, a file, or a generated sequence. This causes most cryptographic key generators (ssh-keygen, openssl, etc) to emit apparently strong keys with a presumably memorable backdoor. For many protocols this creates PAKE (Password Authenticated Key Exchange) semantics without the server updating any code or even being aware of the password stored client side. However, the cost of blinding the server is increased exposure to offline brute force attacks by a MITM, a risk only partially mitigatable by time/memory hard crack resistance. Example: phidelius -p "ax-op-nm-qw-yi" -e "ssh-keygen -f id_dsa"
Passwords are a problem. They’re constantly being lost, forgotten, and stolen. Something like 50% of compromises are associated with their loss. Somewhere along the way, websites started thinking l33tsp33k was a security technology to be enforced upon users.
So what we’re about to talk about in this post — and, in fact, what’s in the code I’m about to finally drop — is by no means a good idea. It may perhaps be an interesting idea, however.
So! First discussed in my Black Ops of 2011 talk, I’m finally releasing Phidelius 1.0. Phidelius allows a client armed with nothing but a password to generate predictable RSA/DSA/ECC keypairs that can then be used, unmodified, against real world applications such as SSH, SSL, IPsec, PGP, and even BitCoin (though I haven’t quite figured out that particular invocation yet — it’s pretty cool, you could send money to the bearer of a photograph).
Now, why would you do this? There’s been a longstanding question as to how can a server support passwords, without necessarily learning those passwords. The standard exhortations against storing unhashed passwords mean nothing against this problem; even if the server is storing hashed values, it’s still receiving them in plain text. There are hash-based challenge response protocols (“please give me the password hashed with this random value”) but they require the server to then store the password (or a password equivalent) so they can recognize valid responses.
There’s been a third class of solutions, belonging to the PAKE (Password Authenticated Key Exchange) family. These solutions generally come down to “password authenticated Diffie-Helman”. For various reasons, not least of which have been patents, these approaches haven’t gotten far. Phidelius basically “solves” PAKE, by totally cheating. Rather than authenticating an otherwise random exchange, the keypair itself is nothing but an encoding of the password. The server doesn’t even have to know. (If you are a dev, your ears just perked up. Solutions that require only one side to patch are infinitely easier to deploy.) How can this work?