In this article
La sécurité Java expliquée
Explorer la sécurité dans l’écosystème Java
Java est à la base d’une grande partie des applications et logiciels actuels. Compte tenu de sa popularité, la sécurité des applications Java concerne d’innombrables utilisateurs et équipes de développement. Bonne nouvelle : le Java Developer Kit (JDK) intègre des fonctionnalités de sécurité particulièrement robustes. Sun Microsystems (désormais Oracle) a bel et bien conçu Java en pensant à la sécurité.
La sécurité des applications web Java a toutefois ses limites. Les organisations doivent comprendre quelles fonctionnalités de sécurité sont intégrées à Java et lesquelles ne le sont pas. Dans cet article, nous allons donc examiner ce que comprend — et ne comprend pas — le package Java Security.
Les bases de la sécurité Java
Qu’est-ce que la sécurité Java ?
La sécurité Java comprend trois couches : les outils, les API et les bibliothèques, ainsi que la sécurité du langage et de l’environnement d’exécution Java. Bien que la plateforme soit sécurisée par défaut, les développeurs doivent comprendre et activer certaines de ses autres fonctionnalités de sécurité.
Java est-il sécurisé par défaut ?
Le package Java Security propose des fonctionnalités telles que la cryptographie, l’authentification et l’infrastructure à clés publiques. De plus, la sécurité du code Java est intrinsèquement supérieure à celle de certains autres langages de programmation, grâce à son typage fort et à d’autres mesures de sécurité intégrées. Les responsables du JDK publient également les mises à jour de sécurité dans les délais. Par exemple, les nouvelles fonctionnalités de Java 17 permettent notamment de lutter contre le problème persistant de la désérialisation non sécurisée.
Quelles fonctionnalités de sécurité Java propose-t-il ?
Le langage Java lui-même, ainsi que les fonctionnalités supplémentaires du package Java Security, en font une plateforme globalement sûre.
Sécurité de la plateforme Java
Le langage Java est intrinsèquement sécurisé à bien des égards. Voici quelques-unes de ses fonctionnalités :
Gestion automatique de la mémoire - Le ramasse-miettes de Java gère la mémoire et élimine automatiquement les objets, pour que le code reste aussi propre et robuste que possible. C’est un atout pour la sécurité, car un code propre facilite les tests et réduit les risques de vulnérabilités.
Typage fort - Comme Java est un langage fortement typé, les développeurs doivent respecter des règles de codage strictes. Cela réduit les bugs et les vulnérabilités de sécurité qu’ils pourraient entraîner.
Vérification du bytecode - Lors de la compilation, Java transforme le code en bytecode indépendant de la plateforme. La vérification intégrée du bytecode garantit que celui-ci est contrôlé avant son exécution, ce qui réduit le risque d’y introduire du code malveillant.
Chargement sécurisé des classes - Le chargement dynamique des classes est une fonctionnalité Java importante, car il permet d’installer des composants logiciels à l’exécution. Mais ce mécanisme pourrait aussi permettre à des attaquants de charger des fichiers directement dans une application en cours d’exécution. Heureusement, l’équipe du JDK a anticipé cette possibilité. Les chargeurs de classes sécurisés permettent au contrôleur d’accès de la machine virtuelle d’évaluer chaque fichier de classe, puis appliquent des règles de stratégie adaptées au contexte de la requête. Ils imposent également des règles concernant les espaces de noms des fichiers de classe, ce qui contribue à empêcher les acteurs malveillants de falsifier des classes et de les exécuter sur votre système.
Ces fonctionnalités de sécurité ne sont toutefois utiles que si les équipes utilisent une version de Java à jour. Les versions obsolètes de Java ne reçoivent généralement plus de mises à jour, y compris de correctifs de sécurité, sauf si vous faites appel à un fournisseur externe qui propose une période de support plus longue. Les équipes ont actuellement le choix entre deux versions différentes de Java. Les développeurs peuvent opter pour la dernière version Java non LTS, qui suit un cycle de publication régulier (tous les 6 mois), ou choisir Java LTS, qui bénéficie d’un support et de mises à jour prolongés. En définitive, les équipes doivent choisir un modèle qui leur convient et leur permet de maintenir leur version à jour. Sinon, elles ne pourront pas bénéficier des dernières fonctionnalités de sécurité, ce qui risque d’entraîner des vulnérabilités.
Fonctionnalités de sécurité Java
Outre les mesures de sécurité intégrées à la plateforme Java, les développeurs peuvent ajouter quelques fonctionnalités de sécurité lors de la création de leurs applications. Elles sont toutes proposées dans le package Java Security (package java.security), qui contient des classes pour :
Cryptographie - La Java Cryptography Architecture prend en charge plusieurs API permettant de créer des signatures numériques, des condensés de messages, des chiffrements, des codes d’authentification de message et des clés. La cryptographie réduit le risque d’exposition des données sensibles.
Authentification - Un ensemble d’API appelé Java Authentication and Authorization Service (JAAS) permet de s’assurer que le code Java est exécuté par des sources fiables. Ces API prennent en charge des fonctions de sécurité telles que l’authentification unique (SSO), l’accès précis aux ressources sensibles et les mesures d’identification permettant de vérifier les utilisateurs. Java propose également d’autres modules d’authentification enfichables.
Autorisation - JAAS détermine également si les utilisateurs disposent des droits de contrôle d’accès nécessaires pour effectuer une action donnée.
Infrastructure à clés publiques (PKI) - Java propose des outils et des API qui facilitent le développement et le déploiement d’applications PKI. Un cadre PKI utilise des certificats numériques pour sécuriser les communications entre le serveur et le client.
Communication sécurisée - Java fournit également des fonctionnalités qui protègent l’intégrité et la confidentialité des échanges de données entre des pairs sur un réseau non fiable. Par exemple, l’API standard JSSE permet d’utiliser des sockets sécurisés pour les données TLS/DTLS, SunJSSE fournit des services cryptographiques, et Java Simple Authentication and Security Layer (SASL) établit un protocole d’authentification et ajoute une couche de sécurité entre les applications clientes et serveur.
Signatures XML - Java prend également en charge les signatures XML, qui vérifient l’intégrité des données en fournissant une documentation attestant de la validité d’un ensemble de données.
La plupart de ces fonctionnalités visent soit à renforcer le contrôle d’accès (pour s’assurer que chaque entité est autorisée à accéder aux données avec lesquelles elle interagit), soit à sécuriser le transfert des données. Un contrôle d’accès renforcé et des transferts de données sécurisés améliorent considérablement la posture de sécurité globale. Java permet aux développeurs d’y parvenir facilement.
Pour évaluer rapidement la sécurité de votre code Java, essayez notre outil d’analyse de code.
Sécurité des applications basées sur Spring
Le framework Spring Security apporte des fonctionnalités de sécurité supplémentaires qui facilitent la création d’applications sécurisées basées sur Spring.
Spring Security comprend des fonctionnalités axées sur l’authentification et l’autorisation, prises en charge dans les environnements Servlet et WebFlux. Il propose notamment des mécanismes sécurisés de stockage des mots de passe, qui facilitent l’authentification.
Spring Security protège également contre les attaques courantes, telles que :
Protection contre la falsification de requête intersite (CSRF) - Cette attaque se produit lorsqu’un acteur malveillant usurpe l’identité d’un site web de confiance, y redirige un utilisateur, puis le manipule pour qu’il divulgue des informations personnelles ou des fonds. Spring prévient cette attaque grâce à deux mécanismes : le jeton de synchronisation et l’obligation de définir l’attribut SameSite sur chaque cookie de session. Tous deux authentifient l’identité d’un site en exigeant des preuves de fiabilité dans les requêtes.
En-têtes de réponse HTTP de sécurité - Spring Security prend en charge plusieurs en-têtes de réponse HTTP. Ces en-têtes de sécurité protègent les utilisateurs finaux contre diverses attaques, comme les scripts intersites, les attaques de l’homme du milieu et le clickjacking. Les en-têtes de réponse HTTP de sécurité sont parmi les moyens les plus simples, mais aussi les plus efficaces, de limiter les activités suspectes entre le serveur et le navigateur web.
Redirection vers HTTPS - Spring Security peut être configuré pour rediriger vers HTTPS chaque fois qu’un client utilise HTTP. Cela empêche également les activités suspectes de perturber les communications entre le serveur et le navigateur web.
Sécurisez votre application Java avec Snyk

De nombreuses applications Java sont développées à l’aide de frameworks volumineux comme Spring ou Quarkus. Ils entraînent l’ajout de nombreuses dépendances, qu’il est essentiel d’analyser à la recherche de vulnérabilités. Notre nouveau rapport State of Open Source montre que le nombre moyen de vulnérabilités dans les dépendances d’une application Java est élevé. Il est essentiel d’effectuer des analyses avec Snyk Open Source, sur votre système local, dans votre pipeline et dans votre dépôt.
Sécuriser vos applications Java avec Snyk est simple : la plateforme s’installe et se configure en quelques minutes. Snyk vous fournit les bonnes pratiques de sécurité Java à chaque étape du cycle de vie du développement logiciel (SDLC), afin que vous puissiez créer des applications Java plus performantes et plus sécurisées pour vos utilisateurs.
Même avec le meilleur langage, des erreurs sont possibles. Avec Snyk Code, vous pouvez facilement détecter les problèmes de sécurité dans votre code personnalisé. Découvrez comment Snyk a résolu des problèmes de sécurité Java dans Spring et IntelliJ IDEA.
Sécurisez votre code Java au fil du développement
Repérez et corrigez en temps réel les failles de sécurité de votre code applicatif pendant le développement.