Platobné rozhranie VÚB e-platby

Publikované 01.03.2009, autor Lubos Dzurik

Všeobecná úverová banka poskytuje záujemcom o priame platby na ich účet vo VÚB možnosť implementovať službu e-Platby. Jedná sa o technicky vyspelú službu disponujúcu štandardnými modernými bezpečnostnými prvkami s vhodne navrhnutou štruktúrou prenášaných parametrov. Významným plusom je publikovanie technických detailov implementácie priamo na stránach VÚB - pozri Technický popis k službe e Platby VÚB.

Základná štruktúra parametrov odosielaných na rozhranie platobného servera VÚB:

Povinné parametre:
MID
ID obchodu, ktoré prideľuje banka (maximálne 20 alfanumerických znakov bez medzier)
AMT
Suma SKK, maximálne 13 znakov (ako oddeľovac desatinných miest sa použije bodka [.])
VS
Variabilný symbol, jednoznačný identifikátor platby (maximálne 10 numerických znakov)
CS
Konštantný symbol (max. 4 numerické znaky)
RURL
URL adresa, na ktorú banka presmeruje klienta po realizácii platby alebo po chybe
SIGN
Bezpečnostný kód pre zabezpečenie integrity prenášaných údajov. Pre vygenerovanie kľúča je potrebné heslo, ktoré obchodník obdrží od banky
Nepovinné parametre:
SS
Špecifický symbol (max. 10 numerických znakov)
DESC
Popis transakcie. Parameter je nepovinný a klient ho bude môcť na stránke Internet Bankingu zmeniť
REM
Emailová adresa obchodníka, kam bude zaslaná informácia o realizácii platby
RSMS
Slovenské mobilné číslo obchodníka, kam bude zaslaná informácia o realizácii platby (09XXXXXXXX)

Generácia parametru SIGN pri odosielaní na platobný server

Z hľadiska technickej implementácie je najzaujímavejším parameter SIGN. Ide o kód, ktorý je jedinečný pre každú realizovanú transakciu a kontrolou na strane odosielajúceho klienta (klientského prehliadača) ako aj platobného servera je zaručená neporušenosť prenášaných parametrov. (Pozn. SIGN je skrátením anglického SIGNature, tzn. kryptovaný podpis transakčných parametrov). SIGN ja vlastne reťazec s pevnou dĺžkou 16 znakov a vyzerá napríklad takto: [08BFDD71F7373FD1]. Pre jeho generáciu je nevyhnutné mať inštalovanú kryptovaciu knižnicu mcrypt (týka sa PHP). Príklady rutín pre generáciu SIGN parametra sú obsiahnuté v Technickom popise k službe e platby.

Parameter SIGN sa vygeneruje sa nasledovne:

  1. vytvorí sa reťazec z nasledovných parametrov: MID, AMT, VS, CS, RURL
  2. vypočíta sa SHA1 vytvoreného reťazca (raw_output, 20 znakov)
  3. reťazec SHA1 sa zakryptuje prostredníctvom obchodníkovho hesla
  4. prvých 8 bajtov zakryptovaného reťazca bude binárne prekonvertovaných do hexadecimálnej podoby
  5. výsledný SIGN parameter má dĺžku 16 alfanumerických znakov

Vďaka zakryptovaniu návratovej URL adresy (RURL) priamo do SIGN parametra nie je obchodník počas implementácie obmedzený na použitie jedinej návratovej adresy - tá sa dá pružne kedykoľvek prenastaviť. V porovnaní s ČSOB, kde musí byť návratová linka zmluvne dohodnutá pri podpise zmluvy je to významé uľahčenie procesu implementácie.

Kontrola parametru SIGN pri prijatí odpovede z platobného servera

Platobný server VÚB odosiela na zadanú návratovú linku (RURL) nasledovnú štruktúru parametrov:

Povinné parametre:
VS
Variabilný symbol, jednoznačný identifikátor platby (maximálne 10 numerických znakov)
RES
Výsledok transakcie (RESult) - [OK] alebo [FAIL]
SIGN
Bezpečnostný kód pre zabezpečenie integrity prenášaných údajov
Nepovinné parametre:
SS
Špecifický symbol (max. 10 numerických znakov)

Server obchodníka zkontroluje integritu parametrov opäť vypočítaním kontrolného SIGN parametra a jeho porovnaním so SIGN parametrom obsiahnutým v odpovedi platobného servera. Postup kryptovania je podobný, ako pri generácii SIGN parametra odosielaného na platobný server, avšak v prvom kroku sa vytvorí reťazec len z parametrov VS, RES a prípadne SS, ak je neprázdny. Pri generácii sa taktiež opäť vyžije heslo obchodníka známe len v systéme platobného servera VÚB alebo obchodníkovi.

Zhrnutie

VÚB poskytuje štandardne bezpečné, relatívne jednoduché a pritom dostatočne pružné platobné rozhranie. Správnosť vygenerovaného kľúča SIGN je možné overiť na testovacej linke https://ib.vub.sk/Development/EPayments.aspx. Technická príručka obsahuje taktiež predprogramované rutiny pre generáciu SIGN kľúča v jazyku JAVA, C# alebo PHP.

Rutiny pre generáciu SIGN kľúča:

// Java
private String CalculateSIGN(String MID, String AMT, String VS, String CS, String RURL, String PWD){
	String SIGN = "";
    try{
        String StringToEncypher = MID + AMT + VS + CS + RURL;
        MessageDigest hash = MessageDigest.getInstance("SHA-1");
        byte bytesHash[] = hash.digest(StringToEncypher.getBytes());
        Cipher des = Cipher.getInstance("DES/ECB", "Cryptix");
        des.initEncrypt(new RawSecretKey("DES", PWD.getBytes()));
        byte bytesSIGN[] = des.crypt(bytesHash, 0, 8);
        SIGN = Hex.dumpString(bytesSIGN);
    } catch (Exception e){
    	;
    }
    return SIGN;
}
// C#
private string CalculateSIGN(string MID, string AMT, string VS, string CS, string RURL, string PWD){
    string SIGN = "";
    try{
        string StringToEncypher = MID + AMT + VS + CS + RURL;
        byte[] bytesStringToEncypher = Encoding.ASCII.GetBytes(StringToEncypher);
        HashAlgorithm hash = new SHA1Managed();
        byte[] bytesHash = hash.ComputeHash(bytesStringToEncypher);
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        des.Key = Encoding.ASCII.GetBytes(PWD);
        des.Mode = CipherMode.ECB;
        ICryptoTransform transform = des.CreateEncryptor();
        byte[] bytesSIGN = new byte[8];
        transform.TransformBlock(bytesHash, 0, 8, bytesSIGN, 0);
        SIGN = BitConverter.ToString(bytesSIGN).Replace("-", "");
    }catch (Exception e){
        e = e;
    }
    return SIGN;
}
// PHP4, PHP5
function CalculateSIGN ($MID, $AMT, $VS, $CS, $RURL, $PWD){
    $SIGN = "";
    $StringToEncypher = $MID . $AMT . $VS . $CS . $RURL;
    $bytesHash = sha1($StringToEncypher, true);
    $bytesHash = CheckAndConvert($bytesHash); // nutne pre PHP < 5.0
    $des = mcrypt_module_open(MCRYPT_DES, "", MCRYPT_MODE_ECB, "");
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($des), MCRYPT_RAND);
    mcrypt_generic_init($des, $PWD, $iv); // IV je ignorovaný pri ECB
    $bytesSIGN = mcrypt_generic($des, substr($bytesHash, 0, 8));
    mcrypt_generic_deinit($des);
    mcrypt_module_close($des);
    $SIGN = strtoupper(bin2hex($bytesSIGN));
    return $SIGN;
}

function CheckAndConvert($str){
    if (StrLen($str) == 20) return $str;
    $bytes = "";
    for ($i = 0; $i < StrLen($str); $i+=2){
	    $bytes = $bytes . chr(hexdec(substr($str, $i, 2)));
    };
    return $bytes;
}

Technický popis k službe e-Platby - na stiahnutie:



Váš komentár..
Email bude prepísaný napr. na [michal AT gmail DOT com]
Pozn.: Urážlivé alebo nesúvisiace komentáre budú odstránené.
Zadajte prosím výsledok z vyššie uvedeného obrázku.