Toon posts:

[java - jsp] j_security_check

Pagina: 1
Acties:
  • 344 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Goeiemiddag,

Ik heb hier een relatief kleine struts-applicatie ter beschikking gekregen om wat dingen op uit te testen. De persoon die deze applicatie geschreven heeft, zet de password in plain text in de database (MySql). Dat probeer ik nu te verhelpen door ze te hashen. Het wegschrijven van gehashte passes naar de database is zonder problemen gelukt. Maar de op het loginformulier ingevulde passes hashen en die vergelijken met die in de database, daar ben ik reeds eventjes mijn hoofd over aan het breken. De login-procedure gaat via form-based authentication m.b.v. j_security_check. De manier waarop j_security_check de waarden precies vergelijkt met die in de database vind ik nogal vaag, ik ben nog maar een kleine maand bezig met j2ee. Ik vind hier in deze applicatie enkel een LoginForm.java met j_username en j_password met getters en setters (een hash van de getter levert niks op). Verder geen referenties naar j_username en j_password. Dus volgens mij staat de applicatie server in voor de authenticatie, gaat alles automatisch door wat in de realm en de web.xml staat en is het dus onmogelijk de waarden van j_passsword te manipuleren. Ik hoop van harte dat ik fout ben met deze stelling.

Bestaat er dus een manier om j_password te onderscheppen, te hashen en dan te vergelijken met die in de database of moet men hiervoor meteen JAAS gebruiken?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:22

Janoz

Moderator Devschuur®

!litemod

Als je een form hebt met j_security_check dan maak je al gebruik van JAAS. Volgens mij kun je ergens wel instellen welke queries er worden gebruikt voor de authenticatie. Als je hierin de hashing toevoegd zou het goed moeten gaan. Waar staat bijvoorbeeld ingesteld uit welke tabel de gegevens gehaald meoten worden en welke kolommen daarvoor gebruikt moeten worden?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
die instellingen staan in de server.xml van Tomcat (5.5) bij Realm.

Ik ben nu even wat documentatie aan het bekijken over jGuard, een library dat JAAS gebruikt, maar simpeler te implementeren is. Per toeval al mee gewerkt?

Verwijderd

is het niet beter om je je login over https te doen?

Verwijderd

Topicstarter
hoi Marik2000,

Je bedoelt vast dat je beter over https gaat dan passes te hashen om man-in-the-middle attacks te voorkomen? Daar ga ik mee akkoord, maar dat is nog geen reden om passes niet gehasht in de database te plaatsen. Als de applicatie geschreven is voor een klant, dan kan die klant na overname alle passes van zijn gebruikers zien in de database. Daar heeft hij geen zaken mee.

  • ahriman
  • Registratie: Januari 2002
  • Laatst online: 19-02 14:46
Ik heb mijn passwords meestal ook gehashed in de dabase staan. Als je DataSourceRealm gebruikt, kan je het attribuut digest gebruiken om aan te geven welke methode te gebruiken:

code:
1
2
3
4
5
<Realm className="org.apache.catalina.realm.DataSourceRealm"
    dataSourceName="jdbc/DatasourceNaam"
    userTable="users" userNameCol="email"
    userCredCol="password" userRoleTable="userroles"
    roleNameCol="role" digest="MD5" localDataSource="true"/>

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Als je gebruikt maakt van een realm (j_security_check), dan wordt je security door de container afgehandeld (JAAS). Je kan zoals ahriman hierboven zegt, met een digest aangeven welk hash algorithme gebruikt dient te worden.

Verder heeft het gebruik maken van SSL en hashing weinig met elkaar te maken. Het paswoord wordt pas op de server gehashed neem ik aan; dus is het wel degelijk nodig om het plain paswoord via SSL te encrypten. Het zijn 2 dingen die elkaar aanvullen ipv vervangen.

Verwijderd

Topicstarter
Met de opmerking van ahriman kom ik inderdaad al een heel stuk verder, waarvoor dank. Maar het werkt nog steeds niet. Ik kan niet meer inloggen met mijn oude accounts, wat er dus op wijst dat hij niet verder werkt met de plaintext pass, wat dus goed is. Maar ik kan ook niet inloggen met nieuw aangemaakte, waarvan de pass in de database dus wel al een hash is.

code:
1
2
3
4
5
6
7
8
9
10
<Realm className="org.apache.catalina.realm.JDBCRealm"
    digest="SHA"
    driverName="com.mysql.jdbc.Driver"              
    connectionURL="jdbc:mysql://localhost:3306/myDB"
    userTable="user" 
    userNameCol="email" 
    userCredCol="password" 
    userRoleTable="role" 
    roleNameCol="name"/>
</Context>


Dit staat dus in mijn server.xml... Het is een andere vorm dan die van ahriman, maar zou toch moeten werken zo?

Verwijderd

Ja een password word pas gehashed op de server met het gevolg dat een password in plain asci over de lijn word gestuurd. wat dus met een eenvoudige sniffer van de lijn kan worden afgehaald.

als je https (SSL) gebruikt word het encript over de lijn gestuurd. in het kort heeft het weinig zin om je password the hashen zonder SSL te gebruiken, van uit een security point of view

[ Voor 5% gewijzigd door Verwijderd op 09-05-2006 16:24 ]


Verwijderd

Topicstarter
Uiteraard. Maar security op infrastructuurniveau (ssl, proxy, firewall,...) is niet mijn taak. Ik wil enkel die passes hashen om te voorkomen dat de administrator die blank kan zien. Het is zeker niet om sniffing te voorkomen.
Ik veronderstel echter dat het mogelijk is op de client-side reeds te hashen d.m.v. javascript, maar ik ben niet echt thuis in javascript. Misschien een (slechte) tussenoplossing voor minimale webapplicaties, want als ik het goed voorheb moet je een certificate aankopen om SSL te kunnen gebruiken, en niet iedereen kan/wil dat. Hangt er natuurlijk van af welke data je beschermt en dit is in deze applicatie nog geen 2 cent per account waard ;-)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 20-02 14:32
Relevant linkje...

Hoe worden de waarden bepaald die in de database gezet worden?

[ Voor 10% gewijzigd door The - DDD op 10-05-2006 15:47 ]


Verwijderd

Topicstarter
Hartelijk dank voor de opmerkingen, mannen. Ik heb het werkende gekregen met de org.apache.catalina.realm.RealmBase-klasse. 'k Had eerst zelf een klasse geschreven die Strings hasht, maar blijkbaar hangt een hash-algoritme ook af van andere dingen (UTF-8, ISO 8859-1, ...), want mijn hash en die van Realmbase waren blijkbaar niet dezelfde. Maar nu gebruik ik dus één en dezelfde methode en werkt het wel. 'k Heb wel enkele problemen gehad met wat extra jars die vereist waren, maar dat viel al bij al nog mee.
Pagina: 1