Je veux rendre mon logiciel plus sécurisé. Je veux empêcher l'attaque de la force brute. Je sais qu'un mot de passe fort est le meilleur mais je ne peux pas le contrôler.
J'ai pensé aux solutions suivantes:
Y a-t-il un bon algorithme pour prévenir l'attaque de la force brute?
Au lieu de stocker les IP à partir desquelles des tentatives ayant échoué sont fabriquées, que diriez-vous de stocker le dernier N
ips à partir desquels des connexions réussies ont été faites? Vous pouvez déjà faire cela pour les rapports de type " activité de compte ".
Traiter ces IP comme une sorte de "whitelist" pour les lockouts. Par exemple. si 10.1.1.100
et 10.1.2.200
Sont les adresses IP qui ont eu des connexions valides pour luser
, alors ceci est la liste blanche. Si 172.16.1.50 effectue trois tentatives infructueuses, définissez le drapeau lockout
pour luser
à l'horodatage actuel. Pour les 15 prochaines minutes, toute tentative de connexion qui ne provient pas du whitelist sera remplie de message "Nom d'utilisateur/mot de passe invalide". (En d'autres termes, ne laissez pas l'attaquant savoir qu'il a été détecté et que le compte d'utilisateur est verrouillé; laissez-le perdre ses ressources et ne lui permettez pas d'optimiser l'attaque.)
Pour le scénario où l'attaquant parvient à partager une adresse IP avec la victime, supprimez une adresse IP du Whitelist après trois tentatives infructueuses. (Ou augmenter le seuil si vous voulez donner aux utilisateurs légitimes plus de chances de graisse doigt le mot de passe.) Cela semble que ce serait plus d'une attaque ciblée contre un utilisateur particulier, ce qui est plus difficile à défendre contre d'une " force brute tout Compte "Type d'attaque (cela ressemble à ce dernier est ce que vous essayez de défendre). Dans ce cas, l'utilisateur légitime devra réinitialiser son mot de passe pour récupérer l'accès au système - pratique mais non fatale.
Pour le scénario où un utilisateur (ESP. Administrateur en vacances) est loin de son adresse IP normale, permettez à la fonctionnalité de réinitialisation du mot de passe d'insérer une nouvelle entrée dans le whitelist. Un utilisateur légitime n'essaiera qu'une poignée de fois avant d'abandonner et de réinitialiser le mot de passe danse.
Une alternative à la stratégie Whitelist/Lockout serait d'ajouter un défi secondaire au processus de connexion. Après trois tentatives de connexion échouées, définissez un indicateur sur le compte de l'utilisateur. Si le drapeau est réglé, un délai de 10 secondes, puis servir un second écran qui répond à des demandes à une paire de " questions de sécurité " avant vérifier la combinaison nom d'utilisateur/mot de passe. Lorsque le second écran est soumis, Retard pendant 10 secondes, vérifiez le nom d'utilisateur, le mot de passe et les questions de sécurité et signaler le succès/échec de manière générique (c'est-à-dire que vous ne fournissez pas l'attaquant avec quel morceau de données inacceptables). Ce sera seulement un peu gênant pour l'utilisateur légitime, mais ralentit l'attaquant jusqu'à 3 mots de passe par minute et fait en sorte que chaque guess mot de passe doit être associé à une question de sécurité correcte. À l'exception d'une attaque ciblée (où l'attaquant peut connaître la réponse à "Quel était le nom de votre premier animal de compagnie?"), Cela nécessiterait de nombreuses hypothèses de sécurité par mot de passe devinez. Bien sûr, vous choisirez ces deux questions d'une douzaine de réponses que l'utilisateur a déjà donné lors de l'enregistrement.
Assurez-vous d'inclure un jeton de cryptorandom dans la page initiale et secondaire et validez-les sur chaque soumission afin que l'attaquant ne puisse pas contourner les retards.
En tout état de cause, les utilisateurs légitimes vont faire la réinitialisation du mot de passe danse après une poignée de logines infructueuses de toute façon.
Dans les deux cas, il serait également utile d'envoyer une alerte à admins si un certain seuil de lockout (ou déclencheurs d'écran secondaire) est détecté afin que vous puissiez prendre des contre-mesures plus actives face à une attaque de force brute sur plusieurs comptes.
La question est un peu sous-spécifiée. Je suppose que la connexion est vérifiée sur un serveur et se produit à partir d'une application cliente écrite dans une langue dotée d'une implémentation de cryptographie haute performance disponible.
Puis avant que chaque connexion nécessite une preuve de travail. La mise en œuvre classique est que l'utilisateur doit trouver une valeur proof
afin que Hash(challenge&proof)
commence par une certaine quantité de 0
morceaux. Où challenge&proof
Une combinaison d'un défi généré par serveur et d'une preuve générée par un client. Le client doit deviner une preuve qui remplit la condition. Je ne sais pas comment combiner défi et preuve, si une simple concaténation suffit, ou si un système basé sur le HMAC doit être utilisé.
Le choix de la fonction de hachage est important, car l'attaquant peut exécuter différents matériels de l'utilisateur légitime. Je regarderais un schéma basé sur le scrypt pour éviter des attaques efficaces sur le GPU et le FPGA.
Dans une situation d'attaque, vous pouvez simplement augmenter la difficulté (c'est-à-dire le nombre de requis 0
bits), donc une connexion nécessite plus de travail.