Podpora vývojářů

Diskuzní server pro podporu tvorby aplikací pro transakční část PVS.
Vítá vás Podpora vývojářů Přihlásit se | Připojit | Nápověda
v Vyhledat

Elektronická značka PVS, CryptoAPI a délka SHA1

Poslední příspěvek 09-16-2010, 8:28 od czernitko. Počet odpovědí: 4
Řadit příspěvky: Předchozí Další
  •  01-10-2006, 10:21 155

    Elektronická značka PVS, CryptoAPI a délka SHA1

    Implementoval jsem kontrolu elektronické značky v C++ pomocí CryptoAPI a narazil při tom na značné problémy, které se sice daly obejít, ale podle mého názoru ukazují na to, že kontrola elektronické značky je implementována značně nestandardně.

     

    Na adrese https://bezpecne.dev.gov.cz/diskuze/forums/144/ShowPost.aspx je uveden demonstrační testovací klient elektronické značky, psaný v C# a používající knihovnu CAPICOM. Na první pohled se takto „shora“ v .NET jeví vše v pořádku – používají se stringy, porovnají se, vše sedí a je hotovo.

     

    Pokud se však na kód podíváme hlouběji, opustíme .NET a implementujeme vše bez CAPICOM, ale s pomocí CryptoAPI, začneme používat místo stringů bajty – a to je přesnější, neboť hash je binární kód a nikoli string – a najednou narazíme. Když získáme z podpisu co podepsal (tedy původní hash) pomocí funkce

     

    (1)               CryptVerifyMessageSignature(...)

     

    zjistíme, že výsledek má délku nikoli 20 bajtů, jak bychom očekávali u SHA1 algoritmu, ale plných 80 bajtů! Kde se vzaly?

    Odpověď nalezneme, pokud nejprve vytvoříme hash z dokumentu submit acknowledgement (po odstranění elementu < SignatureValue>, ale i po odstranění hlavičky „<?xml version="1.0"?>“ - což mimochodem nikde v dokumentaci není uvedeno) , pomocí

     

    (2)               CryptCreateHash(...), CryptHashData(...), CryptGetHashParam(...)

     

    Výsledek má správných 20 bajtů. Tak jak s ním porovnat 80 bajtů získaných z podpisu? Inu, musíme s nimi trochu nestandardně začachrovat. Těch 20 bajtů převedema nejprve na hexa zápis, ano, nikoli třeba na base64, jak by snad někdo čekal. Získali jsme 40 bajtů. Ještě musíme přidat. Jak? Převedeme už takto získaný hexa zápis, který by již byl korektním stringem, ještě navíc na unicode (UTF-16), čímž sice každý znak zbytečně zdvojíme, ale získali jsme požadovanou délku 80.

    Nyní již stačí porovnat výsledek (1) a (2), což odpovídá postupu ve výše uvedeném příkladu z .NET, a rázem vše sedí – hash získaná z dokumentu je stejná, jako hash získaná z podpisu.

     

    Na co to poukazuje? Na to, že podpis elektronické značky není standardním podpisem hash (výsledku  algoritmu SHA1), ale podpisem hash převedené na hexa zápis a navíc ještě do unicode (UTF-16). Obojí naprosto zbytečně.

     

    Důsledkem toho je například nemožnost použít CryptoAPI funkci

     

    (3)               CryptVerifyDetachedMessageSignature(...)

     

    která zapouzdřuje (1) a (2), ale uvnitř pracuje standardně, tj. vytvoří si hash dokumentu, získá hash z podpisu, a výsledek nikdy nesedí - 0x80090006 = NTE_BAD_SIGNATURE.  Ani sedět nemůže, protože délka hash z podpisu (80) a délka hash z dokumentu (20) je vždy různá.

     

    Pavel B.

  •  01-10-2006, 21:37 160v odpovědi na155

    Re: Elektronická značka PVS, CryptoAPI a délka SHA1

    Díky za popis a rozbor. Současná implementace elektronické značky skutečně uchovává hash v rámci podpisu v base64 tvaru v kódování unicode.
  •  01-11-2006, 9:49 164v odpovědi na160

    Re: Elektronická značka PVS, CryptoAPI a délka SHA1

    Jenom ještě upřesnění - nejedná se o kódování base64, ale opravdu o převedení do zápisu v hexa, tj. počet bajtů se tím zdvojnásobí.

    To je vidět i ve výše uvedeném příkladu z .NET, kdy výsledný string vytvořený z hash

     

    sBase64 = CreateHash(xDoc.DocumentElement);

     

    má délku 40 (40 znaků wchar, bajtově 80), a je to právě SHA1 podpis (20 bajtů) převedený na hexa (40 bajtů) a unicode (80 bajtů). Base64 zápis SHA1 podpisu by měl délku 28 bajtů.

    Pavel B.

  •  10-12-2009, 13:57 1375v odpovědi na155

    Re: Elektronická značka PVS, CryptoAPI a délka SHA1

    Jen bych chtěl doplnit informaci, jak upravit vstupní XML dokument, nez z nej vytvorime hash. Vstupni XML dokument je treba upravit pomoci techto pravidel. Jde napriklad o jiz zminovane odstraneni hlavicky, dale odstraneni komentaru, DTD, doplneni parovych elementu, odstraneni prebytecnych mezer z elementu (<a    attr1>obsah</a> se zmeni na <a attr1>obsah</a>)...atd. Je toho celkem dost.
  •  09-16-2010, 8:28 1501v odpovědi na155

    Re: Elektronická značka PVS, CryptoAPI a délka SHA1

    Dobrý den,
    narazil jsem na problém s použitím CryptVerifyMessageSignature na Windows7 i Windows XP SP3. V nových verzích CryptoAPI se hlídá počítadlo načtených oktetů při dekódování ASN.1 struktury, které ve starších verzích spokojeně přeteklo, ale v nových verzích se hlídá. Proto mi selhává ověření podepsaných datových struktur větších než cca 2MB. Používá někdo nízkoúrovňové funkce CryptoAPI pro rozebrání ZFO souboru (podpis, podepsaná data, přiložené certifikáty), a byl by ochoten se podělit o své zkušenosti?
    Petr
Zobrazit jako kanál RSS ve formátu XML