Java Security

Jussi Pohjolainen

TAMK University of Applied Sciences » ICT

Overview

1) Platform Security

1) Platform Security » Class Loader

1) Platform Security » Class Loader


class MyClassLoader extends ClassLoader {
    @overrides
	protected synchronized Class loadClass(String name, boolean resolve) { ... }
}
...
ClassLoader loader = new MyClassLoader();
Class myClass = loader.loadClass("ClassName");

1) Platform Security » Bytecode Verification

1) Platform Security » Bytecode Verification

The Byte Code Verifier

2) Authentication and Access control

2) Access control » Security Manager

2) Access control » Policy Files

2) Access control » Policy File, general form

[keystore "url" [, "type"] [,"provider"]]
grant [signedBy "signer"] [, codeBase "url"] {
      permission className ["targetName"] [,"actionList"];
      permission className ["targetName"] [,"actionList"];
      ...
};

2) Access control » Policy Files (examples)

  // If the code is signed by "Duke", grant it read/write access to all 
  // files in /tmp:
  grant signedBy "Duke" {
      permission java.io.FilePermission "/tmp/*", "read,write";
  };

  // Code that was run from c:/temp can write to path /mydocuments/
  grant codebase "file:c:/temp/" {
      permission java.io.FilePermission "/mydocuments/*", "write";
  };  

See Policy File syntax

3) Signing » Message Digest

3) Signing » Picture

3) Cryptography » Using Message Digest

MessageDigest makedigest = MessageDigest.getInstance("SHA-1");
FileInputStream input = new FileInputStream("data.dat");
int readbyte;
while(  ( readbyte = input.read() ) != -1  ) {
    makedigest.update( (byte) readbyte );
}
byte [] digest = makedigest.digest();

3) Signing » Digital Signing

3) Signing » Digital Signing

3) Signing » Digital Signing

import java.security.*;
import java.io.*;

class SecureDemo {
    public static void main(String [] args) throws Exception {
        // 1. create keys
        SecureRandom myrandom = new SecureRandom();
        byte[] seed = new byte[20];
        myrandom.setSeed(seed);
        
        KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA");
        generator.initialize(512, myrandom);
        KeyPair keys = generator.generateKeyPair();
        
        PrivateKey privateKey = keys.getPrivate();
        PublicKey publicKey = keys.getPublic();
        
        // 2. Create digest from MyApp
        Signature mysignature = Signature.getInstance("DSA");
        mysignature.initSign(privateKey);
        
        int readbyte;
        FileReader reader = new FileReader("MyApp.class");
        while((readbyte = reader.read()) != -1) {
            mysignature.update((byte) readbyte);
        }
        byte[] signature = mysignature.sign();
        reader.close();
        
        // 3. Client ensures the signature using the public - key
        Signature ensure = Signature.getInstance("DSA");
        ensure.initVerify(publicKey);
      
        FileReader reader2 = new FileReader("MyApp.class");
        while((readbyte = reader2.read()) != -1) {
            ensure.update((byte) readbyte);
        }
        
        boolean check = ensure.verify(signature);
        
        System.out.println(check);
        
    }
}

class MyApp {
    public static void main(String [] args) {
        System.out.println("Very secure app indeed!");
    }
}

3) Signing » Certificates