Klopt, als je een stored procedure in sql propt dan, ja, kan het zelfs in 1 nette regel. Maar laten we realistisch zijn, ten eerste zul je never nooit dergelijke bewerkingen doen op productie doen, dus je zou een clone van de database willen opzetten, die hashen, nachecken en - provided dat je database dat aankan - alle transacties sinds de clone uitvoeren op de clone en daarna weer hashen en database switchen en gezien de bizarre hoeveelheid activiteit op een forum met 60mil gebruikers zal je waarschijnlijk nog voor een laatste maal van de inactieve database de laatste transacties moeten overzetten, want je kunt moeilijk een site met 60mil gebruikers zomaar eventjes offline halen. Het hashen zelf zal waarschijnlijk niet op een grote cluster gebeuren maar op een lokaal systeem waar de clone naar toe getrokken is, waar je dus absoluut niet die snelheden hebt die jij omschrijft.
Nu wat betreft de code zelf:
0 tot 2 regels voor het verbinden met de database in de meeste talen
1 regel include van password hashing library (behalve als je 1 of andere standaard functie gebruikt)
1 regel voor include van config file met salt key (mogelijk opgenomen in bovenstaande library)
1 regel variable def 'start'
1 regel voor start loop binnentrekken van data (je wilt niet 60 miljoen records in memory opslaan wat bij veel systemen anders zou gebeuren)
1 regel select statement naar variable schrijven (vanuitgaande dat het op sql gebasseerd is) ("select top 10000 id, password from users where id > start" of "select id, password from users where id > start limit 10000")
1 tot 2 regels uitvoeren van query en resultaat naar variable opslaan (tweede regel omdat in veel talen er nog een standaard nabewerkingen moet gebeuren op queries voordat ze bruikbaar zijn)
1 regel voor de loop over de records
1 regel voor het hashen van wachtwoord
1 regel voor schrijven van sql voor update statement (er van uitgaande )
1 regel uitvoeren bovenstaande sql
1 regel voor sluiten van de tweede loop
1 regel waar je start de waarde toekent van laatste id
1 regel voor sluiten van eerste loop
en dat is nog maar als je van de meest simpel-mogelijke opzet uitgaat die een applicatie kan hebben en tel je de regels aan code in de password hashing library ni eens mee.
Daarna, als je een taal met uitgebreide sessie mogelijkheden hebt gebruikt (zoals bijv. veel talen met java als basis) is het goed mogelijk dat zodra je inlogt dingen zoals wachtwoorden in de sessie worden opgeslagen (en jah, dat is alles behalve efficient, maar ik heb het toch vaak genoeg gezien), dus dan moet je ook nog een script schrijven wat de sessies van iedereen herschrijft zodra ze weer een request doen (of iedereen uitloggen... maar dat lijkt me geen goed plan met zoveel gebruikers). En nee, ik probeer hier absoluut niet te zeggen dat het OK is wat hier is gebeurd, maar om nou direct rond te gaan bazuinen dat het iets is wat je "zomaar eventjes" doet dan klopt dat simpelweg niet. De wijziging die ze gemaakt hebben is zo'n wijziging die je zomaar doet (wie weet is die ook maar eventjes snel gemaakt in een namiddagje), maar er komt nog heel wat bij kijken als je productie data wilt wijzigen. Een andere approach zou kunnen zijn dat je de passworden hashed onlogin wat op zich makkelijk is, en goed scaled, maar dan blijf je natuurlijk unhashed passworden hebben. Maja, al bij al zou het goed te doen moeten zijn allemaal in een dag werk, tenminste, als je infrastructuur een beetje netjes is en dingen zoals database clones en transaction logging een beetje netjes werken, anders zal je daar ook nog meer werk voor moeten doen of de hele site offline halen (waarbij je alsnog eerst een backup/kopie zou moeten trekken wat an sich al in de minuten tijd kan lopen (naja, als je alleen de user tabel zou kopie dan is dat minder als een gig aan data wat redelijk snel zou moeten gaan.)).
PS. Trouwens, ik ben doodop terwijl ik dit zit te schrijven en ik was van plan om te gaan slapen in de trein, maar kvoelde me verplicht op het bovenstaande te reageren maar het zou dus best kunnen dat er nog stomme fouten in zitten
[Reactie gewijzigd door David Mulder op 23 juli 2024 05:37]