Action de recherche coopérative INRIA

Java Card : sémantique, optimisations et sécurité

Programmation en Java pour les cartes à puce

L'un des intérêts majeurs du langage Java est la possibilité de télécharger du code et de l'exécuter de manière transparente. Cette pratique soulève de sérieux problèmes en matière de sécurité des informations (confidentialité, intégrité notamment). Java y répond, entre autres, par une plus grande sûreté de programmation (typage, vérification de code importé, héritage simple, etc.) et un gestionnaire de sécurité et des recommandations en matière de politique de sécurité. Le langage lui-même est supposé sûr mais cette affirmation est toujours sujette à débats d'autant plus qu'il n'y a pas de définition officielle formelle de la sémantique du langage. Il ressort clairement des déclarations contradictoires sur le fait que Java intègre un certain nombre de dispositions complexes qui rendent indispensable la formalisation du langage (pour le moins de certains de ses aspects critiques). Il s'agit en effet de caractéristiques particulières de Java qui ont un impact direct sur la sécurité et dont les définitions informelles ne sont pas exemptes d'ambiguïtés ou d'insuffisances.

Récemment, Sun a publié la définition d'une version de Java, appelée Java Card, destinée à la programmation de cartes à puces. Java Card a été conçu en enlevant un certain nombre de constructions de Java jugées inutiles ou trop complexes (il n'y a pas de ``threads'', la mémoire n'est pas récupérée automatiquement, le chargement de classes est plus restreint qu'en Java etc.), et en ajoutant des facilités spécifiques pour gérer des transactions avec une carte (atomicité d'un groupe d'opérations, objets persistants, etc.). La politique de sécurité de Java (dite ``bac à sable'') qui interdit toute interaction entre les objets de différentes applets, a été modifiée et assouplie. Ainsi, Java Card permet de partager un objet entre plusieurs applets.

L'aspect d'efficacité n'était pas prioritaire dans la définition de Java. Or, les ressources d'une carte à puce sont limitées aussi bien en terme de calcul que de mémoire. Les performances d'un code destiné à être exécuté sur une carte deviennent importantes. Il est donc nécessaire de disposer de techniques d'analyse et d'optimisation puissantes pour Java Card.

Objectifs