Jag behövde ett säkert loginsystem och har nu gjort ett. Frågan är nu om det är säkert nog. Jag använder mig inte av SSL eller något liknande utan skickar bara okrypterad data mellan klient och server.
För att skydda mot avlyssnining gjorde jag enligt följande. Först genererar jag ett loginformulär med PHP där session id och en timestamp finns med som gömda fält. När användaren klickar på "logga in"-knappen körs ett javascript som med hjälp av javascript genererar en checksum enligt mönstret:
Variabeln md5check sparas sedan som en gömd variabel i formuläret och lösenordsrutan töms på sitt värde. Efter det så skickas formuläret iväg till den php sida där värdena kollas.
På kontrollsidan testas ifall om md5checken motsvarar värdena i användardatabasen. Sidan kontrollerar även ifall om timestampen är nyare än fem minuter. Om inte skickas användaren tillbaka och tvingas logga in igen. När någon har lyckats logga in sparas ett timestamp som testas på varenda skyddad sida. Om timestampen är för gammal avbryts sessionen och användaren tvingas logga in igen. Detta är dock inställt på en rätt lång tid och bör aldig hända.
Se till så att serven kommer ihåg vilken timestamp den skickat ut och använder den sparade timestampen istället för att lita på timestampen som klienten skickar in genom forumäret.
Alltså:
Servern genererar en timestamp.
Servern sparar timestampen i en session för klienten.
Servern skickar timestampen till klienten.
Klienten använder sig av timestampen för att generera en tillfällig nyckel
Klienten skickar in nyckeln till servern
Servern genererar en tillfällig nyckel utifrån timestampen som servern har sparat i sessionen. Får ej använda sig av timestampen som klienten skickar in!
Servern jämför nycklarna.
Detta för att någon som sniffar nätet ska kunna skicka in en spoofad timestamp, och på så sätt kunna ta sig in.
För att skydda mot avlyssnining gjorde jag enligt följande. Först genererar jag ett loginformulär med PHP där session id och en timestamp finns med som gömda fält. När användaren klickar på "logga in"-knappen körs ett javascript som med hjälp av javascript genererar en checksum enligt mönstret:
Variabeln md5check sparas sedan som en gömd variabel i formuläret och lösenordsrutan töms på sitt värde. Efter det så skickas formuläret iväg till den php sida där värdena kollas.
Vad händer om någon inte har JavaScript aktiverat? Vad skickas iväg då?
Jag har nu gjort så att timestampet sparas som en session och jämförs med timestampet som skickas med formuläret.
aasah, om man inte har javascript aktiverat kommer ingenting att hända. :) Använder en vanlig button med ett onClick event för att anropa klient-scriptet.
Det enda ditt system gör just nu är att skydda nyckeln.
Sidorna som skickas är ju plaintext och det går fortfarande att få fullständig kontroll genom en man-in-the-middle attack.
Brukar inte säja det ofta, men jag måste endå rekommenderar dig att lägga ner din egentillverkning av ett kryptosystem, såvida du inte gör det för skojs skull.
Att bygga ett säkert kryptosystem är lika lätt som att ta hem F1 serien med en WW Polo. ;)
Jag tycker frågan är jätteintressant och skulle tycka att det vore lysande med kodexempel liknande Maltes(f ö en klippa även här) (y) script på php-portalen.
Går det att göra en inloggning & efterföljande aktivitet säker utan https är min enkla fråga?
Följdfråga 1 blir ju; är https en lösning och isf hur gör bygger man en dylik på bästa sätt (gärna med uppgift om vad det kostar att skaffa certifikat osv)?
Följdfråga 2 - om inte 1, va f-n ska man göra :)
Glömde fråga 3 - är jag ute & cyklar... :e
Så det är helt omöjligt att göra ett säkert system utan SSL? Om jag förstår MITM rätt så spelar det ju ingen roll hur man kollar användarnamn och lösenord eftersom servern inte kan urskilja den riktiga klienten och mannen i mitten.
Däremot så är jag inte så säker att säkerheten behöver vara helt 100%ig. Det jag försöker göra är ju inte ett banksystem eller liknande. Detta inloggningsystemet skall bara användas för att identifiera administratörer för olika sidor. Deras rättigheter på sidan blir sedan att lägga till nyheter, omröstningar, bilder, användare osv. ad är den vanligaste tekniken?
Det lättaste sättet är att använda SSL cert. Kostar inte så mycket heller, runt 2000 per år eller nått liknande.
Ganska överkomlig kostnad med tanke på hur mycket det skulle kosta att utveckla ett eget system. Dessutom går det inte att göra ett säkert system med PHP och JavaScript.
Alpha II, skulle tippa på att de flesta hobbysidorna inte ens krypterar lösenordet som i ditt system. Är det en sida du tjänar pengar på tycker jag du ska skaffa SSL cert.
Mina kunder är småföretagare, organisationer och liknande. 2000 kr per år är för mycket i sammanhanget så jag tror jag håller mig till den här lösningen med okrypterade sidor.
Satt dock och funderade lite på ifall om det inte skulle vara möjligt att köra RSA kryptering mellan klienten och servern via PHP och JavasScript. Det skulle säkerligen inte vara praktiskt, men rätt spännande att testa! :)
Fuel, nej det finns ingen sådan lösning.
Tänk på att klienten alltid måste ladda ner html, xml, javascript mm. från servern. Redan där är du körd. Om någon utför en MITM attack så kan dom ju ändra i koden som skickas till klienten.
Därför finns SSL inbyggt redan från början i webbrowsern, så att det blir krypterat redan från start.
Sen kan man ju fråga sig hur stor risk det är att man blir utsatt för en sådan attack... Säkerheten måste ju stå i proportion mot risken.
EDIT:
Alpha II, en ide skulle ju va att du själv hostar en SSL säkrad inloggningssida.
Därifrån kan dina kunder sedan logga in på sina egna sidor. Då kommer du ju över problemet med att klienterna ska få ner "crypto-applikationen" på ett säkert sätt.
Jag har fortfarande inte släppt detta! Jag har tänkt mig att servern skall generera ett RSA nyckelpar, skicka ett javascript (via php) som genererar en RC4 nyckel som sedan RSA krypteras och skickas tillbaka till servern som från och med nu krypterar innehållet med RC4.
Detta hindrar inte att att php-sidor kan anropas a en MITM, men jag har lite funderingar på hur det ska lösas också.
Problemet jag har är att de två bästa RSA implementationerna jag hittills hittat för PHP och JavaScript båda använder sina egna kluriga system för att lagra "big ints". Jag lyckas inte få dem att omvandla siffrorna speciellt bra. :( Jag har letat efter kod som är gjord för att fungera med PHP och JavaScript men inte hittat nån.
Gör det! :P
Thawte erbjuder två års SSL Cert för 259$, dvs mindre än 1000 kr per år. Det är priset man får betala för säkerhet.
Varför tror du själv att du inte hittat något färdigt script för detta?
Det är för att det är en dum idé som kommer misslyckas. Om du endå envisas med att göra en egen lösning så rekommenderar jag dig att läsa en bok om ämnet, typ Applied Cryptography eller liknande.
145 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17