Image
7.11.2016 0 Comments

Programujeme pre Android 25: Komunikácia s MySQL databázou

V dnešnom článku sa tak trochu nostalgicky vrátime k prvým častiam seriálu, v rámci ktorých sme tvorili aplikáciu plánovač a neskôr aplikáciu db_sync. Pomocou týchto vzorových aplikácií sme prezentovali vývoj jednoduchého plánovača úloh a synchronizáciu údajov uložených v internej SQLite databáze s MySQL databázou nachádzajúcou sa na webovom serveri. Dnes sa k tejto téme vrátime a popíšeme si ďalšie detaily týkajúce sa priamej komunikácie medzi Androidom a MySQL databázou. Konkrétne pôjde o spôsob akým je možné v jednoduchosti čítať údaje uložené v MySQL databáze a využiť ich na kontrolu prihlasovacích údajov. Okrem iného sa budeme venovať klasickému spôsobu generácie a používania tzv. hash reťazcov.

Hash

Na to, aby sme detailne vysvetlili význam slova hash, by sme museli začať vysvetlením základných princípov kryptológie – vedy o utajovaní komunikácie. Následne po niekoľkých „týždňoch či mesiacoch“ by sme sa dostali k slovu hash a jeho významu. Je jasné, že to si dovoliť nemôžeme.

Práve preto iba v jednoduchosti skonštatujeme, že hash je reťazec, ktorý je výstupom šifrovacieho „stroja“, a ktorý v nečitateľnej podobe reprezentuje pôvodný čitateľný text. Hash dokážeme vytvoriť mnohými nástrojmi. Na to, aby sme získali dostatočne „silný“ hash, musíme zadať čo najzložitejší vstupný text a na jeho zašifrovanie musíme použiť niektorý zo „silných“ šifrovacích algoritmov.

V Linuxe dokážeme hash vytvoriť napr. zadaním výrazu:

echo -n "heslo" | openssl dgst -sha256

Výkonnou časťou uvedeného výrazu je nástroj OpenSSL, ktorý pomocou algoritmu SHA-256 (Secure Hash Algorithm 2) vypočíta nasledujúci hash:

56b1db8133d9eb398aabd376f07bf8ab5fc584ea0b8bd6a1770200cb613ca005

Aký význam má vypočítaný hash? Jednoduchý – nedá sa spätne previesť (dešifrovať) na pôvodný čitateľný reťazec, tzn. nikto nezistí, z akého reťazca bol vytvorený. Samozrejme, že toto tvrdenie je iba teoretické pretože tzv. brute-force metódou je možné postupne skúšať tzv. slovníkové výrazy a hľadať zhodu. Pri použití zložitého vstupného reťazca sa však náročnosť dešifrovania podstatne zvyšuje a je časovo náročná. V praxi môžeme povedať, že „uhádnutie“ pôvodného čitateľného vstupného reťazca sa stáva nereálnym. Naviac šifrovací algoritmus môže byť ešte zložitejší.

Rovnaký hash reťazec dokážeme vypočítať aj v rámci Androidu a to pomocou nasledujúceho kódu:

String pwd = "heslo";
String hash = "";
try {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.update(pwd.getBytes());
    byte[] bytes = digest.digest();
    StringBuffer sbuf = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
        String hex = Integer.toHexString(0xFF & bytes[i]);
        if (hex.length() == 1) { sbuf.append('0'); }
        sbuf.append(hex);
    }
    hash = sbuf.toString();
} catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); }

Odtiaľ je už iba krok k praktickému použitiu vypočítaného hashu – spolu s menom používateľa ho uložíme do MySQL databázy a môžeme realizovať autentifikáciu používateľov využívajúcich naše aplikácie.

Autentifikácia používateľov s využitím MySQL

Rovnako ako v prípade vzorových aplikácií, ktoré sme si popísali na začiatku seriálu, aj teraz potrebujeme na strane servera pripraviť PHP skript, ktorý bude riešiť naše požiadavky. Jeho obsah je nasledujúci:

1. nadviažeme spojenie s MySQL serverom:

$dbhandle=mysql_connect("nazov_servera","meno_pouzivatela","heslo_pouzivatela");

2. vyberieme databázu:

$dbselect=mysql_select_db("nazov_databazy",$dbhandle);

3. vykonáme požadovanú akciu pomocou príslušného SQL výrazu:

$result=mysql_query("SELECT user_role FROM nazov_tabulky WHERE user_name='meno' and user_pwd='hash'",$dbhandle);
if (!$result) { echo("Nemozno ziskat udaje z tabulky: ".mysql_error()); exit(1);  }
$row=mysql_fetch_array($result);
$data=$row[0];
if ($data) { echo $data; }

4. ukončíme spojenie s MySQL serverom:

mysql_close($dbhandle);

S takto pripraveným PHP skriptom nadviažeme komunikáciu v rámci Androidovej aplikácie pomocou abstraktnej triedy HttpURLConnection a metódy openConnection() triedy URLConnection.

Abstraktná trieda URLConnection je základom pre ďalšie od nej odvodené triedy a tvorí komunikačný kanál medzi Androidovými aplikáciami a službami, ktoré možno sprístupniť pomocou URL. Vytvorenie spojenia je riešené vo viacstupňovom procese:

1. vytvorenie inštancie objektu pomocou openConnection(),

2. spracovanie parametrov spojenia modifikovaných pomocou metód setAllowUserInteraction, setDefaultUseCaches(boolean), setDoInput, setDoOutput, setIfModifiedSince, setRequestProperty, setUseCaches.

3. vytvorenie spojenia pomocou connect(),

4. sprístupnenie vzdialeného URL objektu vrátane jeho hlavičky a obsahu pomocou metód getContent, getContentEncoding, getContentLength, getContentType, getDate, getExpiration, getHeaderField, getInputStream, getLastModifed, getOutputStream.

Práca s URL objektom v Android API

Po vytvorení spojenia pracujeme so vzdialeným objektom nasledujúcim spôsobom:

1. Odovzdanie údajov realizujeme prostredníctvom streamu getOutputStream(), ktorý prepojíme so zapisovanými údajmi prostredníctvom triedy BufferedWriter zapuzdrujúcej (wrap) triedu OutputStreamWriter. V našom konkrétnom prípade ide o uvedenie URL konkrétnej HTTP stránky vrátane názvu PHP skriptu, ktorý kontaktujeme a zaslanie používateľského mena a hesla vo forme hashu, ktorý vypočítame na strane Androidu hore uvedeným programovým kódom. Nesmieme pritom zabudnúť nastaviť značku (flag) na zápis do URL objektu pomocou metódy setDoOutput().

2. V prípade priaznivého kódu odpovede (response) zo servera (getResponseCode() = HTTP_OK) realizujeme načítanie údajov prostredníctvom triedy BufferedReader zapuzdrujúcej triedu InputStreamReader. Pomáha nám pritom inštancia triedy StringBuilder() a metóda BufferedReader.readLine().

Nakoniec nezabudnime vytvorené spojenie uzavrieť zavolaním metódy HttpURLConnection.disconnect().

Zobrazit Galériu
Autor: Marek Sopko

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro

Made in Slovakia / Predstavujeme zaujímavé produkty, projekty a startupy

14.07.2019 10:53

Už takmer rok uverejňujeme v tejto rubrike úspešné IT produkty a IT projekty, semifinalistov súťaže z roku 2018, ktorej vyhodnotenie sa uskutočnilo vlani na jeseň na slávnostnom večeri IT GALA 2018. V ...

ITPro

Praktická kryptológia (26. časť) / Hašovacie nástroje

15.07.2019 10:49

V tejto časti seriálu vám v stručnosti predstavíme dva známe a veľmi často používané kryptografické nástroje, ktoré okrem iného ponúkajú možnosť výpočtu resumé správ, resp. hašov. Prvý z nich je robus ...

ITPro

Linux súkromne i pracovne v2.0 (41. časť) / Git branching a merging

14.07.2019 10:45

V tejto časti seriálu doplníme základné informácie týkajúce sa systému git o časti, ktoré majú súvis s aplikáciou vetvenia a spájania vývojových vetiev (línií). Budeme sa venovať obsahu git repozitáro ...

q

Žiadne komentáre

Vyhľadávanie

Najnovšie videá