web-dev-qa-db-fra.com

Pourquoi les GPU sont-ils si efficaces pour déchiffrer les mots de passe?

Qu'est-ce que les GPU leur permettent de déchiffrer les mots de passe si rapidement?

Il semble que la force motrice derrière l'adoption de bonnes fonctions de dérivation de clé pour les mots de passe (bcrpyt, PBKDF2, scrypt) au lieu du hachage cryptographique d'hier (MD *, SHA *) est que ces derniers soient vulnérables aux programmes qui s'exécutent sur des GPU et en devinent un grand nombre des mots de passe extrêmement rapidement. Pourquoi les GPU devraient-ils être tellement meilleurs pour évaluer ces fonctions de hachage que les CPU?

33
Nick

Pour compléter la réponse de @ Terry: un GPU a beaucoup de cœurs (des centaines). Chaque cœur est fondamentalement capable de calculer une opération arithmétique 32 bits par cycle d'horloge - en tant que pipeline . En effet, le GPU fonctionne bien avec parallélisme extrême: quand il y a beaucoup d'unités de travail identiques à effectuer, en réalité beaucoup plus que les cœurs réels ("identique" signifiant "mêmes instructions", mais pas "mêmes données" ).

Quelques détails , pour une carte NVidia un peu ancienne (une GTX 9800+, début 2009): il y a 128 cœurs, répartis en 16 "unités multicœurs" . Chaque multicœur peut initier 8 opérations par cycle (d'où l'idée de 128 cœurs: c'est 16 fois 8). Le multicœur gère les unités de travail ("threads") par groupes de 32, de sorte que lorsqu'un multicœur a une instruction à exécuter, il envoie cette instruction à ses 8 cœurs sur 4 cycles d'horloge. Il s'agit de l'opération initiation: chaque opération individuelle prend jusqu'à 22 cycles d'horloge pour s'exécuter. Vous pouvez imaginer que l'instruction et ses opérandes entrent dans le circuit comme une ligne de front qui avance, comme une vague dans une piscine: une vague donnée prendra un certain temps pour atteindre l'autre extrémité de la piscine, mais vous pouvez envoyer plusieurs vagues séquentiellement.

Vous ne pouvez donc maintenir le rythme de "128 opérations 32 bits par cycle" que tant que vous avez au moins 22 fois plus de "threads" à exécuter (c'est-à-dire un minimum de 22 · 128 = 2816), de sorte que les threads peuvent être regroupés par packs de 32 threads "identiques" qui exécutent les mêmes instructions en même temps, comme des danseurs hip-hop. En pratique, il existe des seuils et des contraintes internes qui nécessitent davantage de threads pour atteindre la bande passante optimale, jusqu'à environ 4096.

Je pourrais atteindre près de 99% de la bande passante optimale avec une implémentation SHA-1. SHA-1 utilise un peu plus de 1100 opérations 32 bits (ce serait environ 900 sur un processeur, mais un GTX 9800+ n'a pas d'opcode rotation, donc les rotations doivent être divisées en deux équipes et un ou logique), et le GPU fonctionnait à 1450 MHz, pour un grand total d'environ 160 millions de calculs SHA-1 par seconde. Cela ne peut être réalisé que tant que vous avez millions d'instances SHA-1 à calculer en parallèle, comme c'est le cas pour le craquage de mot de passe (à tout moment, vous avez besoin de 4096 SHA-1 parallèle pour alimenter les cœurs GPU, mais vous devez également faire face aux coûts d'E/S pour la saisie de mots de passe potentiels, et ces coûts domineront si vous n'avez pas beaucoup d'instances SHA-1 à traiter).

Le PC hôte, sur son processeur (un Intel Core2 quadricœur à 2,4 GHz), pourrait atteindre environ 48 millions SHA-1 par seconde, et that était avec du code SSE2 complètement optimisé. Un seul SHA-1 utilisera environ 500 cycles d'horloge sur un tel processeur (le processeur peut calculer plusieurs instructions en un seul cycle, à condition qu'elles ne rivalisent pas pour les ressources et ne dépendent pas les unes des autres), mais, pour le craquage de mot de passe , il vaut la peine d'utiliser SSE2 avec ses registres 128 bits, et capable de calculer 4 instructions en parallèle. Avec les contraintes SSE2, il faut environ 800 cycles d'horloge pour exécuter quatre SHA-1 parallèles, soit 200 cycles d'horloge par instance SHA-1. Il y a quatre cœurs dans ce CPU et le tout tourne à 2400 MHz, donc 48 millions par seconde.

Le matériel plus récent sera plus rapide, mais le GPU plus encore. Une GTX 680 arbore une coqueluche de 1536 cœurs, et il y a deux un tel GPU dans une GTX 690. Nous parlons milliards d'instances SHA-1 par seconde ici .

(A titre de comparaison, j'ai également fait une implémentation de SHA-1 sur le Cell processor , c'est-à-dire le CPU dans une console PS3, avec ses 8 coprocesseurs "SPU". Un SPU n'était pas disponible. Avec le 7 d'autres, j'atteignais environ 100 millions de SHA-1 par seconde, c'est-à-dire mieux qu'un grand processeur PC contemporain, mais pas aussi bon qu'un bon GPU de la même époque.)


Résumé: Le GPU atteint de grandes performances en utilisant un parallélisme lourd, avec des centaines (voire des milliers) de cœurs. Ceci est rendu possible par pipelining (chaque opération individuelle prend plusieurs cycles à exécuter, mais les opérations successives peuvent être lancées comme des camions sur une autoroute) et le partage du décodage des instructions (car de nombreux cœurs exécuteront les mêmes instructions à la fois).

42
Thomas Pornin

Un GPU est excellent pour traiter les calculs mathématiques. Le rendu graphique est simplement une série de calculs mathématiques complexes. Il en va de même pour les algorithmes de hachage.

Un GPU possède des centaines de cœurs qui peuvent être utilisés pour calculer des fonctions mathématiques en parallèle. Un processeur possède généralement 4 à 8 cœurs. Bien qu'un noyau CPU soit beaucoup plus rapide qu'un noyau GPU, le hachage de mot de passe est l'une des fonctions qui peuvent être effectuées en parallèle très facilement. C'est ce qui donne aux GPU un avantage considérable dans le craquage des mots de passe.

Vous devez noter que parmi les trois algorithmes que vous avez mentionnés, PBKDF2 peut toujours être craqué relativement facilement sur un GPU. L'algorithme PBKDF2 en termes très basiques hache un mot de passe avec une fonction de hachage comme MD5 ou SHA1 des milliers de fois. Bien que beaucoup plus fort qu'un simple hachage MD5 ou SHA1, il peut toujours être craqué relativement rapidement avec un GPU.

bcrypt et scrypt sont conçus pour éviter l'accélération massive du temps de crack qu'un GPU offre à un attaquant. Voir cette réponse incroyablement de Thomas Pornin pour plus d'informations: https://security.stackexchange.com/a/31846/10211

19
user10211