22. juli 2003 - 14:43Der er
44 kommentarer og 1 løsning
kryptering/dekryptering + socket.
Jeg har en klient som skal valideres (eller hedder det verificeres?) af en server før klienten kan få adgang til en db på serveren.
Det er stand-alone apps jeg har lavet og kunne godt tænke mig at kryptere det login-password, der sendes fra klient til server, således at det ikke lige sådan bliver opsnappet. Når klienten er valideret af serveren uploades nogle objekter til serveren - disse bør vel også krypteres eller?
Er det sikkert at bruge DES som kryptering eller skal der andre midler til? Det kommer selvfølgelig an på forholdene, men er det meget let at bryde en DES kryptering?
Jeg fandt denne klasse et andet sted på exp: import java.security.Security; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec;
public class Des { private Cipher des; private SecretKey deskey; public Des(String key) { try { Security.addProvider(new com.sun.crypto.provider.SunJCE()); des = Cipher.getInstance("DES/ECB/PKCS5Padding"); deskey = new SecretKeySpec(key.getBytes(), "DES"); } catch(Exception e) { } } public byte[] encrypt(byte[] plaindata) throws Exception { des.init(Cipher.ENCRYPT_MODE, deskey); return des.doFinal(plaindata); } public byte[] decrypt(byte[] cipherdata) throws Exception { des.init(Cipher.DECRYPT_MODE, deskey); return des.doFinal(cipherdata); } public static void main(String[] args) throws Exception { Des ec = new Des("hemmelig"); String s1 = "Dette er en test"; byte[] b1 = ec.encrypt(s1.getBytes()); byte[] b2 = ec.decrypt(b1); String s2 = new String(b2); System.out.println(s2); } }
vil den være passende at bruge for mit vedkommende og er det iøvrigt muligt at gøre brug af denne krypteringsform i midlets (DES krypt/dekrypt er vel forholdsvis tung)?
Hvis det er fint med DES hvordan sender og modtager jeg så et array over socket?
Håber ikke du har tabt modet pga. de mange spørgsmål! Mvh Torben
1) Der er stor forskel på at kryptere på transport niveau som med SSL og kryptere på applikations niveau som med krypteret password.
2) Det er strengt taget ikke sikkert at sende passwordet krypteret. Fordi hvis nogen opsnapper beskeden, så kan de jo bare sende det samme krypterede password uden at kende hverken plain password eller key. Hvis krypteret password skal være sikkert så skal det krypterede passwor kun kunen bruges en gang.
Nu virker søgningen desværre ikke pt her på exp. Kan man "uden videre" arbeje med en ssl protokol? Det kræver vel et certifikat, som man endten selv udsteder eller får en anden til? Jeg bruger i forvejen ObjectOutputStream og ObjectInputStream til at sende og modtage mine objekter med. Problemet ligger i at disse objekter indeholder fortrolige oplysninger, det er selvfølgelig ikke sådan FBI fortrolige men diverse informationer omkring diverse firmaer som nogle person har indsamlet. Det er vel ikke nok så at holde passwordene til serverprocessen krypteret...
Ellers kan bogen Java Cryptography nok hjælpe. Den er godt nok et par år gammel efterhånden, men den forklarer fint hvordan man bruger kryptering i Java
Okey, så har jeg nok taget helt fejl... Jeg troede faktisk at det var muligt at knytte et certifikat til en java-server proces, uden at have fx en tomcat server kørende, men det er åbenbart umuligt eller?
Okey nu har jeg så fået lavet certifikatet og ifølge sun's vejledning gør man så:
To make the samplecacerts file available to both the client and the server, you can either copy it to the file <java-home>/lib/security/jssecacerts, rename it cacerts and use it to replace the <java-home>/lib/security/cacerts file, or add the following option to the command line when running the java command for both the client and the server:
Men jeg kan desværre ikke få nogle af delene til at virke :o(
I mit "javahome", som er C:\j2sdk1.4.1_01 har jeg ikke et underbibliotek til lib som hedder security. Dette bibliotek har jeg derimod i mit J2EE home-dir. Måske der bliver rodet lidt rundt pga classpath eller lign.? Min certifikat fil bliver fint oprettet og eksekverer jeg certifikat filen, kan jeg også uden problemer installere certifikatet.
Hvis jeg skriver java Server -Djavax.net.ssl.trustStore=c:\cacerts får jeg fejlen: fejl i server.java...: javax.net.ssl.SSLException: No available certificate corresponds to the SSL cipher suites which are enabled.
Det burde jo virke... Jeg fandt dette inde på vejledningssiden:
Exception, "No available certificate corresponding to the SSL cipher suites which are enabled" Problem: When I try to run a simple SSL Server program, the following exception is thrown:
Exception in thread "main" javax.net.ssl.SSLException: No available certificate corresponding to the SSL cipher suites which are enabled...
Cause: Various cipher suites require certain types of key material. For example, if an RSA cipher suite is enabled, an RSA keyEntry must be available in the keystore. If no such key is available, this cipher suite cannot be used. If there are no available key entries for all of the cipher suites enabled, this exception is thrown.
Solution: Create key entries for the various cipher suite types, or use an anonymous suite. (Be aware that anonymous ciphersuites are inherently dangerous because they are vulnerable to "man-in-the-middle" attacks, see RFC 2246.) Refer to the following sections to learn how to pass the correct keystore and certificates:
Relationship Between Classes Customizing the Default Key and Trust Stores, Store Types, and Store Passwords Additional Keystore Formats
(de sidste 3 linier er links)
Jeg forstår bare ikke lige hvad det er solutionen er :o(
Det virker nu næsten efter hensigten :o) :o) Jeg kan godt benytte mig af DataInputStream og PrintStream, men når jeg arbejder med objektOutputStream går det ikke så godt :o(
Jeg får en nullpointer exception på denne linie: output = new ObjectOutputStream (socket.getOutputStream()); output erklæres ved: private ObjectOutputStream output;
Har du nogen ide om man skal gøre noget specielt i forbindelse med objectInputStrem og objektOutputStream? Det funkede nemlig glimrende før jeg lavede det om til TLS
Jeg kan simpelthen ikke finde ud af hvorfor det ikke rigtig spiller når kommunikationen foregår over SSLSocket. Jeg har søgt på google, men jeg kan ikke finde et svar.
Jeg har lagt et billed på på www.confunded.dk/TP/fejl.JPG hvor man kan se fejlen. Og den linie den opstår i :o( Den prompt der er øverst er server prompten og den der er nederst er klienten. Jeg kører localhost.
SSL er en gammel NetScape standard. SSL3 er den nyeste, og blev sendt i RFC draft i 1996. Den blev aldrig Standard Track (hvilket i praksis betyder at den ikke bør bruges eller refereres til), men den er alligevel - pga. NS dominans i 90'erne - blevet de facto standard.
TLS 1.0 ligger meget tæt på SSL v.3 (præcis samme opbygning, handshakes osv). og har været RFC Internet Standard Track siden 1999. TLS er en forkortelse for Transport Layer Security og det er målet at TLS bliver den fælles standard.
Mvh JP - der sidder og sveder med sit eksamensprojekt!
trp79> Beklager. Jeg er ikke java kyndig nok. Skal selv lave noget SSL/TLS socket programmering i Java løbet af de næste par dage, så måske støder jeg på noget. Jeg vil dog være meget optaget de næste 14 dage, så jeg kommer måske ikke forbi...
Den var null!!! Jeg har nu fundet fejlen, men jeg forstår faktisk ikke at den var null...
public class Klient { static SSLSocket socket; static DataInputStream inStream; static PrintStream outStream; static String brugernavn; static String password; private ObjectOutputStream output; //Bruges til at sende arraylister med private javax.swing.JLabel jLStatus; //modtages fra Upload.java således at brugeren via en jlabel kan følge med i statusen af uploadingen. private boolean connected=false; private JProgressBar jProgressBar; //så man kan følge med hvor langt upload tingen er nået. private int a=0; //en tæller til jProgressBar
øverst oppe i kode stykket erklære jeg: "static SSLSocket socket;" og i sidste linie i kodestykket erklære jeg: " SSLSocket socket = (SSLSocket)sslFact.createSocket(serverAdr, 8205);"
Det bevirkede at "socket" blev null, men hvorfor? Nu virker det, efter at jeg har fjerne SSLSocket fra den sidste linie :o)
Du laver en klasse variabel socket. Den får værdien null når klassen loades.
Så kalder du en constructor. Den constructor laver en lokal varibale ved navn socket, creater en SSLSocket og assigner den til den lokale variabel. Klasse variablen er stadigvæk null. Nå du forlader constructoren så garbage collectes den lokale variabel og SSL socketen lukkes.
Senere bruger du så klasse variablen som stadigvæk er null.
Ja selvfølgelig. Spørgsmålet gik efterhånden en del væk fra overskriften og du har vel også brugt en del tid på det? Var det ikke fair med et par extra points til dig?
Lige et afsluttende spøgsmål: Certifikatet sendes fra server til klient, derfor skal certifikatet vel ikke være installeret (ved at eksekverer/dobbeltklikke cert.cer)? Det er fordi mit prog virker forrygende når jeg køre på localhost, men når jeg tester det på et netværk så kan der ikke oprettes forbindelse :o(
Det var underligt... af en eller anden underlig grund havde windows gemt filen "truststore" som "truststore.dat" og "keystore" som "keystore.dat" da jeg mailede dem til den anden pc- derfor ville den selvfølgelig ikke. Måske jeg skulle smide dem ind i jar filen, så det problem ikke opstår igen....
Synes godt om
Ny brugerNybegynder
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.