Java Netzwerkstram => Bandbreite begrenzen

undertaker

Mitglied
Java Netzwerkstream => Bandbreite begrenzen

Edit: Siehe Unten. Diese Fragen sind alle beantwortet :)

Hallo!
Hätt ne kurze Frage:
Gibt es ne fertige möglichkeit irgendwie über ne SSL Verbindung die Bandbreite bei der Dateiübertragung zu begrenzen, oder muss ich da selber was schreiben.
(Sowas wie outputStream.setBandwith ;)


Hmm... wo ich grad Dabei bin:
Gibts ne einfache und vA. schnelle Möglichkeit nen Hash von ner Datei zu machn, um eine Übertragene Datei zu überprüfen? Weil File.getHash oder so gibt ja nur den Hash des Pfades.

Wenn ich ganze Dateien (auch Große) mit Public Key verschlüsseln will, ist da die Methode mit Cipher (zb. http://www.tutorials.de/forum/java/212543-verschluesselung-2.html) zu Empfehlen?

Wenn ich mir ein Schlüsselpaar erstelle, muss es ja irgendwie einen Weg geben, einen "Startwert" mitzugeben, mit dem ich den Exakt gleichen private Key wiederherstellen kann oder?


Hmm Fragen über Fragen, vl gibs ja auch ein paar Antworten *g*..
wär super
lg trauter
 
Zuletzt bearbeitet:
hm danke.
Den 2. Thread hab ich e schon gepostet da wollt ich eben wissen ob es sinvoll ist ganze Dateien so zu verschlüsseln oder obs was schnelleres gibt.

Und danke für den hash-link... mit Einlesen und Update scheint das ziemlich gut zu gehen..nur ne 600mb datei braucht doch 45 Sekunden mit MD5 und mit SHA256 über ne Minute... gibs hier auch keine schnelleren Methoden?

Edit.:
Ok lüncht mich ich habe erkannt, dass das Einlesen alleine schon so lange dauert und wenn ich den Hash gleichzeitig mit dem Einlesen des Streams mache, das ich sowieso tun muss, macht das nix mehr aus.
 
Ich habe da leider wenig Erfahrung, aber hast Du mal versucht den Strom zu zippen. Mit GZIPInputstream bzw. GZIPOutputstream sollte das gehen. In der Regel ist der Prozessor beim zippen schneller als die Leitung mit dem Übertragen. Ich weiss nur nicht, wie hoch die Ziprate bei verschlüsselten Daten ist....


Gruss
 
Wenn ich mir ein Schlüsselpaar erstelle, muss es ja irgendwie einen Weg geben, einen "Startwert" mitzugeben, mit dem ich den Exakt gleichen private Key wiederherstellen kann oder?

Mit java wird ein Programm namens Keytool ausgeliefert. Damit kannst Du ein Schlüsselpaar erzeugen und dann ein Zertifikat daraus erstellen. Dieses Zertifikat kannst Du in einem sogenannten Keystore (einschließlich privatem Schlüssel) auf der Senderseite speichern. So musst Du den Schlüssel nicht immer neu erzeugen, sondern verwendest einfach immer den Schlüssel aus dem Store. Beispielcode gibt es massig im Web. Mit dem selben Programm erzeugt der Empfänger ebenso einen Keystore. Meist nennt man Ihn Truststore, aber er hat technisch den selben Aufbau. Dort wird der öffentlich Teil des Senderzertifikats abgelegt. Damit spartst Du Dir zumindest jedesmal den Aufwand für die Schlüsselerzeugung und Übertragung.

Zur Übertragung würde ich ein Hybrid-Verfahren verwenden. Https verwendet solche hybride Verfahren.

Das läuft im Prinzip so: Der Client generiert einen symetrischen Sessionkey, verschlüsselt ihn mit dem öffentlichen Teil des Zertifikates und schickt ihn an den Sender. Der entschlüsselt den Sessionkey mit seinem privaten Schlüssel. Jetzt haben beide Seiten einen Sessionkey und können in beide Richtungen Daten verschlüsselt übertragen. Da das symetrische Verfahren technisch sehr viel einfacher ist, solltest Du erhebliche Performancevorteile bei hoher Sicherheit haben. EDIT: Vergiss das. Du benutzt ja SSL und das ist ein hybrides Verfahren.

Gruß

EDIT Erzeugen eines Schlüsselpaares mit dem KeyTool, Keystorepasswort und Schlüsselpaarpasswort "geheim". Läßt man die Angabe -keystore weg, wird der Store im Homeverzeichnis erzeugt (auch unter Windows).

Code:
keytool -genkey -dname "cn=Fritz Schmitt, ou=Entwicklung, o=tutorials, c=DE" -alias fritz -keypass geheim -keystore C:\myStore -keyalg RSA

Selbstzertifizierung

Code:
keytool -selfcert -v -alias fritz -storepass geheim -keystore C:\myStore


Export des öffentlichen Zertifikates
Code:
keytool -export -keystore C:\myStore -alias fritz -file fritzcertfile.cer

und der Import des Zertifikates auf der Gegenseite
Code:
keytool -importcert -keystore C:\MyTrustStore -alias fritz -file fritzcertfile.cer
 
Zuletzt bearbeitet:
Hi,

hier das lesen der Schlüssel aus dem Store:

Java:
package de.tutorials;

import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;

import sun.misc.BASE64Encoder;

public class GetKeys {

	GetKeys() {
		try {
			KeyStore ks = KeyStore.getInstance("JKS");
			ks.load(new FileInputStream("c:/myStore"), "geheim".toCharArray());
			
			PrivateKey privateKey = getPrivateKey(ks);
			
			System.out.println("Ausgabe privater Schlüssel:");
			
			String b64 = new BASE64Encoder().encode(privateKey.getEncoded());
			 
			System.out.println("--------------");
			System.out.println(b64);
			System.out.println("--------------");
			
			
			PublicKey publicKey = getPublicKey(ks);
			System.out.println("Ausgabe öffentlicher Schlüssel:");
			
			b64 = new BASE64Encoder().encode(publicKey.getEncoded());
			 
			System.out.println("--------------");
			System.out.println(b64);
			System.out.println("--------------");
			
			
			

		} catch (Exception e) {
			
			e.printStackTrace();
		}

		
	}
	
	
	PrivateKey getPrivateKey(KeyStore store) throws Exception {
		// Storekennwort und Zertifikatkennwort sind zufällig gleich ;-)
		Key key = store.getKey("fritz", "geheim".toCharArray());
		if (key instanceof PrivateKey)
			return (PrivateKey) key;
		return null;
		
	 

	}
	
	
	PublicKey getPublicKey(KeyStore store) throws Exception {
		//	Zertifikat des öffentlichen Schluessels
        Certificate cert = store.getCertificate("fritz");

        // ... und Schluessel lesen
        PublicKey publicKey = cert.getPublicKey();
        
        return publicKey;
	}
	public static void main(String[] args) {
		new GetKeys();

	}

}

gruss

EDIT:

Code-Beispiele für symetrische und asymetrische Keyverfahren finden sich z.B. hier.
http://java.sun.com/developer/JDCTechTips/2004/tt0116.html
 
Zuletzt bearbeitet:
wow danke das is schon ziemlich viel hilfe gewesen:)

Naja nun sind noch die Frage offen wegen der Bandbreitenbegrenzung. Gibs da was fertiges oder muss ich wohl oder übel da selber was implementieren (wobei mir hier nur ein einfaches warten nach dem Senden von allen x Bytes (also nach jedem vollem Buffer) einfallen würde)?
 
Da gibt es sicher eine Lösung. Perl kann sowas, genauso wie manche Webserver (z.B. IIS). Dem wird Java ja wohl nicht nachstehen. Ich habe aber beim Googlen nix gefunden.

Gruss
 
War leider die Tage auf Uralaub, aber muss diesen Thread einfach nochmal ausgraben:
Das mit der Bandbreite hab ich mittlerweile glaub ich rausgefunden.


Jetz hab ich mich aber etwas intensiver mit dem ganzen Keystorezeug etc. auseinandergesetzt und bin grad etwas verwundert:
Bei meiner SSL Verbindung hab ich einfach gesagt, wie die verschlüsselung stattfinden sollte (cyphersuite: "SSL_DH_anon_WITH_RC4_128_MD5"), und habe nichts weiter gemacht.

Kann mir vl noch wer sagen was hier der unterschied ist zu limagos Methode, es müssen ja trotzdem keys ausgehandelt werden und ein digitales Zertifikat ist ja unten auch nicht dabei?

Und warum bekomm ich ne Meldung: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure wenn ich den Server auf einem PC im Internet starte, und im lokalen Netz funktioniert es?


mfg trauter
 
Zuletzt bearbeitet:
SSL funktioniert wie oben beschrieben.

1. Client fragt den Server nach seinem Zertifikat
2. Server schickt öffentlichen Teil des Zertifikats
3. Client prüft das Zertifikat auf diverse Merkmale
4. Client generiert symetrischen Sessionkey
5. Client verschlüsselt den Sessionkey mit public key aus dem Serverzertifikat
6. Client sendet den verschlüsselten Sessionkey an den Server
7. Server entschlüsselt den Sessionkey mit seinem privaten Schlüssel
8. Sicherer Datenaustausch mit Sessionkey in beide Richtungen

Ohne Zertifikat kann das nicht gehen, daher verstehe ich Deinen Post nicht. Schreib doch bitte ein wenig mehr dazu, bzw. poste Codeausschnitte.

Hast Du abgecheckt, ob irgendwelche Firewalls die (SSL-)Ports evlt. dicht machen oder umleiten?

Gruss
 
Zurück