2009-03-31 6 views
1

Je veux ajouter un type simple de MAC à certains de mes paramètres d'URL. Ceci est seulement conçu comme une ligne de défense supplémentaire contre les bogues d'application et la mise en cache des problèmes/bogues liés, et non comme une forme de remplacement de la sécurité de connexion réelle dans l'application. Un identifiant d'objet métier donné est déjà protégé par des backends pour être limité à un seul utilisateur.Ajout d'un simple MAC aux paramètres d'URL?

Donc, fondamentalement, je voudrais ajouter un code d'authentification court à mes paramètres d'URL, sur la taille de 2-4 caractères. Je pense que je voudrais avoir une fonction réversible sur le modèle de f (business-data-id + connecté-utilisateur-id + ??) = hash, mais je suis ouvert aux suggestions.

L'intention principale est d'arrêter la détermination d'identifiant et de s'assurer que les URL sont assez distinctes par utilisateur connecté. Je aussi ne veulent pas veulent quelque chose de gros et maladroit comme un MD5.

Répondre

2

Puisque vous ne recherchez pas la qualité cryptographique, un CRC 24 bits répondrait peut-être à vos besoins. Alors que MD5 est "rapide" en termes absolus, CRC est, relativement, "aveuglément rapide". Ensuite, le CRC de 3 octets pourrait être codé en quatre caractères avec un codage Base-64.

Voici une implémentation Java du contrôle utilisé pour checksums ASCII armure OpenPGP:

private static byte[] crc(byte[] data) 
{ 
    int crc = 0xB704CE; 
    for (int octets = 0; octets < data.length; ++octets) { 
    crc ^= (data[octets] & 0xFF) << 16; 
    for (int i = 0; i < 8; ++i) { 
     crc <<= 1; 
     if ((crc & 0x1000000) != 0) 
     crc ^= 0x1864CFB; 
    } 
    } 
    byte[] b = new byte[3]; 
    for (int shift = 16, idx = 0; shift >= 0; shift -= 8) { 
    b[idx++] = (byte) (crc >>> shift); 
    } 
    return b; 
} 

je serais hachage une clé secrète (qui est connu que par le serveur), avec tout ce que vous voulez protéger — probablement la combinaison de l'identifiant de l'objet et de l'identifiant de l'utilisateur.

+0

"Quelque chose" dans ce sens s'est avéré être exactement ce que j'ai fait hier, mais je me demandais toujours sur l'encodage 32 bits crc et base64. CRC24 résout * que * un;) – krosenvold

0

Une question rapide pour laquelle je suis sûr qu'il y a une bonne réponse pour, mais pourquoi ne pas stocker cette information dans un cookie?

Ensuite, vous pouvez utiliser quelque chose de gros et maladroit comme MD5 et vos URL seraient encore jolie.

+0

Ceci s'applique à * toutes * les URL avec les paramètres que j'envoie du serveur au client, donc il y en aurait beaucoup. Et comment cela empêcherait-il un utilisateur légitime de deviner son identité? – krosenvold

+0

Désolé je vois maintenant. Mais je ne suis pas sûr de ce que le code d'accès supplémentaire sur les paramètres d'URL vous donne. Si vous avez l'authentification et le contrôle d'accès sur le backend n'est pas votre protection de l'ID deviner un message "Accès refusé" quand un utilisateur essaie d'afficher une ressource qu'ils ne sont pas autorisés à voir? –

+0

Précaution supplémentaire contre les bogues de mise en cache et similaires – krosenvold

1

Si ce que vous voulez est fondamentalement MD5 mais plus petit, pourquoi ne pas simplement utiliser MD5 mais seulement les 4 derniers caractères? Cela n'ajoute pas un énorme blob à vos URL, c'est toujours 4 chiffres hexadécimaux.

+0

Puisqu'aucune autre réponse n'est venue, c'était ce que je pensais aussi. BIt sceptique à propos du calcul d'une grosse somme de contrôle et n'utilisant qu'une petite partie de celle-ci, pensez-vous que les frais généraux de calcul sont corrects? – krosenvold

+0

Calculer MD5 est très bon marché, mais benchmark pour s'assurer. Nous avons utilisé MD5 dans une boucle serrée une fois, donc nous avons comparé pour être sûr et pourrions à des milliers par seconde IIRC. –

Questions connexes