Сигурността е една от най-важните части при разработването на приложения. Езикът Java улеснява разработването на защитени приложения, като предоставя много опции и функции, които правят приложенията сигурни. Тъй като темата е голяма, тази статия ще засегне няколко ключови аспекта на функциите за сигурност и API, налични в платформата Java.
Общ преглед
Платформата Java от самото начало е изградена, като се има предвид сигурността. Свойството безопасно за типа на езика и автоматичното събиране на боклука гласи, че архитектурата на Java се е опитала да поеме функциите за защита направо от ядрото си.
През последните години сигурността беше основен фокус. Например, съвременните браузъри работят за ограничаване или намаляване на поддръжката на плъгини като Java, Silverlight и Flash, защото могат да бъдат злоупотребени за включване на палав код в безобидна добавка. Въпреки че средата на Java е чиста, естеството на аплета е, че изтегля ненадежден код от публичната мрежа. Това може да бъде сериозно нарушение на сигурността. Освен това светът на браузърите се промени значително през последните няколко години. Абсолютната нужда от Applet е почти остаряла. Може би това и преди всичко нарастващата загриженост за сигурността накараха Applet да не се препоръчва от Java 9.
Рамка за сигурност на Java
Услугите за сигурност на Java се разшириха и включват голям набор от интерфейси за програмиране на приложения (API), инструменти, редица реализации на алгоритъм за сигурност, механизми и протоколи. Това осигурява цялостна среда за разработване на защитени приложения и съответното им управление.
Обхватът на API за сигурност на Java е обширен. Основата на разработването на защитено приложение лежи в интерфейсите за криптографски и публични ключове (PKI), множество оперативно съвместими общи алгоритмични реализации и други услуги за сигурност. Има интерфейси за извършване на удостоверяване и контрол на достъпа. Това позволява на приложенията да се предпазват от неоторизиран достъп до защитени ресурси.
Езикова сигурност
Като начало, самият език е изграден със загрижеността за внедряване на сигурността в неговото ядро. Най-простият пример е може би включването на безопасност на типа. Въведете безопасно означава, че програмите имат ограничен достъп до паметта по време на изпълнение. Това се постига чрез свързване на паметта само с Java обекти. Обектите имат съответен клас, който определя тяхното поведение; това гарантира, че програмата може да действа върху него само в съответствие с дефинираното поведение. Тази идея резонира с динамичната проверка на типове, но Java също така включва сложна статична проверка на типове, когато е възможно, за да се поддаде на ограничението на своя динамичен аналог. Например, верификаторът на байт код е ефективен статичен проверяващ тип, използван по време на компилиране, за да открие всякакъв тип грешка и да докладва проактивно на разработчика. Инструментът за проверка на байткод гарантира, че се изпълнява законен байткод, като отговаря на спецификацията на езика Java. Освен това, той също така проверява за нарушаване на паметта, недостатъчно/препълване на стека, правилно привеждане на типа и така нататък. В допълнение към това има модификатори като частен, защитен и публичен за потвърждаване на ограничен достъп.
Доставчици на сигурност
Услугите действат като доставчик на сигурност. Те, когато са включени в платформата Java чрез стандартни интерфейси, улесняват приложението за получаване на услуги за сигурност. Предимството на този механизъм е, че разработчикът не трябва да знае за сложните детайли и вместо това може да се съсредоточи върху интегрирането на функциите за сигурност в приложението. Тази идея е капсулирана в абстрактния клас, наречен java.security.Provider . Услугата за сигурност се получава чрез getInstance() метод, предоставен от Доставчика . Може да има много конфигурирани доставчици, като всеки има име и номер на версия, конфигурирани във всяка среда на изпълнение, в която е инсталирана. Например, една програма може да получи конкретен алгоритъм за обобщаване на съобщения, като по избор поиска конкретен доставчик с името си, както следва:
MessageDigest messageDigest = MessageDigest.getInstance("MD5", "MyProvider1");
Криптография
Java криптографските API са разпределени между два пакета:java.security и javax.crypto . Java предоставя голямо разнообразие от криптографски услуги чрез внедряване на редица криптографски алгоритми. Някои от тях са както следва:
- java.security.MessageDigest: Този клас осигурява реализацията на еднопосочна хеш функция, която приема данни с произволен размер и извежда хеш стойност с фиксирана дължина. Алгоритъмът е наречен SHA-1 или SHA-256.
- java.security.Signature: Този клас се използва за осигуряване на функционалността на алгоритъм за цифров подпис, като DSA, RSA или DSA алгоритми, като се използва алгоритъма за обобщаване на съобщения SHA-256. Цифровият подпис се използва специално за гарантиране на целостта и автентичността на цифровите данни.
- java.security.SecureRandom: Този клас предоставя функционалност за генериране на криптографски силно произволно число.
Инфраструктура на публичен ключ (PKI)
PKI инфраструктурата позволява сигурен обмен на данни с помощта на криптография с публичен ключ. Той включва ключове, сертификати, криптиране с публичен ключ и цифрови сертификати. Класовете, свързани с PKI, се съхраняват в java.security и java.security.cert пакети.
Удостоверяване
Удостоверяване е процесът на проверка на самоличността на потребителя. Java позволява на приложението да извършва удостоверяване на потребителя с помощта на модула, който се включва. Има клас, наречен LoginContext в javax.security.auth.login пакет. Този клас се инстанцира с име и CallbackHandler. Контекстът за вход използва името като индекс към конфигурацията. Конфигурацията определя конкретния LoginModule (javax.security.auth.spi.LoginModule ). CallbackHandler се предава на LoginModule за да поискате потребителско име и парола, например в GUI.
Сигурна комуникация
Платформата Java реализира SSL и TLS протоколи, които осигуряват функционалност за целостта на съобщенията, криптиране на данни и удостоверяване на клиент и сървър. Това може да се използва за създаване на защитено преминаване на комуникация на данни между партньори върху HTTP или TCP/IP протокол. Поддръжката на API за внедряването може да бъде намерена в javax.net.ssl пакет. Има много поддържащи класове; например SSLSocket class е разширение на java.net.Socket клас за осигуряване на защитен сокет, използващ SSL/TLS протокол. Това не е нищо друго освен нормален поточен сокет с добавен слой на защита над протокола на транспортния слой (TCP).
Контрол на достъпа
Класът за контрол на достъпа защитава достъпа до чувствителни ресурси като локални файлове. java.lang.SecurityManager клас посредничи за целия достъп. Този клас позволява на приложението да прилага политика за сигурност. Следователно възможна опасна операция може да бъде ограничена при опита, като по този начин приложението има пълен контрол върху допустимите операции.
Заключение
Това е бърза обиколка на функциите за сигурност, функционалността и API на платформата Java. Java предоставя всеобхватна поддръжка за внедряване на сигурност в приложение, където разработчиците могат да не са наясно със сложността, свързана с прилагането им, но въпреки това да се възползват от него. Това осигурява бърза и ефективна доставка на продукта, без да се налага да изграждате всичко от нулата.
Препратки
- Документация за API на Java
- Общ преглед на сигурността на Java