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

Praktická kryptológia (28. časť) HMAC

18.10.2019 14:56

Mechanizmus autentifikácie obsahu správ pomocou symetrických kľúčov a kryptografických hašovacích funkcií (Keyed-Hash Message Authentication Code) je detailne opísaný v správe RFC 2104 z februára 1997 ...

ITPro

Made in Slovakia: predstavujeme zaujímavé inovácie

18.10.2019 14:53

IT produkt: Minit Minit je inovatívny nástroj na analýzu, ktorý odstraňuje subjektivitu alebo chyby zavinené ľudským faktorom. Tento miningový softvér okrem toho mapuje a zefektívňuje procesy v spolo ...

ITPro

Python - začíname

18.10.2019 14:49

Programovací jazyk Python (python.org) sa za posledný rok stal najdynamickejšie sa rozvíjajúcim jazykom a má viaceré predpoklady stať sa jednotkou v konkurencii omnoho silnejších hráčov. Seriál rozde ...

Žiadne komentáre

Vyhľadávanie

ITAPA_2019

Najnovšie videá

SlovakiaTech 2019
MANDAYIT 2019