2009-11-18 4 views
0

Lorsqu'un utilisateur s'enregistre sur notre site, nous vérifions l'adresse avec un service de validation d'adresse. Ce service peut renvoyer une suggestion d'adresse si l'adresse entrée est trouvée mais comporte quelques erreurs. Cette suggestion est renvoyée à l'utilisateur.Vérifier si l'utilisateur a modifié les données

L'utilisateur peut accepter la suggestion et est approuvé. S'il change l'adresse, il n'est pas fiable.

Y at-il un bon moyen de vérifier si les données affichées à l'utilisateur sont les mêmes que les données qu'il publie? Je suppose que j'ai besoin d'un champ caché avec le hachage des addressdata. Mais je ne suis pas sûr quel algorithme je devrais prendre. L'algorithme devrait être insensible à la casse si possible.

L'algorithme doit créer un hachage unilatéral inviolable.

EDIT:

Cela a fonctionné assez bien jusqu'à présent. Je dois encore tester avec umlaute (ä, ü).

   StringBuilder addressData = new StringBuilder(); 
      addressData.Append(FirstName); 
      addressData.Append(LastName); 
      addressData.Append(StreetNumber); 
      addressData.Append(StreetName);    
      addressData.Append(City); 
      addressData.Append(CountryISO); 
      addressData.Append(Zip); 
      string stringVal = addressData.ToString().ToLower(); 

      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
      byte[] keyByte = encoding.GetBytes(ApplicationConfiguration.ShaKey); 
      byte[] messageBytes = encoding.GetBytes(stringVal); 

      HMACSHA256 hmacsha256 = new HMACSHA256(keyByte); 
      byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
      string hash = ByteToString(hashmessage); 

      return hash 

Répondre

1

Utiliser un HMAC (Hash-based Message Authentication Code) - Les HMAC ont été inventés précisément dans ce but; authentifier les données avec une clé symétrique. Je ne suis pas familier avec .NET moi-même, mais la bibliothèque standard semble fournir beaucoup de telles classes héritant de System.Security.Cryptography.HMAC. HMAC est meilleur qu'un simple hachage car il n'est pas vulnérable aux attaques par extension de hachage .

HMACSHA256 ressemble à un bon candidat.

Vous devriez également envisager d'ajouter un unique value (a nonce) à la chaîne si vous voulez éviter de prévenir les attaques de relecture - sinon un utilisateur peut re-envoyer un email plus tôt avec l'accompagnement plus tôt HMAC signature.

La clé HMAC doit être un secret côté serveur.

0

est-il un bon moyen de vérifier si les données affichées à l'utilisateur est le même que les données qu'il publie?

Oui - vous pouvez stocker dans la base de données les données que vous envoyez à l'utilisateur.

Lorsque l'utilisateur soumet le formulaire, comparez les données de la base de données aux données fournies par l'utilisateur. Vous pouvez convertir les données en un hachage CRC32, mais il est important de concaténer les différents objets de données de la même manière, si vous choisissez de comparer les chaînes de hachage. BTW, je pense que la création d'une chaîne de hachage serait inutile, parce que les données sont stockées dans la base de données de toute façon et pas pendant une longue période.

+0

Le CRC32 peut être altéré. J'ai besoin d'un hachage sûr à sens unique. –

+0

@ Mathias Fritsch: Considérons MD5. – Dor

0

J'aime votre idée .. vous concaténer les parties de l'adresse en font une grande chaîne et faire un GetHashCode de la version ToLower de la chaîne. puis utilisez la même méthode pour comparer.

0

Si JavaScript est autorisé, peut-être vous pouvez utiliser le changement jQuery() Event, et vérifier en réglant la valeur cachée du côté client, pour savoir si quelque chose a changé:

L'événement se déclenche de changement lorsqu'un contrôle perd le focus d'entrée et sa valeur ont été modifiés depuis l'obtention du focus.

$("input[type='text']").change(function() { 
    //do something here, maybe set a hidden value 
}); 

Ensuite, sur votre contrôleur, vous pouvez vérifier cette valeur cachée, ou vous pouvez peut-être aller de fantaisie, et vérifier la valeur tout de suite avec certains ajax, mais peut-être à cause de vos besoins de sécurité cela peut être risqué.

+0

Javascript n'est pas une option, car l'utilisateur peut encore altérer les données renvoyées au serveur. –

+0

Eh bien, c'est vraiment un problème ... Je ne pense pas qu'il y ait un moyen facile sur celui-ci, peut-être que si vous saliez l'endroit haché, il se peut que vous deviez économiser un sel par place et haché comme avec les mots de passe salés dans SHA-1. Mais ceci est redondant car dans ce cas nous ne savons pas quelle est la valeur sélectionnée. Nous avons besoin d'autre chose comme un ID (nom d'utilisateur dans le cas d'une connexion), qui nous permet de savoir exactement quel sel choisir, et cela doit être dans la forme cachée de la valeur hashed bidirectionnelle. Une autre option possible est en quelque sorte enregistrer une clé dans la session utilisateur et l'utiliser pour comparer la valeur POSTed. – JOBG

+0

Bon sang, pourquoi réinventer la roue avec des failles de sécurité potentielles si vous pouvez simplement utiliser un HMAC et en avoir fini avec lui. Laisser la cryptographie aux cryptographes. – intgr

Questions connexes