2010-03-31 7 views
3

J'ai une API RESTful contenant un URI de/UserService/Register./UserService/registre prend une demande XML tel que:Est-il possible de déterminer une chaîne d'entrée de mot de passe en texte brut ou en hachage?

<UserRegistrationRequest> 
    <Password>password</Password> 
    <Profile> 
    <User> 
     <UserName>username</UserName> 
    </User> 
    </Profile> 
</UserRegistrationRequest> 

Je les questions suivantes compte tenu du scénario ci-dessus:

  1. est-il un moyen (en utilisant C# et .Net 3.5+) de l'application/valider que les clients appelant Register transmettent un mot de passe haché plutôt que du texte en clair? Laisser le choix de l'algorithme de hachage à utiliser au client est-il une bonne idée?

  2. Nous pourrions fournir un deuxième URI de/UserService/ComputePasswordHash que le client appellerait avant d'appeler/UserService/Register. Cela a l'avantage de s'assurer que chaque mot de passe est hashé en utilisant le même algorithme. Existe-t-il un mécanisme dans REST pour s'assurer qu'un client a appelé un URI avant d'en appeler un autre?

J'espère que je me suis expliqué ok.

Un grand merci d'avance pour toute aide.

Répondre

3

Le passage d'un mot de passe haché dans un service REST n'est pas plus sûr que le mot de passe clair. Si le mot de passe est reniflé, peu importe s'il est haché ou non, il peut être utilisé.

La meilleure chose à faire est Hacher le mot de passe sur le serveur et accepter les connexions sécurisées (SSL/https)

0

C'est une mauvaise idée de laisser les mots de passe des clients eux-mêmes. Généralement, le hachage seulement mot de passe n'est pas très sécurisé: un sel aléatoire doit être ajouté au mot de passe afin que les mêmes mots de passe produisent des valeurs de hachage différentes. Avec cela, le client devra générer du sel (de préférence en utilisant un algorithme cryptographiquement sécurisé), calculer un hachage résultant (en utilisant une implémentation conforme d'un algorithme de hachage bien connu) et renvoyer trois informations au serveur:

  • Hashage nom de l'algorithme
  • sel
  • de Hashed mot de passe

si serveur ne dispose pas d'implémentation d'un algorithme de hachage particulier? Et si l'algorithme de hachage du client produit des résultats différents par rapport à celui des serveurs?

Revenons maintenant à vos questions:

  • Vous pouvez appliquer le mot de passe à envoyer dans le codage base64, puis vérifier si cette chaîne, reconvertie en tableau byte, contient des caractères non-imprimables, qui sont très susceptibles de apparaissent dans une valeur de hachage. Bien qu'ils pourraient ne pas être là
  • Vous pouvez inclure une sorte de jeton à une réponse de ComputePasswordHash puis avoir besoin de vos clients de passer ce jeton retour à Register
0

Hashage ne serait pas une bonne idée. Un meilleur serait soit utiliser SSL ou utiliser un sous-ensemble de vous-même en utilisant l'api de chiffrement de clé publique dans .NET framework.

Vous allez exposer la fonction GetPublicKey() qui renverra la clé publique par laquelle l'utilisateur cryptera son mot de passe et vous l'enverra. Ensuite, utilisez votre clé privée pour le déchiffrer. Et vérifiez si c'est correct. Les alogs à clé publique à base de courbe RSA ou elliptique sont très bons. Utilisez simplement 1024bit.

MISE À JOUR: vérifier ce example ainsi également this de msdn