Sicherheitslücke beheben & Email per Java?

Creepaz

Bekanntes Mitglied
Hi,

ich bins wieder mal. Diesmal 2 Fragen wo mich seit gestern beschäftigen.

Zur ersten: Bekanntlich kann man Java-Files ja "ohne weiteres" dekompilieren um an den Code ranzukommen. Nun stellt sich mir die Frage: Ich baue derzeit ein Spiel auf, welcher auf eine Datenbank zugreift. Blöd gesagt, wenn jetzt jemand mein "Spiel" dekompiliert, hat er ja direkt den Zugang zur Datenbank im Code. Kann ich den Login zur Datenbank irgendwie auslagern, sodass auswertige keinen Zugriff auf die Datenbank bekommen können?

Und des weiteren: Irgendwie ist es möglich, in Java ein Email zu senden. Nur leider bin ich bis jetzt noch nicht drauf gekommen, wie. Habe schon einige andere Seiten durch, aber werde daraus irgendwie nicht so wirklich schlau. Hat da jemand evtl ein Beispiel, womöglich mit Erklärungen?

Vielen Dank im Vorraus.
 

White_Fox

Top Contributor
Kann ich den Login zur Datenbank irgendwie auslagern, sodass auswertige keinen Zugriff auf die Datenbank bekommen können?
Die meisten Konzepte, über die ich da mal etwas gelesen habe, funktionieren in etwa so:
Es gibt eine Funktion, die anhand einer Zeichenkette (das Passwort) eine andere Zeichenkette (z.B. einen Hash) erstellt.

Der Clou an dieser Funktion ist, daß vom Ergebnis (z.B. den Hash) nicht auf den Input (das Passwort) zurückgeschlossen werden kann.
Gespeichert wird nur der Hash, nicht das Passwort selber.
Wenn jetzt der Benutzer ein Passwort eingibt, wird dessen Hash mit dem gespeicherten Hash verglichen. Ist das Passwort unbekannt, so mußt du so lange rumprobieren bis der Hash passt.

Ich muß dazu sagen daß das schon so ziemlich alles ist, was ich über vernünftige Authentifizierungssysteme weiß, aber vielleicht gibt dir das zumindest eine Idee.
 

Creepaz

Bekanntes Mitglied
Die meisten Konzepte, über die ich da mal etwas gelesen habe, funktionieren in etwa so:
Es gibt eine Funktion, die anhand einer Zeichenkette (das Passwort) eine andere Zeichenkette (z.B. einen Hash) erstellt.

Der Clou an dieser Funktion ist, daß vom Ergebnis (z.B. den Hash) nicht auf den Input (das Passwort) zurückgeschlossen werden kann.
Gespeichert wird nur der Hash, nicht das Passwort selber.
Wenn jetzt der Benutzer ein Passwort eingibt, wird dessen Hash mit dem gespeicherten Hash verglichen. Ist das Passwort unbekannt, so mußt du so lange rumprobieren bis der Hash passt.

Ich muß dazu sagen daß das schon so ziemlich alles ist, was ich über vernünftige Authentifizierungssysteme weiß, aber vielleicht gibt dir das zumindest eine Idee.

Naja, die Verschlüsselung der Spieler funktioniert schon, nur mein Bedenken ist eher, dass jemand den Code dekompiliert und direkt auf die Datenbank zugreifen kann. Selbst wenn er mit Userdaten nichts anfangen könnte, bestände immer noch die Möglichkeit das er die Datenbank z.B. cleart, löscht, verändert oder was auch immer. Und mit einem Hash denke ich nicht das ich auf die Datenbank zugreifen kann. Wüsste zumindest gerade nicht wie.
 

White_Fox

Top Contributor
Was ich vorhin schon fragen wollte: Wieso speicherst du denn auch Benutzerdaten im Programmcode? Sowas gehört extern. Wenn jemand deinen Code dekompiliert und dabei Nutzerdaten findet, ist gewaltig was schief gelaufen.

Mal was anderes: Man dekompiliert nicht einfach Code und kann dann deinen Quelltext lesen, das ist weitaus aufwändiger. Und nicht jeder kann das. Was ist an deinem Programm so wichtig/wertvoll, daß sich dieser Aufwand lohnene soll?
 

Creepaz

Bekanntes Mitglied
Ich speichere eben KEINE Benutzerdaten im Code. Das einzigste was im Code ist, ist die Verbindung zur Datenbank. Und um da eine Connection aufzubauen, muss man ja wohl die Logindaten und den Server der Datenbank angeben.

Da es ein Spiel werden soll, ist die Vermutung eben recht groß, dass es jemand probieren könnte an die Datenbank dran zu kommen.
 

Creepaz

Bekanntes Mitglied
Naja, die Verschlüsselung ist schon gegeben. Aber ich muss ja in der Klasse einen Connector aufbauen, der eben auf diesen Link zugreift. Und sobald man die Daten hat, kann man ja direkt drauf zugreifen.

Kein Problem, wird sich schon noch eine Lösung finden. Danke dir trotzdem.
 

Creepaz

Bekanntes Mitglied
Update: Den Code zum Mail versenden habe ich schonmal, wie folgt:

Java:
public static void sendEmailResetPWD(String email, int recovery_key) throws MessagingException {
  Properties properties = new Properties();
 
  String host = "mail.gmx.net";
 
  properties.put("mail.transport.protocol", "smtp");
     properties.put("mail.smtp.host", "mail.gmx.net");
     properties.put("mail.smtp.port", "587");
     properties.put("mail.smtp.auth", "true");
     properties.put("mail.smtp.user", sender);
     properties.put("mail.smtp.password", password);
     properties.put("mail.smtp.starttls.enable", "true");
 
     Session mailSession = Session.getInstance(properties, new Authenticator()
     {
         @Override
         protected PasswordAuthentication getPasswordAuthentication()
         {
             return new PasswordAuthentication(properties.getProperty("mail.smtp.user"),
                     properties.getProperty("mail.smtp.password"));
         }
     });
 
  Message msg = new MimeMessage(mailSession);
  msg.setFrom(new InternetAddress(sender));
  msg.setRecipient(Message.RecipientType.TO, new InternetAddress(email));
  msg.setSubject("Farmers Life | Passwort zurücksetzen");
  msg.setText("<html>"
    + "<body>"
    + "<p>Hallo,</p><br />"
    + "<p>Um dein Passwort zurückzusetzen, verwende folgenden Code:</p>"
    + "<p><b>" + recovery_key + "</b></p>"
    + "<br /><br /><p>Beachte das dieser Code nur 5 Minuten gültig ist!</p>"
    + "</body></html>");
 
  Message message = new MimeMessage(mailSession);
     InternetAddress addressTo = new InternetAddress(email);
     message.setRecipient(Message.RecipientType.TO, addressTo);
     message.setFrom(new InternetAddress(sender));
     message.setSubject("Farmers Life | Passwort zurücksetzen");
     message.setContent("<html>"
    + "<body>"
    + "<p>Hallo,</p><br />"
    + "<p>Um dein Passwort zurückzusetzen, verwende folgenden Code:</p>"
    + "<p><b>" + recovery_key + "</b></p>"
    + "<br /><br /><p>Beachte das dieser Code nur 5 Minuten gültig ist!</p>"
    + "</body></html>", "text/plain");
     Transport.send(message);
}

Allerdings bekomme ich folgende Fehlermeldung (JavaMail API ist in External Jars schon drin):
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/activation/DataHandler
at settings.Database.sendEmailResetPWD(Database.java:69)
at frames.LoginPage$4.mouseClicked(LoginPage.java:289)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6635)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6397)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4556)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2762)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataHandler
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 32 more

Hat da jemand evtl eine Lösung, oder habe ich etwas übersehen?


EDIT: Der werte Herr Creepaz war zu dämlich, die activation.jar mit einzubinden, klappt jetzt -_-
 
Zuletzt bearbeitet:

thecain

Top Contributor
Die Passwörter dürfen nie im Quellcode stehen, egal ob Java oder C schlussdendlich kann darauf zugegriffen werden, lediglich der Aufwand ist unterschiedlich.

Verschlüsseln usw geht zwar schon, aber schlussendlich wird der Code direkt auf dem Client ausgeführt und das Passwort kann/muss gelesen. Best Practice ist vom Client nicht direkt auf die DB zuzugreifen sondern via Service. Oder jeder Client hat seinen eigenen DB User, dann muss man korrekt berechtigen und es ist egal, wenn er sein eigenes Passwort kennt.
 

mihe7

Top Contributor
Ich speichere eben KEINE Benutzerdaten im Code. Das einzigste was im Code ist, ist die Verbindung zur Datenbank. Und um da eine Connection aufzubauen, muss man ja wohl die Logindaten und den Server der Datenbank angeben.

Da es ein Spiel werden soll, ist die Vermutung eben recht groß, dass es jemand probieren könnte an die Datenbank dran zu kommen.
Läuft die Datenbank beim Benutzer?
 
X

Xyz1

Gast
Schnell hingeschrieben:
Code:
		<dependency>
			<groupId>de.slackspace</groupId>
			<artifactId>openkeepass</artifactId>
			<version>0.8.1</version>
		</dependency>


Java:
package EmailsCli1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import de.slackspace.openkeepass.KeePassDatabase;
import de.slackspace.openkeepass.domain.*;

public class Pws {
	String dbname = "dbname_database.kdbx";
	HashMap<String, String> pwsmap = new HashMap<String, String>();

	Pws(String password) throws IOException {
		if (new File(dbname).exists()) {

			// Open Database
			KeePassFile database = KeePassDatabase.getInstance(dbname).openDatabase(password);

			// Retrieve all top groups
			List<Group> groups = database.getTopGroups();
			for (Group group : groups) {
				if (group.getName().equals("Emails")) {
					// Retrieve all entries
					List<Entry> entries = group.getEntries();
					for (Entry entry : entries) {
						pwsmap.put(entry.getUsername(), entry.getPassword());
					}
				}
			}

		} else {

			// Build KeePass model
			Group root = new GroupBuilder()
					.addEntry(new EntryBuilder("First dummy entry").username("Dummy").password("1234").build())
					.addGroup(new GroupBuilder("Emails").build()).build();

			KeePassFile keePassFile = new KeePassFileBuilder("writingDB").addTopGroups(root).build();

			// Write KeePass file to disk
			KeePassDatabase.write(keePassFile, password, new FileOutputStream(dbname));

		}
	}

	String getPw(String username) {
		return pwsmap.get(username);
	}

	void setPw(String username, String password) {
		pwsmap.put(username, password);
	}

	void writePws(String password) throws IOException {
		// Build KeePass model
		GroupBuilder bu = new GroupBuilder("Emails");
		for (java.util.Map.Entry<String, String> en : pwsmap.entrySet()) {
			bu.addEntry(new EntryBuilder().username(en.getKey()).password(en.getValue()).build());
		}

		Group root = new GroupBuilder()
				.addEntry(new EntryBuilder("First dummy entry").username("Dummy").password("1234").build())
				.addGroup(bu.build()).build();

		KeePassFile keePassFile = new KeePassFileBuilder("writingDB").addTopGroups(root).build();

		// Write KeePass file to disk
		KeePassDatabase.write(keePassFile, password, new FileOutputStream(dbname));
	}

	public static void main(String[] args) throws IOException {
		Pws pws = new Pws("test"); // Passwort vom Benutzer eingeben lassen.
		System.out.println(pws.pwsmap);

		pws.setPw("testus", "234567");
		pws.setPw("testus2", "765432");
		pws.writePws("test"); // Passwort vom Benutzer eingeben lassen.

		System.out.println();

		pws = new Pws("test");
		System.out.println(pws.pwsmap);
	}
}
Lasse dem Benutzer genau zweimal sein Passwort eingeben, einmal beim Öffnen der Anwendung und einmal wenn ein neues Passwort hinzugefügt werden soll, Problem gelöst.
 

Creepaz

Bekanntes Mitglied
Schnell hingeschrieben:
Code:
        <dependency>
            <groupId>de.slackspace</groupId>
            <artifactId>openkeepass</artifactId>
            <version>0.8.1</version>
        </dependency>


Java:
package EmailsCli1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import de.slackspace.openkeepass.KeePassDatabase;
import de.slackspace.openkeepass.domain.*;

public class Pws {
    String dbname = "dbname_database.kdbx";
    HashMap<String, String> pwsmap = new HashMap<String, String>();

    Pws(String password) throws IOException {
        if (new File(dbname).exists()) {

            // Open Database
            KeePassFile database = KeePassDatabase.getInstance(dbname).openDatabase(password);

            // Retrieve all top groups
            List<Group> groups = database.getTopGroups();
            for (Group group : groups) {
                if (group.getName().equals("Emails")) {
                    // Retrieve all entries
                    List<Entry> entries = group.getEntries();
                    for (Entry entry : entries) {
                        pwsmap.put(entry.getUsername(), entry.getPassword());
                    }
                }
            }

        } else {

            // Build KeePass model
            Group root = new GroupBuilder()
                    .addEntry(new EntryBuilder("First dummy entry").username("Dummy").password("1234").build())
                    .addGroup(new GroupBuilder("Emails").build()).build();

            KeePassFile keePassFile = new KeePassFileBuilder("writingDB").addTopGroups(root).build();

            // Write KeePass file to disk
            KeePassDatabase.write(keePassFile, password, new FileOutputStream(dbname));

        }
    }

    String getPw(String username) {
        return pwsmap.get(username);
    }

    void setPw(String username, String password) {
        pwsmap.put(username, password);
    }

    void writePws(String password) throws IOException {
        // Build KeePass model
        GroupBuilder bu = new GroupBuilder("Emails");
        for (java.util.Map.Entry<String, String> en : pwsmap.entrySet()) {
            bu.addEntry(new EntryBuilder().username(en.getKey()).password(en.getValue()).build());
        }

        Group root = new GroupBuilder()
                .addEntry(new EntryBuilder("First dummy entry").username("Dummy").password("1234").build())
                .addGroup(bu.build()).build();

        KeePassFile keePassFile = new KeePassFileBuilder("writingDB").addTopGroups(root).build();

        // Write KeePass file to disk
        KeePassDatabase.write(keePassFile, password, new FileOutputStream(dbname));
    }

    public static void main(String[] args) throws IOException {
        Pws pws = new Pws("test"); // Passwort vom Benutzer eingeben lassen.
        System.out.println(pws.pwsmap);

        pws.setPw("testus", "234567");
        pws.setPw("testus2", "765432");
        pws.writePws("test"); // Passwort vom Benutzer eingeben lassen.

        System.out.println();

        pws = new Pws("test");
        System.out.println(pws.pwsmap);
    }
}
Lasse dem Benutzer genau zweimal sein Passwort eingeben, einmal beim Öffnen der Anwendung und einmal wenn ein neues Passwort hinzugefügt werden soll, Problem gelöst.

Moin,

Nett gemeint, aber trifft mein Problem nicht so wirklich. Um die Benutzer geht es mir gar nicht, mir geht es eben nur darum, dass es jemand schaffen könnte den Code später zu dekompilieren und so die Verbindung zur MySQL-Datenbank aufbauen kann, da ja die Logindaten (von der MySQL-DB) im Code enthalten sind.
 

Creepaz

Bekanntes Mitglied
Noch ein paar Ideen:
-dem jeweils angemeldeten Benutzer nur bestimmte Operationen auf die DB gestatten (z.B. nur READ) oder nur über bestimmte Wege z.B. WebServices und Prepared Statements
-DB (oder nur einige Tabellen / Spalten davon) verschlüsseln
-SSL.-Zertifikate konfigurieren
-Logindaten selbst verschlüsseln: https://www.java-blog-buch.de/17-03-sicherheit-bei-der-arbeit-mit-datenbanken/ (Hashen und Salzen)

Ich muss mal schauen, evtl. kann ich die Logindaten zur DB auslagern oder schauen das ich es über Service hinkriege. Mal schauen ob ich da was passendes finde wie man sowas anstellt o_O:D
 

mihe7

Top Contributor
Vielleicht sollte ich noch kurz erklären, warum ich "in der Sprache Deiner Wahl" geschrieben habe: ich kenne Deine Umgebung nicht. Kannst Du z. B. Java auf dem Server laufen lassen oder NodeJS oder Python oder PHP oder...? Wenn Du Deine Anforderungen konkret kennst, kann Dir natürlich auch konkret geholfen werden :)
 

Creepaz

Bekanntes Mitglied
Aaaalso. Kurze Erklärung :D

- Spiel basiert auf Java und greift auf eine MySQL-Datenbank zu, ist ja soweit bekannt.
- Der Server der zur Auswahl stehen würde, ist ein normaler Webspace wie man ihn zu Hauf im Internet kostenlos "mieten" kann

Demnach sollte auf alle Fälle PHP laufen, ist ja sowieso standartmäßig. Wie es auf dem Webspace mit Java aussieht kann ich nicht sagen, schätze aber mal nicht. Die Idee wäre jetzt gewesen per PHP die Verbindung zur Datenbank auf den Webspace auszulagern und in Eclipse, sprich in dem Java-Projekt sich dort die Daten zur Verbindung rausziehen, dann stehen die Logindaten zur Datenbank schonmal nicht mehr im Projekt. Das wäre jetzt mal so mein erster Gedankengang gewesen.
 

mihe7

Top Contributor
Die Idee wäre jetzt gewesen per PHP die Verbindung zur Datenbank auf den Webspace auszulagern und in Eclipse, sprich in dem Java-Projekt sich dort die Daten zur Verbindung rausziehen, dann stehen die Logindaten zur Datenbank schonmal nicht mehr im Projekt.
Gar keine gute Idee. Was Du machen musst: PHP-Skripte schreiben, die Dir die gewünschten Infos z. B. als JSON formatiert zurückgeben. Die ganze DB-Geschichte läuft dann auf dem Webserver, die Verbindung wird nicht rausgegeben.
 

Creepaz

Bekanntes Mitglied
Gar keine gute Idee. Was Du machen musst: PHP-Skripte schreiben, die Dir die gewünschten Infos z. B. als JSON formatiert zurückgeben. Die ganze DB-Geschichte läuft dann auf dem Webserver, die Verbindung wird nicht rausgegeben.

Okay, dann bin ich schonmal einen Schritt weiter. Muss ich dann also in Eclipse die PHP-Skripte mit einbinden und die Verbindung intern auf dem Webserver aufbauen, sprich dass mein Java-Projekt die Befehle "nur an den Webserver" weitergibt und sonst nichts ausführt, sondern die gewünschten Informationen der Abfrage als JSON-Format zurückbekommt? Falls ich das richtig interpretiert habe, klingt das schonmal logisch für mich :D Muss dann bloß noch Google löchern, wie man so etwas umsetzt.

PHP an sich ist kein Thema, habe ich damals schon einige Zeit lang damit rumgespielt. Das größere Problem ist eher, wie ich das in Eclipse einbinde. Aber da wird sich auch noch eine Lösung finden. Außer ich bin mit meiner "Erklärungs-Frage" komplett auf dem Holzweg und stehe schwer auf'm Schlauch o_O
 

mihe7

Top Contributor
Muss ich dann also in Eclipse die PHP-Skripte mit einbinden
Das sind zwei getrennte Projekte: einmal der Part für den Server und der andere Teil für den Client. Mit welchen Tools Du die Projekte umsetzt, spielt ja keine Rolle.

mein Java-Projekt die Befehle "nur an den Webserver" weitergibt und sonst nichts ausführt, sondern die gewünschten Informationen der Abfrage als JSON-Format zurückbekommt?
Exakt. Für Java gibt es z. B. Jersey (REST-Client), wobei das auch mit einfachen URLConnections funktionieren würde und für JSON stehen verschiedene Möglichkeiten zur Verfügung. In Java standardisierte APIs sind JSON-P un JSON-B. Einführung https://www.baeldung.com/java-json-binding-api
 

Creepaz

Bekanntes Mitglied
Ich habe einen FileOutputStream, der eine Datei downloadet. Funktioniert auch. Nun hätte ich gerne einen MessageDialog, sobald die Datei gedownloadet wurde. Ist sowas möglich, einen Stream abzufragen?
 

Creepaz

Bekanntes Mitglied
Sorry, falsch formuliert ^^ Ich habe natürlich auch den InputStream und alles dazu, nur meine Probleme:

- Statt einer 3 MB Datei downloadet er nur 23KB (wtf?)
- Wenn der Download abgeschlossen ist, hätte ich gerne eine Rückmeldung. Ist das iwie möglich?

Hier mal mein Code:

Java:
try {
               URL website = new URL(versionInformations[2]);
               ReadableByteChannel rbc;
               rbc = Channels.newChannel(website.openStream());
               FileOutputStream fos = new FileOutputStream("Farmers Life.jar");
               fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
               fos.close();
               rbc.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Ich würde nicht mit Channels arbeiten, einfach die Bytes von einem Stream in den anderen kopieren und fertig. Am Ende der Methode weißt Du ja, dass sie fertig ist :)
 

Creepaz

Bekanntes Mitglied
Ich würde nicht mit Channels arbeiten, einfach die Bytes von einem Stream in den anderen kopieren und fertig. Am Ende der Methode weißt Du ja, dass sie fertig ist :)

Hab das auch nur mehr oder weniger ausm Internet zusammengebaut, weil ich solche Funktionen noch nie verwendet habe. Lustigerweiße probiere ich seit ca 1h sämtliche Methoden aus, funktionieren tun sie alle... aber bringen tuts nix weil immer bloß 23KB statt ~3MB gedownloadet werden.
 

mihe7

Top Contributor
Mit Java 8? Sollte etwas in der Art sein:

Java:
URL website = new URL(versionInformations[2]);
try(InputStream is = website.openStream();
        FileOutputStream fos = new FileOutputStream("Somefile")) {
    byte[] buf = new byte[1024];
    int n;
    while ((n = is.read(buf)) != -1) {
        fos.write(buf, 0, n);
    }
}
 

Creepaz

Bekanntes Mitglied
Mit Java 8? Sollte etwas in der Art sein:

Java:
URL website = new URL(versionInformations[2]);
try(InputStream is = website.openStream();
        FileOutputStream fos = new FileOutputStream("Somefile")) {
    byte[] buf = new byte[1024];
    int n;
    while ((n = is.read(buf)) != -1) {
        fos.write(buf, 0, n);
    }
}

Ja, hatte auch schon sowas in die Richtung. Immer nur 23kB, bei deinem Code auch ._. Das bringt mich langsam zum verweifeln. Hab gerade extra nochmal geschaut, die hochgeladene Datei bei dem Link hat 3,1MB.

Edit: Muss ich evtl. irgendwie den MIME-Type angeben? Falls ja, wie würde sowas aussehen? ._.
 
Zuletzt bearbeitet:

Creepaz

Bekanntes Mitglied
EDIT: Es funktioniert nun mit deiner Version @mihe7. Das Problem ist wohl der Download-Link, da es wohl kein Direct-Link ist. Sobald ich auf den Link klicke wird er zwar im Browser direkt gedownloadet, allerdings nicht im Projekt, da muss ich vom Download-Button den Link kopieren... Ich hab zwar keine Ahnung wieso, aber das hat mich gerade 5 Jahre meines Lebens gekostet ^^

Größten Dank dir.
 

Creepaz

Bekanntes Mitglied
Mit Java 8? Sollte etwas in der Art sein:

Java:
URL website = new URL(versionInformations[2]);
try(InputStream is = website.openStream();
        FileOutputStream fos = new FileOutputStream("Somefile")) {
    byte[] buf = new byte[1024];
    int n;
    while ((n = is.read(buf)) != -1) {
        fos.write(buf, 0, n);
    }
}

Kann ich da irgendwie einen ProgressMonitorInputStream mit einbauen? Würde gerne wissen wie weit der Download schon ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
G Compiler-Fehler Fehler in Zeile 1 beheben, wie? Java Basics - Anfänger-Themen 9
M Java heap space Fehlermeldung beheben Java Basics - Anfänger-Themen 3
Chocola Datums-String mit "ungültigem Anhängsel" wird ohne Fehler geparsed. Kann man dies irgendwie beheben? Java Basics - Anfänger-Themen 3
S Fehlersuche bzw beheben Java Basics - Anfänger-Themen 9
K Erste Schritte Schönheits fehler beheben Java Basics - Anfänger-Themen 8
B Fehlermedlung, beheben Java Basics - Anfänger-Themen 5
X Ich weiß, wo der Fehler ist, kann ihn aber nicht beheben Java Basics - Anfänger-Themen 2
M NullPointerException - Fehler beheben, nur, wo liegt er? Java Basics - Anfänger-Themen 13
B Problem mit dem lauyout.wie kann ich es beheben? Java Basics - Anfänger-Themen 6
S Fehler durch Exception beheben und nochmal versuchen Java Basics - Anfänger-Themen 4
T Wie kann ich diesen Fehler beheben? Java Basics - Anfänger-Themen 7
H eMail-Adressen-Validierung Java Basics - Anfänger-Themen 5
F RegEx für Email Java Basics - Anfänger-Themen 2
B Email versenden, muss Methode static sein? Java Basics - Anfänger-Themen 7
B Email Client in der eigenen Software einbauen Java Basics - Anfänger-Themen 3
B java.mail - Email antworten und Content ausgeben Java Basics - Anfänger-Themen 4
G Email senden MailDev Java Basics - Anfänger-Themen 13
B Email versand - aber akzeptiert auch falscher Username und Passwort??? Java Basics - Anfänger-Themen 1
K Einzelne Email verschieben nicht möglich Java Basics - Anfänger-Themen 3
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
N Email mit Anhang - File not Found Java Basics - Anfänger-Themen 1
G Email-sending Button Java Basics - Anfänger-Themen 9
F ClassNotFound - Email Java Basics - Anfänger-Themen 0
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
W Mozilla Thunderbird email an alle Kontakte Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
K Email versenden mit Java Java Basics - Anfänger-Themen 4
G Email ueber Socks versenden Java Basics - Anfänger-Themen 6
achillesat Email versenden Java Basics - Anfänger-Themen 5
B Email versenden Java Basics - Anfänger-Themen 28
S Mit Java Email versenden Java Basics - Anfänger-Themen 7
A Java Mail 1.4.4 - Email versenden (HOTMAIL SMTP auth) Java Basics - Anfänger-Themen 9
B Problem beim Email versenden mit Javamail Java Basics - Anfänger-Themen 5
S Email verschicken Java Basics - Anfänger-Themen 2
M Java Email Versand mit freenet Java Basics - Anfänger-Themen 7
P Email versenden für einsteiger Java Basics - Anfänger-Themen 6
S Email und SMTP Java Basics - Anfänger-Themen 3
G Email Adresse in JTextField ueberpruefen Java Basics - Anfänger-Themen 5
G EMail-Versand funktioniert nicht Java Basics - Anfänger-Themen 2
G eMail versenden Java Basics - Anfänger-Themen 31
G eMail verschicken in einem Java-Programm Java Basics - Anfänger-Themen 8
G Email Adresse auf Richtigkeit prüfen Java Basics - Anfänger-Themen 11
J Email-Anbindung geht net Java Basics - Anfänger-Themen 10
M Email versenden, ohne eigenen pop3-server? Java Basics - Anfänger-Themen 7
C Aus Java eine Email wo der Body den Inhalt aus einer .... Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben