Přeskočit na hlavní obsah

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"));

Komentáře

  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

Okomentovat

Populární příspěvky z tohoto blogu

Jak si v IT vydělat hodně peněz?

Na začátek by bylo dobré, abych objasnil samotný titulek, který může na někoho působit jako červený hadr. Článek nebude o obecných pravidlech, ale bude vyprávět můj vlastní příběh, na kterém vám zkusím ukázat, jak se dá docílit úspěchu, či alespoň správně nastartovat svojí vlastní kariéru v IT.

I když se z názvu článku dá dedukovat, že se vše bude točit kolem peněz, není tomu tak. Alespoň ze dvou třetin určitě ne. Ale to už předbíhám, pojďme to raději vzít hezky popořadě...

Kdybychom měli mluvit o roce 2017 jako o přelomové době, nejspíše to nebude pravda. I když pro někoho to může být rok plný úspěchů a štěstí v podobě narození zdravých dětí, svatby či první velké lásky, tak z pohledu lidstva se jedná o rok, který jen kopíruje předešlé a v oblasti technologií nás posouvá stejným tempem jako rok předtím.

Jsem naprosto přesvědčen o tom, že i když se současná doba tak nenazývá, tak prožíváme dobu, která jednou bude označena za revoluční, a to zejména díky vynálezu internetu, který je st…

Jak by se firmy neměly chovat k programátorům?

Každý, kdo pracuje v IT oboru, se jistě již setkal s různými „geniálními nápady“, od kterých si firma slibovala zlepšení produktivity či snížení nákladů. Ať už je to zavedení agilních principů, striktní kontrola práce či zavedení nové a skvělé metodiky, o které si „šéf“ přečetl včera na internetu. Jsou z toho skutečně tak nadšení i samotní vývojáři? A bude nový nápad fungovat?
K napsání tohoto článku mě navedly různé programátorské diskuze, kde si lidé stěžovali na firmu, kde pracují. Příklady, které zde uvedu, jsou z reálné praxe. Ať už jsem je zažil jako řadový programátor, či jako šéf týmu.
I když je poptávka po programátorech tak vysoká, že Vás headhunteři nahánějí i ve chvílích, kdy o to opravdu nestojíte, tak i přes to je mnoho lidí, kteří se bojí opustit svoje současné zaměstnání.
Čeho se nejčastěji bojíme? Je to samozřejmě nejistota, kterou si často omlouváme větami jako: „Tady mám své pohodlí, co když to jinde mít nebudu?“ nebo „I když mě to v práci štve a nebaví, tak mě ale…

Jak jsem technologicky postavil startup

Tento příběh pojednává o technologiích, nástrojích a vůbec o všem, co jsem potřeboval k tomu, abych byl schopen, postavit startup na zelené louce.

Každý správný příběh začíná stejně: "Jednou jsem...."

Kapitola první: Nápad
Jednou jsem se setkal s člověkem, který měl nápad na produkt, který se v průmyslu zatím nevyskytuje. I přes prvotní skepsi, kdy jsem si říkal: "Tohle už přeci dávno v průmyslu existuje, ne?", jsem došel ke zjištění, že nikoli.

Tím jsem se dostal ke svému prvnímu poučení. Průmysl je technologicky dost zabržděný. Osobně se domnívám, že těch důvodů, proč tomu tak je, je několik. Za prvé je to fakt, že většina lidí, kteří se pohybují v tomto odvětví jsou často konzervativní a za správné považují pouze léty osvědčené věci. Druhým důvodem je to, že jakákoli změna znamená riziko. Ať už z pohledu finanční ztráty tak i z pohledu stability výroby. No a třetím a nejzásadnějším důvodem je to, že ač zde máme spousty technologických vymožeností, narážíme na to,…