... som skickar lösenordet till den angivna e-postadressen. Hur gör jag det om lösenordet är krypterat och inlagt i en MySQL-databas?
Tabell:
id, epost, anvandarnamn, losenord
Låt oss säga att "saltet" är 5u.
De vanliga sätten att kryptera lösenord är med crypt() (som använder DES) eller md5(). Har jag fel när jag antar att det är någon av dessa du använt vid krypteringen?
I.s.f. måste jag tyvärr göra dig besviken. Dessa algoritmer är envägsalgoritmer. D.v.s. de går inte (skall inte gå i.a.f.) att dekryptera.
Vill du kunna göra vad du försöker att göra så måste du antingen lagra lösenordet i klartext någonstans, eller använda krypteringsalgoritmer som går att dekryptera. Det senare låter kanske jättesäkert, men är det inte eftersom du även måste lagra dekrypteringsnyckeln på servern för att det skall fungera (inte mycket bättre än att lagra lösenorden i klartext alltså).
Kort sagt - vill du ha denna funktion så måste du offra säkerheten.
Man använder ju envägsalgoritmer av en anledning. Och det är just för att höja säkerheten. Glädj dig alltså åt att du har ett säkrare inloggningssystem. :)
Det är ju hela tiden en avvägningsfråga det här med säkerhet. Ibland kanske man inte behöver den extra säkerhet som krypterade lösenord ger (beror ju på tillämpningen), och då kan man välja minskad säkerhet till förmån för ökad funktionalitet. Beror också på omständigheterna. Om det är din egen server är det t.ex. lättare att hålla klartext-lösenord hemliga än om du delar server med 100 andra på ett webhotell. Å andra sidan - om dessa 100 ändå kan komma åt de sidor du försöker skydda, utan lösenord, så kan man ju fråga sig hur mycket säkrare det totala systemet blir av att man använder krypterade lösenord.
Om någon har glömt sitt lösenord kan du väl bara slumpa fram ett nytt lösenord och skicka det till användaren? Sedan krypterar du lösenordet och lägger in det i databasen. Det gamla kan ju inte ha varit så bra i alla fall.
------------------ Gislaved.net "Tänk på vad du säger så att du inte säger vad du tänker."
Självklart går det att dekryptera DES. Det finns ännu inget matematiskt bevis att någon känd algoritm är helt oknäckbar.
1995 uppskattades följande värden för hårdvaruknäckning av DES-krypton med s.k brute-force, givetvis har dessa värden ändrats avsevärt nu 5 år senare, men se det som en fingervisning:
Som du ser är det relativt kostsamt och tidskrävande, så jag förslår att du gör som det tipsats om här ovan. Generera ett nytt lösenord och skicka detta till användaren via epost. :e
[r]Ahhrgg!! Fixed-widht på perl-taggen vore mer än välkommet!!
------------------
"Common sense is the collection of prejudices acquired by age 18" - Albert Einstein
Kryptera det med vad du vill. Det finns ju olika hänsynstaganden när man väljer kryptoalgoritmer. Det hela beror ju på om du vill stoppa "major governments", din lillasyster eller något mitt i mellan från att läsa lösenorden i klartext.
------------------
"Common sense is the collection of prejudices acquired by age 18" - Albert Einstein
Självklart går det att dekryptera DES. Det finns ännu inget matematiskt bevis att någon känd algoritm är helt oknäckbar.
I.o.f.s. Men då får du ju snarare säga att man inte vet om det går att dekryptera DES eller inte (observera att den version av DES som används av crypt() inte är samma sak som den symmetriska krypteringsalgoritmen DES, som idag anses ganska osäker - den version av DES som crypt() använder är en envägsalgoritm utformad så att det bara skall gå att kryptera, inte dekryptera). Det finns mig veterligen inget känt fall där någon lyckats.
1995 uppskattades följande värden för hårdvaruknäckning av DES-krypton med s.k brute-force, ...
Att få fram ett lösenord med "brute-force" har ingenting med dekryptering att göra. Och jag hävdar fortfarande att det inte går att dekryptera lösenord som är krypterade med crypt() (den tabell du anger verkar just beskriva den symmetriska algoritmen DES - alltså inte samma sak som crypt() använder, som är en envägsalgoritm). I.a.f. inte med de kunskaper som finns idag - och det är ju det som är intressant i sammanhanget (den dagen som motsatsen eventuellt bevisas kommer frågeställningen att sakna relevans, eftersom man då med största sannolikhet kommer sluta använda DES i dessa sammanhang). :)
Men då får du ju snarare säga att man inte vet om det går att dekryptera DES eller inte
Ja, det har du rätt i. Fel ordval av mig :)
Och jag hävdar fortfarande att det inte går att dekryptera lösenord som är krypterade med crypt() (den tabell du anger verkar just beskriva den symmetriska algoritmen DES - alltså inte samma sak som crypt() använder, som är en envägsalgoritm)
Ok, inte dekryptera, men väl knäcka. Med en brute-force attack så kommer du slutligen att ha fått fram klartextmeddelandet. Frågan är bara hur många miljarder år det tar.
Den enda skillnaden mellan crypt(3) (som jag har uppfattat det i vart fall) är ju att man utökat crypt(3) med en ytterligare permutering med ett 12-bitars saltvärde.
Hmm.. detta vart lite väl off-topic kanske? :)
------------------
"Common sense is the collection of prejudices acquired by age 18" - Albert Einstein
Ännu mer off-topic då (det har ju dock samband med ursprungsfrågan, genom att det fördjupar de svar som givits). :)
Den enda skillnaden mellan crypt(3) (som jag har uppfattat det i vart fall) är ju att man utökat crypt(3) med en ytterligare permutering med ett 12-bitars saltvärde.
I princip är det saltet som skiljer, ja. Man krypterar dessutom ett antal gånger efter varandra.
Men det som gör att man inte kan dekryptera ett krypterat lösenord beror på att man inte krypterar lösenordet på vanligt sätt, utan man utgår från ett block av nollor och använder lösenordet som nyckel för att kryptera detta block med nollor. Sedan kör man DES ett antal gånger (tror det är 25) och packar till slut om resultatet till en skrivbar sträng. Men denna sträng är alltså egentligen inte det krypterade lösenordet, utan ett antal nollor krypterade med lösenordet som nyckel (ett antal gånger).
Som sagt - jag har aldrig hört talas om någon som ens har varit i närheten av att få ut klartexten ur ett lösenord krypterat med crypt() (förutom de fall där "brute-force" använts). :)
Dock har crypt() byggd på DES svagheten att bara 8 tecken i lösenorden är signifikanta (att ha lösenord längre än 8 tecken ökar alltså inte säkerheten). Och därför har man börjat använda andra algoritmer (bl.a. md5).