Avatar billede jpvj Nybegynder
31. juli 2003 - 13:40 Der er 11 kommentarer og
1 løsning

Java applet over SSL forb.

JDK 1.4.1

I forb med et projekt, skal jeg lave følgende:

1) Hente en Java applet fra en web side over HTTPS. Den del har jeg styr på.

2) Brugeren skal foretage input på applet'en og sende resultatet retur vha. SSL.

Jeg har aldrig arbejdet med JavaApplets og netværks kommunikation, så spørgsmålet er et "hvordan gør jeg - vis venligst noget kode, der virker".

Serveren er i første om gang IIS/5 og data skal videre til en MS SQL database - den del tager vi i et andet spm.

Spm1: Hvordan sender applet'en data retur til serveren? Det kan vel enten gøres vha. noget HTTPS/POST eller vha. noget socket programmering.
Performance er vigtigt i denne sammenhæng.

Spm2: Med udgangspunkt i Spm1 - vis et eksempel på client kode, der kan sende et object (BigInteger) til serveren. Hvis serveren skal modtage data vha. et Java program - vis koden til dette.

Spm3: Jeg skal bruge en HASH funktion til at køre på flere vilkårlig tal (bl.a. et par BigIntegers). Hvad hedder klassen i Java med cryptofuntioner (bla. HASH funktioner) og giv et eksempel på anvendelse på ex. en BigInteger samt redegør for, hvordan flere BigIntegers kan køres igennem samme HASH funktion.

Håber det er nok info - ellers spørg, så skal jeg uddybe.
Avatar billede arne_v Ekspert
31. juli 2003 - 13:44 #1
re spm1)

Du kan enten sende en HTTP get eller POST med HttpURLConnection klassen
eller åbne en socket.

Socket vil være lidt hurtigere, men så skal du have en server
process kørenden på din server. HTTP GET eller POST kan processes
af IIS. Port 80 er med stor sandsynelighed åbens, mens port X
til sockets vil bringe dig i slagsmål med diverse firewall
administartorer.

Så jeg vil absolut anbefale HTTP.

a
Avatar billede arne_v Ekspert
31. juli 2003 - 13:45 #2
re spm3)

Er det noget a la MD5 du leder efter ?

Eksempel:

import java.security.MessageDigest;

public class MD5 {
  public static void main(String[] args) {
      System.out.println(oldencrypt("Dette er en test !"));
  }
  public static String oldencrypt(String pass) {
      try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        return toHex(md.digest(pass.getBytes()));
      } catch (Exception e) {
        return null;
      }
  }
  private static String toHex(byte[] ba) {
      char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                          '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
      StringBuffer sb = new StringBuffer("");
      for (int i = 0; i < ba.length; i++) {
        sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
        sb.append(hexdigit[ba[i] & 0x0F]);
      }
      return sb.toString();
  }
}
Avatar billede arne_v Ekspert
31. juli 2003 - 13:47 #3
re spm2)

Eksempler på GET og POST:

import java.net.*;
import java.io.*;

public class HttpGet {
  public static void main(String[] args) {
      try {
        URL url = new URL("http://www.domain.dk/htbin/tell2?nam=val");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
              System.out.println(new String(b,0,n));
            }
            is.close();
        }
        con.disconnect();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

import java.net.*;
import java.io.*;

public class HttpPost {
  public static void main(String[] args) {
      try {
        URL url = new URL("http://www.domain.dk/htbin/tell2");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
        String info = "nam=val";
        con.setDoOutput(true);
        con.getOutputStream().write(info.getBytes());
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
              System.out.println(new String(b,0,n));
            }
            is.close();
        }
        con.disconnect();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}
Avatar billede arne_v Ekspert
31. juli 2003 - 13:50 #4
Ovenstående ligger op til at BigInteger's sendes over som tekst strenge.

Det er meget simpelt.

Hvis du vil sende Java objekter over skal de serialiseres. Her er et
lille eksempel:

import java.util.*;
import java.io.*;
import java.net.*;

public class SerializeToString {
    public static void main(String[] args) throws Exception {
        Vector v = new Vector();
        v.add(0,new Integer(123));
        v.add(1,new String("abc"));
        String s = encode(v);
        Vector v2 = (Vector)decode(s);
        System.out.println((Integer)v2.get(0));
        System.out.println((String)v2.get(1));
    }
    private static String encode(Object o) throws Exception {
        ByteArrayOutputStream ba = new ByteArrayOutputStream(1000);
        ObjectOutputStream oba = new ObjectOutputStream(ba);
        oba.writeObject(o);
        return hexify(ba.toByteArray());
    }
    private static Object decode(String s) throws Exception {
        ByteArrayInputStream ba = new ByteArrayInputStream(dehexify(s));
        ObjectInputStream oba = new ObjectInputStream(ba);
        return oba.readObject();
    }
    private final static String hexValue[] = { "0", "1", "2", "3",
        "4", "5", "6", "7",
        "8", "9", "A", "B",
        "C", "D", "E", "F"};
    private static String hexify(byte[] ba) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < ba.length; i++) {
          sb.append(hexValue[(ba[i] >> 4) & 0x0F]);
          sb.append(hexValue[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
    private static byte[] dehexify(String s) {
        int l = s.length() / 2;
        byte[] res = new byte[l];
        for(int i = 0; i < l; i++) {
          res[i] = (byte)Integer.parseInt(s.substring(2*i, 2*i+2), 16);
        }
        return res;
    }
}

men det kræver altså at der er noget Java kode i den anden ende også.
Avatar billede jpvj Nybegynder
31. juli 2003 - 13:56 #5
Hej arne!

Hvorfor forventede jeg at det var dig der svarede *G*.

Jeg forventede noget i stil med MD5 - det var blot mig der tænkte mere generelt, men du ramte rigtigt.

Jeg har ikke tid til at teste det lige nu, men det vil jeg gøre i løbet af weekenden, så hvis jeg ikke lige får svaret de næste 48 timer, så ved I hvorfor.

Indtil videre tak!!!

JP
Avatar billede arne_v Ekspert
31. juli 2003 - 13:57 #6
Du er naturligvis opmærksom på at en applet med default security kun
kan connecte til den server den er hentet fra.

Mine kode eksempler ovenfor brugte bare almindelig HTTP, men hvsi du har
Java 1.4 så bruger du bare HttpsURLConnection i stedetfor HttpURLConnection.
Avatar billede jpvj Nybegynder
31. juli 2003 - 16:12 #7
OK - men genbruger den browseren SSL session? Eller skal den igennem et komplet handshake?

Performance you know...
Avatar billede arne_v Ekspert
31. juli 2003 - 16:14 #8
Den skal gennem komplet handshake.
Avatar billede arne_v Ekspert
31. juli 2003 - 16:17 #9
Hvis performance er meget meget kritisk, så skal du nok lade appletten åbne
en SSLSocket til en server process og så create en ObjectOutputStream
og ObjectInputStream ud fra den og så bare skrive/læse dine BigInteger's
via dem.

Men det kræver en server process ved siden af web-serveren. Og det kræver en
åben port.
Avatar billede arne_v Ekspert
31. juli 2003 - 16:18 #10
Og det kræver også en handshake - men kun 1 gang.
Avatar billede jpvj Nybegynder
31. juli 2003 - 16:20 #11
Skal lige sætte mig ned og overveje om det måske er smartere...

Det kaldes vist design analyse :-)
Avatar billede jpvj Nybegynder
03. august 2003 - 20:54 #12
arne_v> Hvis du lige sidder og keder dig så er du mere end velkommen til at kigge på http://www.eksperten.dk/spm/383250
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester