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.
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.
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.
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
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.
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
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.
Joo huomasinkin että on kaksi tavua ja "ohitin" virheen substringin avulla. Onkohan tuo jo turhan purkka viritelmä? Vai jopa ihan toimiva?
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.