views:

27

answers:

2

Hi,

I am working on a server application which will have quite a fair number of client devices accessing it. The problem is we cannot guarantee that the client devices will always have access to the server. It is perfectly possible for a device to be outside the network for 1 week or more. In the meantime, we still want the device to work in an autonomous manner with a copy of the necessary content (automatically updated when connected to the network).

Of course, this is causing some security issues related to the user authentication. We plan to have the device have a copy of the users list. We are pondering on how to have the authentication secured on the device. Obviously we cannot send the passwords in plain text in the update packages.

Passwords on the main server are salted and hashed and we are thinking of using a hash of some sort (SHA1 ?), for the list available to the client device.

By doing so however we are lowering the bar for attacks on the devices (no salt).

Would you have any suggestion for an efficient way to keep the client devices as secure as possible?

Thanks!

A: 

If you don't have a good reason to weaken passwords on client device, use the same auth scheme on client and server. Client devices can handle salt too.

blaze
A: 

First of all, you need to be clear who the attacker is. In this case, what if someone where to steal the device? Another scenario is what if someone where to connect to the server with a malicious client? What if someone where to sniff the traffic?

To stop sniffing all communication should be done over ssl (probably https). To prevent malicious clients you can identify each client device by a SSL certificate hardcoded and store these credentials on the server side in a database. The server could use a normal certificate from a CA. If a device is stolen you could revoke the certificate in your local db. A full PKI isn't necessary, although this is a case where one could be used with great results.

Spilling the password hashes to the attacker(client) is always a vulnerability. Transferring all of the password hashes to the client is commonly done with sql injection. This is not a solution.

md5 is broken in many different ways and exploited in real world attacks. sha1 is more secure and still approved by NIST, however sha256 is a very good choice. Salting password hashes with a random value is necessary.

A secure solution that I can think of for your password problem is to only allow authentication while connected to a network. That user could be cached and then that user could log out and log back in. This limits the attack scenario but doesn't negate it. If someone where to steal the device he would also have a password hash, in this case the user must be forced to change his password (and hopefully this happens before the attacker has a chance to break the hash).

A less secure solution would be to use a heavy hash function such as PBKDF2. This is used in applications like winzip where the password hash is always available to the attacker. The drawback is its EXTREMELY SLOW and can't be used for normal web applications because of this.

Rook
Trouble is we need to have the devices to be able to authenticate users even without connection to the server. What would you think of sending the devices a list of hashes (a good 1000 round of sha256 for instance) of salted passwords and the corresponding salts (salts different for each user and randomly generated) for the device to authenticate against?
Guillaume Bodi
@Guillaume Bodi I think that if people are using dictionary words as passwords then they will be broken in less than an hour on a desktop system. PBKDF2 uses 5k rounds, and people still break winzip all the time. It helps, but its not all that "secure". A more secure approach is to limit the number of hashes you are handing over to the attacker. Also it would be a good idea to enforce password requirements, such as mixed-alpha-numeric-symbol.
Rook
Thanks for your input! I'll try to pack in as much as possible of your suggestions.
Guillaume Bodi