Java Cryptography Extension ( zkr. JCE ) je oficiálně vydané standardní rozšíření pro platformu Java a součást Java Cryptography Architecture (JCA). Jedná se o sadu balíčků, které poskytují rámec a implementaci takových kryptografických úloh, jako je šifrování a dešifrování dat, generování a ověřování řídicích klíčů, stejně jako implementace algoritmů Message Authentication Code (MAC) [1] .
Java Cryptographic Extension je založeno na stejném principu jako Java Cryptographic Architecture (JCA) a je považováno za součást JCA. Faktem je, že americké zákony zakazují export určitých typů kryptografického softwaru (zejména symetrické šifrování a vývoj společného klíčového materiálu) mimo Spojené státy a Kanadu nebo umožňují export se zkrácenými klíči. Standardní třídy JCA obsahují pouze hašovací funkce, generátory klíčů a další funkce, které nepodléhají tomuto omezení a lze je bezpečně exportovat jako součást platformy Java 2. Silné šifrovací algoritmy podléhající omezením exportu kryptografických dat v USA je však nutné získat jiné zdroje, proto jsou dodávány jako samostatný produkt - JCE.
Java Cryptographic Extension je navrženo tak, aby bylo možné připojit další kryptografické knihovny a hladce poskytovat nové algoritmy [2] .
V současné době se v JDK 1.2 kryptografické rozšíření dodává ve třech balíčcích:
javax.crypto - rozhraní a třídy pro symetrické šifrování
javax.crypto.interfaces - rozhraní pro odvození klíče Diffie-Hellman
javax.crypto.spec - třídy pro správu klíčů a parametrů kryptografických algoritmů
Stejně jako JCA, ani JCE nezávisí na implementaci konkrétních algoritmů. Pomocí SPI lze do programovacího prostředí Java současně integrovat různé implementace od různých výrobců. Od verze 1.4 Java obsahuje JCE a JCA, ale další implementace lze bez problémů připojit jak staticky, tak dynamicky.
Java Cryptographic Extension nabízí následující funkce:
Java Cryptographic Extension má bezpečnostní funkce navržené pro různé cílové skupiny.
Vestavěné bezpečnostní funkce JCE chrání uživatele před škodlivým softwarem (včetně virů), uchovávají uživatelské soubory a uživatelské informace v soukromí a ověřují identitu každého poskytovatele kódu. Uživatel může také v případě potřeby podat žádosti o bezpečnostní kontroly.
Vývojář může použít metody JCE k zahrnutí funkcí zabezpečení do svých programů, včetně kryptografických služeb a bezpečnostních kontrol. JCE vám umožňuje definovat a integrovat vaše vlastní přístupová práva (řízení přístupu k určitým zdrojům) a implementace kryptografických bezpečnostních služeb. Kromě toho jsou třídy JCE navrženy tak, aby spravovaly své vlastní páry soukromých/soukromých klíčů a certifikovaly veřejné klíče od lidí, kterým vývojář důvěřuje.
Nástroje JCE spravují úložiště klíčů (databáze klíčů a certifikátů); vytvářet digitální podpisy pro soubory JAR a také ověřovat pravost takových podpisů a integritu podepsaného obsahu; umožňují vytvářet a upravovat soukromé soubory, které určují bezpečnost jejich instalace. [2]
Různé implementace JCE zahrnují balíček Cryptix JCE, balíček Bouncy Castle a balíček IAIK JCE.
Balíček Cryptix JCE je nejznámější z bezplatných rozšíření. Práce na něm začaly v roce 1995. Byla to první dostupná kryptografická knihovna pro Javu. Poté nebyla kryptografie široce dostupná a tento projekt hrál důležitou roli v ochraně informací při vývoji programů na platformě Java. Nejnovější verze Cryptix byla vydána 28. dubna 2005. Ve stejném roce byla ukončena podpora pro Cryptix.
Balíček Cryptix JCE obsahuje:
Stejně jako Cryptix JCE je balíček Bouncy Castle zdarma. První oficiální vydání skákacího hradu se objevilo v květnu 2000 a obsahovalo asi 27 000 řádků kódu. Projekt se neustále rozrůstal a do roku 2012 měl kód Bouncy Castle pro Javu přes 300 000 řádků [1] .
To zahrnuje
a má následující vlastnosti
Komerční balíček implementovaný Institutem pro aplikované zpracování a komunikaci informací (IAIK) Technické univerzity v Grazu. [čtyři]
Následující příklad ukazuje implementaci šifrování bajtového pole pomocí algoritmu AES. K napsání programu byly použity nástroje balíčku BouncyCastle. [5]
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher ( new CBCBlockCipher ( new AESFastEngine () ) ); SecureRandom srr = new SecureRandom (); byte [] AESkey = nový byte [ 16 ] ; srr _ nextBytes ( AESkey ); byte [] AESinitV = nový byte [ 16 ] ; srr _ nextBytes ( AESinitV ); ParametersWithIV piv = new ParametersWithIV ( new KeyParameter ( AESkey ), AESinitV ); šifra . init ( true , piv ); byte [] výsledek = nový byte [ šifra . getOutputSize ( toEncrypt . length ) ] ; int len = šifra . processBytes ( toEncrypt , 0 , toEncrypt . length , result , 0 ); zkuste { šifra . doFinal ( vysledek , len ); } catch ( CryptoException ce ) { result = "Chyba šifry" . getBytes (); ce . printStackTrace (); }