pondělí 19. března 2007

PHP & Java: SHA-1

Při vývoji javovské aplikace jsem narazil na problém autentifikace uživatelů. Problém spočíval v tom, že mám tabulku uživatelů, která obsahuje hash hesla, který je hashován pomocí PHP.

echo sha1(sha1("heslo"));


Čekal jsem, že v Java API naleznu podobnou metodu na hash Stringu, bohužel jsem hledal marně :)

Jelikož jsem si nevěděl rady, poprosil jsem na konferenci na java.cz o malou pomoc. Po odpovědi obsahující link, na tvorbu hashe ze Stringu, jsem moc moudrý nebyl :(
Potom jsem dostal ovšem odpověď v podobě třídy, kterou jsem nakonec po své úpravě byl schopen aplikovat.

package org.dostal.dochazka.crypt;

import java.security.MessageDigest;
/**
* Statické metody pro výpočet hash
*
* @author Ales Dostal;
*/
public class HashUtil {

public static final String HASH_TYPE = "SHA-1";

/**
* konstruktor
*/
private HashUtil() {}

/**
* vypocita SHA-1 hashovaci klic z byte[] a vrati jej jako HEXa retezec
*
* @param pass heslo ve String
* @return HEXa řetězec
*/
public static String SHA1AsString(String pass) {
return SHA1AsString(pass.getBytes());
}

/**
* vypocita SHA-1 hashovaci klic z byte[] a vrati jej jako HEXa retezec
*
* @param pass heslo v byte[]
* @return HEXa retezec
*/
public static String SHA1AsString(byte[] pass) {
return hex(SHA1(pass));
}

/**
* vypocita SHA-1 hashovaci klic z char[] a vrati jej jako HEXa retezec
*
* @param pass heslo v char[]
* @return HEXa retezec
*/
public static String SHA1AsString(char[] pass) {
return SHA1AsString(String.valueOf(pass));
}

/**
* Vypočte SHA-1 hashovací klíč z řetězce
*
* @param secret pomocný klíč
* @return pole bytů
*/
private static byte[] SHA1(byte[] pass) {
byte[] mac = new byte[20];
try {
MessageDigest sha = MessageDigest.getInstance(HASH_TYPE);
sha.update(pass);
mac = sha.digest();
} catch (Exception e) {
e.printStackTrace();
}
return mac;
}

/**
* Převede pole bytů na HEXa řetězec.
*
* @param data pole bytů
*/
private static String hex(byte[] data) {
StringBuilder sb = new StringBuilder();
for (byte b : data) {
sb.append(Character.forDigit((b & 240) >> 4, 16));
sb.append(Character.forDigit((b & 15), 16));
}
return sb.toString();
}

}


Nyní jsem schopen přistupovat k porovnání hashe jak z PHP, tak z Javy. Sice je to taková maličkost, ale občas dost důležitá :)

echo sha1("heslo");

System.out.println(HashUtil.SHA1AsString("heslo"));

9 komentářů:

  1. Přesně tak, přijde mi jako geniální jazyk. :)
    Až budu míti dostatek poznatků o Java EE 5, pustím se do vývoje. Zatím se trochu bojím, že bych si zlomil vaz. Přece jen, koncepce je dost odlišná od PHP a myslím, že přechod z PHP to Java je opravdu velký skok.
    Asi bych si Javy nikdy nevšiml, nebýt toho, že OOP jsem se učil právě na Jave :) V té chvíli člověk pochopí, že PHP je vážně jen skriptovací jazyk.
    Líbí se mi ta možnost použít app.server, který neobsahuje jen webový kontejner, jako v podobě PHP. Celá aplikační logika je tam oddělena, což při tvorbě velkých systémů je nutná vlastnost.
    Navíc API je celé objektové, takže tě to hodně nutí k tomu, objekty opravdu používat a učit se jejich vlastnostem, což se o PHP říci nedá.

    OdpovědětVymazat
  2. Ja ti nevim, ale Java se mi zda strasne pomala (nemyslim to jako srovnani php x java), ale tak celkove. Skoro kazda aplikace kterou pouzivam a je na jave tak je dosti pomala

    OdpovědětVymazat
  3. Toje právě dost rozšířený omyl, že Java je pomalá. Záleží v jaké oblasti se budeme bavit. Co se týče desktopu, uznávám, že zde Java stále ztrácí. Důvodem není to, že by byla špatná, ale na desktop existují i lepší jazyky.
    Na druhou stranu, když se podíváte na Open Office, NetBeans, Eclipse, to jsou věci psané v Jave. Osobně si bez nich nedovedu představit práci na PC.
    Desktopová aplikace se píše 2 způsoby, buď využiji Swing. což je standard SUNu, který začíná ve všem od začátku a není nijak závislý na OS, nebo použiji SWT, využívané např. v Eclipse, což je specifikace, která rozšiřuje AWT, která už komunikuje s OS. Př. aplikace bude vypadat rozdílně na (Windows, KDE, GNome).
    Co se týče webové aplikace, ta, je situace o dost lepší. Zde jistě neplatí, že by byla pomalejší než cokoli jiného. Možná využíváte spousty webových aplikací postavených na Jave a ani o tom nevíte.
    Toto téma je příliš rozsáhlé na to, abych o něm psal malý příspěvek, ale v dnešní době výkonů PC jistě neplatí, že by javoská aplikace byla pomalá. A pokud tomu tak je, není vinou Java, ale programátor dané aplikace.

    OdpovědětVymazat
  4. Podle me Java neni v hodna pro webove aplikace, tam se vice hodi python nebo ruby, ty jsou na takovou praci primo urcene. Webovou aplikaci nemyslim velke bankovni systemy.

    Javu bych pouzival je na na desktop.

    OdpovědětVymazat
  5. to error414: Je to právě naopak. Na rozsáhlejší webové aplikace je Java ideální řešení. Nejedná se jen o banky. Mrkni třeba sem: http://java.sun.com/javaee/5/docs/tutorial/doc/

    OdpovědětVymazat
  6. Sem to chtel napsat co nejstrucneji ale asi se nechapem.

    Vyvoj v jave je velice pomaly, proto se java hodi pro opravdu velke projekty.
    Na webu znamena velky projekt neco jineho nez na desktopu. Na webu je velky projekt, ale na desktopu by to byl maly prcek.

    Vyhoda javy se zacne projevovat az na opravdu velkem projektu, kdy uz ostatni jazyky nestaci. Pri vyvoji se berou v potaz totiz dve veci. Rychlost vyvoje a udrzitelnost. Java pomalost vyvoje kompenzuje paradni udrzitelnosti kodu.

    No az udrzitelnost prevazi nad rychlosti vyvoje ma cenu uvazovat o nasazeni javy. Kde je ta hranice je na uvazeni kazdeho.

    Ja osobne skatulkovani nemam moc rad, pred kazdym projektem je potreba si rict co od toho ocekavam.

    OdpovědětVymazat
  7. Co se týče té rychlosti vývoje, tak to si myslím, že je dáno spíše zkušenostma. Navíc se domnívám, že v Jave budu produktivnější než v PHP. Zase je do dáno okolnostmi. Ta samotná čistota a výraznější znovupoužitelnost, je dobrá investice do budoucna.
    Když bych to převedl do reálného světa, napadá mě k tomu dobrý příklad: "Bežec na dlouhé tratě (Java) a sprinter na 100metrů (PHP). Na 100 metrech sice výrazně prohraji, ale na 10 kilometrech? Tam prostě sprinterovi dojde dech :)"
    Jak jsem již psal, je tam několik aspektů. Nikomu to nevnucuji, ale samotná Sunovská specifikace Javy vydá tak 1000 frameworků v PHP. Každé řešení má svou míru použitelnosti a když budu na používat nesprávný nástroj, vznikne mi jen zmetek.
    Netvrdil jsem, že by se v PHP nedal tvořit velký projekt, ale je na to dost nevhodný. Důvod proč tomu tak je, zjistíte až ve chvíli, kdy si to zkusíte :)
    Abych to nějak zakončil. Na velký projekt je třeba použít takový nástroj, který mi umožňuje rozdělit samotný projekt na několik úrovní (MVC Framework, DAO, Database, ... + další větvení). To je základem dobré specifikace. A pokud toto umí přímo samotný jazyk a vede Vás k tomu, je to ideální volba. PHP toto pořádně nezvládá ani při použití různých frameworků, prostě je koncipován jako skriptovací jazyk.

    OdpovědětVymazat
  8. > Co se týče té rychlosti vývoje, tak to si myslím, že je dáno spíše zkušenostma.

    Tohle neni myslim nemyslim, tohle je proste fakt.

    > Když bych to převedl do reálného světa, napadá mě k tomu dobrý příklad: „Bežec na dlouhé tratě (Java) a sprinter na 100metrů (PHP). Na 100 metrech sice výrazně prohraji, ale na 10 kilometrech? Tam prostě sprinterovi dojde dech :)“

    tohle je presne to co sem rikal

    > Abych to nějak zakončil. Na velký projekt je třeba použít takový nástroj, který mi umožňuje rozdělit samotný projekt na několik úrovní (MVC Framework, DAO, Database,… + další větvení).

    na projekt je potreba takovy nastroj ktery se na to nejvice hodi

    OdpovědětVymazat

React a hrátky s TypeScriptem

V minulosti jsem se již několikrát zmiňoval, že používat JavaScript bez statických typů, je stejné jako jezdit na kole poslepu. Nemusí se...