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

Právne okienko

08.12.2016 12:02

1. Ako postupovať, ak obchodník nechce uznať reklamáciu tovaru objednaného z e-shopu? V takomto prípade môžu nastať v zásade dve situácie. Ak zákazník reklamuje tovar do 12 mesiacov od jeho kúpy, mož ...

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá