La seguridad en Java se basa en gran medida en el modelo de ejecución del lenguaje Java y la utilización de la máquina virtual Java.
En particular, se basa en la verificación de bytecode, en los mecanismos para cargar las clases y la administración de seguridad y los controladores de acceso. Para entender los mecanismos de seguridad en Java es necesario saber cómo se carga una aplicación en la JVM.
Para la ejecución de un programa en la Maquina Virtual de Java (JVM), este tiene que implementarse con una clase que contenga el método Main para el programa. En el arranque la JVM no tiene representación binaria de la clase que contiene el método Main. Por tanto, JVM invoca al cargador de la clase para intentar cargarla. Después de cargar la clase correctamente, la clase es enlazada con la JVM. Una vez realizado esto la clase se inicia. La inicialización de la clase comienza con la inicialización de su superclase, lo que puede implicar alguna recursividad. Finalmente, de que la clase se haya inicializado, el método Main se invoca.
Resumiendo, las fases para la ejecución de un programa en Java son:
Carga.
Enlazado.
Verificación.
Preparación.
Resolución.
Inicialización.
Comprobación de seguridad.
Durante el tiempo de ejecución todas las políticas de seguridad de Java llaman a los métodos de la clase SecurityManager, para comprobar que se cumplan los requisitos. Se recuerda que por defecto la JVM no inicializa la clase SecurityManager, es decir, que una aplicación puede establecerse todos los permisos por defecto. Para instanciar un objeto de esta clase se debe usar la opción -Djava.security.manager. La base de la clase SecurityManager delegar todos los controles a la clase AccessController de JVM.
La clase AccessController es configurada en el inicio con las políticas de seguridad: