Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java MD5 lukeminen

Sivun loppuun

Viped [14.07.2012 15:08:28]

#

Hei yritän saada kirjautumista toimimaan javalla ja olen jo tehnyt metodin joka luo käyttäjän ja tämän salasanan md5 hashina tekstitiedostoon. Mutta mites tuo sitten luotaan sisään kirjautumisen yhteydessä. Saan tuon kyllä esim Stringiksi ongelmitta luettua mutta kun sitä pitäisi verrata MessageDigesti.isEqual() metodilla joka ei ota kuin byte taulukon sisälleen.

Tukki [14.07.2012 16:25:58]

#

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes()

Viped [14.07.2012 16:38:07]

#

Muuten hyvä mutta kun tekstitiedostossa on salasana muodossa [B@253123b7 ja tuo kun luetaan stringiksi ja otetaan getbytes niin se muuttaa tuon byteiksi ja kun koitetaan tuohon verrata käyttäjän antamaa salasanaa on se tietysti false.

etsubu [14.07.2012 18:01:14]

#

Kirjoita MD5 tiiviste tiedostoosi hexana ja kirjautumisen yhteydessä muunna salasana myös hexaksi. Niiden vertaamisessa ei pitäisi olla mitään ongelmaa. Ei varmaan tarvitse mainita, että MD5 ei ole paras valinta salasanojen säilytykseen.

Viped [14.07.2012 18:35:19]

#

Ei tarvitse ei. Tarkoitus olis käyttää SHA-512 tai jotain muuta vahvempaa. Tuo nyt vain tuli ensimmäisenä mieleen. Mutta tuli toinenkin ongelma, minun generateHash metodi luo joka kerta erilaisen hashin samasta sanasta

public static byte[] generateHash(char[] passWord) {
	byte[] bytePass = null;
	try {
		bytePass = passWord.toString().getBytes("UTF-8");
	} catch (UnsupportedEncodingException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
	MessageDigest md = null;
	try {
		md = MessageDigest.getInstance("MD5");
	} catch (NoSuchAlgorithmException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	byte[] digest = md.digest(bytePass);
	System.out.println(digest);
	return digest;
}

Esimerkkinä
[B@2ecc5436
MD5: 9ac39595a53298952a2aff63302ffc2a
[B@24bb6086
MD5: de853ef56effdc13c02233fe1ee2a7c1

Hennkka [14.07.2012 18:49:47]

#

Ihan kysymyksenä, että miksi salasana annetaan parametrina taulukkona, mutta yrität sitten muuttaa sen tekstiksi ja siitä takaisin taulukoksi? Vika on siinä, että et saa taulukkoa tekstiksi yksinkertaisesti toString-metodilla. Se palauttaa taulukolle yksilöllisen tunnuksen, joka tottakai on erilainen eri taulukoilla. Muuta metodia niin, että se saa parametrinaan String-olion.

Tiedostoon tiiviste kannattaa tallentaa ihan binäärimuodossa: Vie vähemmän tilaa ja helpompi kirjoittaa ja lukea.

Viped [14.07.2012 19:46:44]

#

Salasana annetaan taulukkona koska se tulee taulukkona passwordfieldin getPassword metodilla. Ja tuota salasanaa yritän siis verrata erillisessä tiedostossa olevaan md5 hashattuun salasanaan. Eli tarkoitatko että getpasswordilla saatu käyttäjän syöttämä salasana muutettaisiin Stringiksi ja sen jälkeen laskettaisiin siitä md5 hashi?

Lisäys:

No sehän itseasiassa toimii oikein hyvin noitten sun ohjeitten mukaan. Kiitos siitä. Semmosta vielä että nyt jostain syystä dataOutPutStream fw lisää ylimääräisen ' mukaan ennen käyttäjätunnuksen tallennusta tiedostoon. Println tätä ei missään muuttujassa näytä

public static void createNewUser(String userName, char[] passWord) {
	//Tarkastetaan tiedoston olemassa olo ja jos sitä ei ole luodaan se.
	try {
		users = new FileOutputStream(file, true);
		fw = new DataOutputStream(users);
		if (!file.exists()) {
			file.createNewFile();
		}

		//Usernamen ja md5 hashin tallentaminen tiedostoon

		fw.writeUTF(userName.trim() + ":" + hashToString(generateHash(passWord)) + "\n");
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	if (fw != null) {
		try {
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Lisäys:

Eli siis tallentaa tämän: 'Viped:f6164cc55e679ea31c3b29afff92287f

Hennkka [14.07.2012 20:49:41]

#

Itseasiassa se tallentaa sinne alkuun kaksi tavua, jotka sisältävät niitä seuraavan merkkijonon pituuden tavuina laskettuna. Siten readUTF tietää, kuinka pitkä teksti pitää lukea.

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#writeUTF(java.lang.String)

Viped [14.07.2012 20:54:09]

#

Joo huomasinkin että on kaksi tavua ja "ohitin" virheen substringin avulla. Onkohan tuo jo turhan purkka viritelmä? Vai jopa ihan toimiva?

Hennkka [14.07.2012 21:44:04]

#

Kannattaa antaa niiden tavujen olla siellä, ne evät haittaa mitään. Niiden avulla voit helposti lukea tekstin DataInputStreamin readUTF-metodin avulla. Siten voit myös tallentaa useampia käyttäjätietoja samaan tiedostoon laittamalla vain useamman kerran writeUTF ja sitten lukiessa readUTF palauttaa aina seuraavan käyttäjän.

Viped [14.07.2012 22:02:06]

#

Käytän kyllä lukiessa DataInputStreamiä mutta jostain syystä ei tunnista käyttäjää noiden tajuven kanssa, mutta kun karsin ne luettaessa pois niin ongelmia ei ole. Täytyy perehtyä huomenna virkeämpänä enemmän tuohon. Kiitos avusta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta