Laden...
Avatar #avatar-4078.jpg
emuuu myCSharp.de - Member
Ingenieurinformatiker Dabei seit 04.02.2011 286 Beiträge
Benutzerbeschreibung

Forenbeiträge von emuuu Ingesamt 286 Beiträge

10.02.2017 - 23:11 Uhr

Herje und wenn ich in einem Jahr ne Frage zu asp.net poste kommt wieder wer daher und erklärt mir wie veraltet das ist.. ich kann absolut nachvollziehen Wieso Thyssen Millionen an Microsoft gezahlt hat um den Win Xp-Support aufrecht zu erhalten...

Noch mal zu meiner Frage...?

10.02.2017 - 18:57 Uhr

Stumpf gesagt: Weil ich WCF kann und und REST nicht und aktuell nicht die Zeit finde mich in das eine einzuarbeiten und das andere entsprechend umzustellen.

Zu den Bezeichnern: Die habe bei mir alle firmen-/projektgebunde Präfixe.

Zur eigentlichen Frage aber:
Was wäre die formal beste Umsetzung?
Eine statische Klasse mit statischen Methoden in Core wäre wahrscheinlich die simpelste Lösung, erscheint mir aber wie gesagt nicht als der beste Weg.

10.02.2017 - 17:21 Uhr

Nabend zusammen,

ich habe mal eine grundsätzliche Frage zu WCF-Services, dazu folgendes Szenario:
Ich habe eine Projektmappe in der drei Projekte sind:

  • Core
  • InnerService
  • OuterService

In Core liegen meine DataContracts für beide Service und diverse Klassen/Methoden (Verschlüsselungslogik usw.)

Ich habe nun den Fall, dass einige OperationContracts in beiden Services gleich heißen und auch ziemlich genau das gleiche machen.
Das würde ich nun gerne (in Core) zusammenlegen, also dass für Login() z.B. beides Services den gleichen Code verwenden.

Exemplarisch ist das bisher so aufgebaut:

Core


namespace Core
{
     [DataContract]
     public class LoginToken
     {
       //members
     }
}

Inner:


using Core;
namespace Inner
{
        [ServiceContract]
        public interface IInnerService
        {
            [OperationContract]
            bool Login(LoginToken token);
        }

        public class InnerService: IInnerService
        {
            public bool Login(LoginToken token)
            {
                 //do stuff
            }
         }
}

Outer:


using Core;
namespace Outer
{
        [ServiceContract]
        public interface IOuterService
        {
            [OperationContract]
            bool Login(LoginToken token);
        }

        public class OuterService: IOuterService
        {
            public bool Login(LoginToken token)
            {
                 //do the same stuff
            }
         }
}

Meine erste Idee wäre den Login-Code in Core zu verschieben und von dort in den Services aufzurufen.
Mein Bauch sagt mir aber, dass das nicht die eleganteste Lösung wäre. Und was wäre formal der richtige Ansatz?

Beste Grüße und einen schönen Start ins Wochenende
Timm

10.02.2017 - 11:44 Uhr

Unabhängig davon, dass Dateien in eine access-"Datenbank" zu schreiben ne schlechte Idee ist (speichere lieber den Speicherort):
Wie zuvor gesagt, gibts in Acces kein PDF-Feld, du kannst Dateien aber grundsätzlich ins binäre zerlegen und dieses dann in Access einfügen, wie in deinem anderen Thread:
Bild aus ImageBox in Access Datenbank abspeichern


byte[] bytes = System.IO.File.ReadAllBytes("myfile.pdf");

10.02.2017 - 09:02 Uhr

Geht es wirklich darum wenn die Zeile mit einem # anfängt oder einfach nur grundsätzlich nach jedem # trennen?

Das wäre denkbar einfach:


string[] split = File.ReadAllText(filePath).Replace("\r\n", "").Split('#');

Das .Replace() ist optional nur, wenn du du die ganze Datei ausließt hast du im Array noch die ganzen Zeilenumbrüche.

Wenn es wirklich darauf ankommt nur eine mit # beginnende Zeile auszulesen:


foreacht(string line in File.ReadLines(filePath)
{
    //logik die erkennt ob zeile mit einem # beginnt
}

In diesem Fall würde ich aber mit List<string> anstatt einem Array arbeiten, da du vorher nicht weißt wie groß du das Array initialisieren musst (könnte man auch vorher eine Logik für schreiben ist aber imho umständlich/überflüssig).

07.02.2017 - 20:35 Uhr

Wie schon die Vorredner gesagt haben:
Xamarin ist noch in der Entwicklung, da kann immer viel passieren.
Vor knapp einem halben Jahr hat ein Bug inner neuen Version z.B. mal meine iOS-App abgeschossen, da es es ein Problem mit SSL-Zertifikaten und WCF gab. Generell WCF ist ein bisschen hakelig, wenn man es denn nutzen möchte. Da musst du mit einer SLsvc-generierten (Silverlight) Proxy arbeiten und hast dementsprechende Einschränkungen. Und nach meinem letzten Stand ist in diesem Fall bei SSL nur Transport- und keine Message-Security möglich.

Ansonsten bin ich eigentlich ziemlich zufrieden damit (benutze Xamarin.iOS und .Android), allerdings arbeite ich da mit Xamarin Studio am Mac und nicht Visual Studio da die Umsetzung des Builthosts mich nervt.

07.02.2017 - 20:16 Uhr

Dachte immer, das ist Forum wo man Fragen stellen soll usw. Und kein Auftragscodefertiger ^^

How-to
Wider besseren Wissens:
for


        private string DayTrigger(DateTime start, DateTime end, TimeSpan step)
        {
            StringBuilder sb = new StringBuilder();
            for (DateTime i = start; i<=end; i =i.Add(step))
            {
                sb.Append("N'" + i.ToString("yyyy-MM-ddTHH:mm:ss.fff") + "'");
            }
            return sb.ToString();
        }

while


        private string DayTrigger(DateTime start, DateTime end, TimeSpan step)
        {
            StringBuilder sb = new StringBuilder();
            while(start<=end)
            {
                sb.Append("N'" + start.ToString("yyyy-MM-ddTHH:mm:ss.fff") + "'");
                start = start.Add(step);
            }
            return sb.ToString();
        }

foreach


        public IEnumerable<DateTime> EachDay(DateTime start, DateTime end, TimeSpan step)
        {
            for (var day = start.Date; day.Date <= end.Date; day = day.Add(step))
                yield return day;
        }

        private string DayTrigger(DateTime start, DateTime end, TimeSpan step)
        {
            StringBuilder sb = new StringBuilder();
            foreach (DateTime day in EachDay(start, end, step))
            {
                sb.Append("N'" + day.ToString("yyyy-MM-ddTHH:mm:ss.fff") + "'");
            }
            return sb.ToString();
        }

05.02.2017 - 15:03 Uhr

Guten Tag zusammen,

ich taste mich momentan ein bisschen an WPF heran und versuche dort eine eigene Menüleiste zu bauen.

Mein Problem ist: Ich habe bisher auf der xaml-Seite von WPF so gut wie nichts gemacht und weiß nicht mal welche Controls eine gute Grundlage für mein Ziel wären, geschweige denn wie ich das ganze nur mit xaml umsetzen kann. Also mir würden schon ein paar Schlagworte reichen mit denen ich weitersuchen kann.

Im Anhang ist mein "Vorbild" das ich gerne selber entwickeln möchte. Eine Menüleiste am Fensterrand die aus verschiedenen Gruppen besteht, wobei eine Gruppe immer sichtbar ist und die restlichen kollabiert sind.

In WinForms würde ich hier sofort zur ListView greifen, nur was wäre in WPF eine gute Grundlage? Und vor allem lässt sich die Collapse-Funktionalität, wie beschrieben, ausschließlich mit WPF umsetzen?

05.02.2017 - 14:39 Uhr

Mit der schwarzen Magie ging es mir vor allem darum, dass bisher nur ich vllt 10-15 Downloads und davon vllt 5 Installationen habe laufen lassen.

Das war ja meine Hauptsorge. Da die App nur einem recht geringen Personenkreis zur Verfügung gestellt wird (Signierung aus Richtliniengründen trotzdem nötig), hatte ich befürchtet, dass ich niemals genug Reputation auf dem Zertifikat kriege.

04.02.2017 - 23:47 Uhr

Klingt stumpf aber: Firewall?

"Verbindung werde vom Zielcomputer abgelehnt" ist eine klassische "Firewall-ist-nicht-einverstanden"-Fehlermeldung.

Ich würde mal überprüfen, ob die entsprechenden Freigaben vorhanden sind. Evtl ist auch besonders übereifriger Virenschutz am Werk.

04.02.2017 - 23:38 Uhr

Zu zwei:
Die Verschlüsselung der connectionStrings ist in deinem Fall meines Wissens asymmetrisch und die Speicherung des privaten Schlüssels findet irgendwo in den Tiefen deines Rechners statt. (Das macht vor allem Sinn wenn du einen Webservice hostest und deine ConnectionStrings in der web.config schützen willst.)

Das Problem, das du hast, ist dass der private Schlüssel wie gesagt LOKAL gespeichert wird und somit beim Client nicht bekannt ist. Daher das Entschlüsselungsproblem.

Ich vermute mal, dass du die config mit "aspnet_regiis " verschlüsselst, du könntest deine App so schreiben, dass sie beim ersten Programmstart (oder der Installation) aspnet_regiis aufruft und die beim Client erstellte config verschlüsselt.

Dann wären die String zwar in deinem Setup nicht geschützt und könnten da rausgezogen werden, aber zumindest liegen sie im Appordner nicht mehr unverschlüsselt.

04.02.2017 - 23:27 Uhr

Kleines Update:
Irgendwelche schwarze Magie hat nun gewirkt und weder Browser noch Smartscreen-Filter beanstanden die setup.exe (Die Programm.exe auch nicht mehr).

Ich habe eigentlich nichts gemacht außer meine Zeit mit anderen Dingen zu verbringen und im Google-Webmastertool, wo meine Website als "möglicherweise Malware enthaltent" angezeigt wurde, einen Überprüfungsauftrag zu schicken.

Wieso das auch IE, Edge, Firefox und den SmartscreenFilter beeinflussen kann -> wer weiß.

Habe die Dateien zu Sicherheit von einem völlig unbefangenen Rechner heruntergeladen auf dem keines der Zertifikate oder ähnliches installiert ist. Insofern scheint sich das Problem sich von selbst verflüchtigt zu haben und ein Standardcodesigning-Zertifikat ist wohl ausreichend.

02.02.2017 - 22:25 Uhr

Da bin ich auch schon gelandet, aber ich kann mir irgendwie nicht vorstellen, dass das allein die Lösung sein kann.

Dort steht, dass man sowohl Standard- als auch EV-Zertifikate verwenden kann (sonst wäre der Sinn von Standard-CodeSigning-Zertifikaten = null). und damit eine "Reputation" aufbauen muss.

Das ist natürlich klasse, dass ich mehrere hundert Downloads brauche bevor die Dateien "ok" sind.

Das kann doch nicht die Lösung sein.

02.02.2017 - 17:32 Uhr

Da bin ich schon dran und warte gerade darauf, dass der Google-Crawler der Seite einen Besuch abstattet.

Das dürfte aber das Problem nicht lösen. Habe nun IE, Firefox und Chrome getestet, allesamt und der leidige SmartScreen-Filter geben eine Warnung aus. Daher meine Vermutung, dass ich generell etwas falsch mache, wobei ich nicht wüsste was (aber das weiß man wohl nie).

02.02.2017 - 14:39 Uhr

Guten Tag zusammen,

ich habe ein kleines Problem, an dem ich mittlerweile verzweifle:

-Ich habe eine Anwendung die ich via ClickOnce über eine Website verteile.
-Ich habe ein gültiges CodeSigning-Zertifikat (von Comodo)

Mein Problem ist nun, dass die von ClickOnce generierte Setup.exe sowohl beim Download in Chrome (könnte schädlich sein blabla) als auch im Smartscreen-Filter hängen bleibt.

D.h. das Problem liegt nicht in der Signierung meines Programmes (wenn ich die setup.exe trotz aller Warnung starte läuft es sauber durch und zeigt im Installer auch korrekt den Herausgeber), sondern nur in der setup.exe.

Diese scheint aber auch korrekt signiert zu werden, da wenn ich mir die Signierung der Datei anschaue (rechtsklick -> Eigenschaften -> digitale Signierung) wird das Zertifikat dort auch korrekt angezeigt.

In den Projekteinstellungen ist ClickOnce-Manifestsignierung eingetragen und das Zertifikat auch ausgewählt.

Zum Pre-Publish verwende ich folgendes:

  <Target Name="BeforePublish">
    <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe&quot; sign /f &quot;$(ProjectDir)zertifikat.p12&quot; /p tollespasswort 
/v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
  </Target>

Ich habe auch schon versucht die setup.exe im Nachhinein mit dem Signtool von kSign zu signieren -> gleiches Problem.

Das einzige was "etwas" bringt ist die Website (welche SSL-gesichert ist) über die die Verteilung läuft via Internetoptionen als vertrauenswürdig zu markieren. Was aber nur den SmartScreen-Filter und nicht Chrome befriedet (zumal es nur ein Workaround und keine Lösung ist).

Irgendwelche Ideen? Oder mache ich was grundsätzliches falsch?

Beste Grüße
Timm

Update:
Aus irgendwelchen Gründen ist es jetzt noch schlimmer. Selbst die Assembly ist jetzt noch signiert wird aber von SmartScreen als potenziell gefährlich eingestuft.

31.01.2017 - 13:12 Uhr

Ist wenn du deinen eigenen Code anschaust relativ einfach abzuleiten:
Du erstellst auf Grundlage deines Bildes ein byte[] und schreibst das in die DB.
Also kriegst du via Select auch wieder ein byte[] aus der DB zurück, musst deinem Programm also nur sagen, dass es sich bei dem was zurückkommt um ein byte[] handelt.


OleDbCommand cmd = new OleDbCommand("SELECT bild FROM videos WHERE vid = 5", con);
DataTable myTable = new DataTable();
cmd.Connection.Open();
myTable .Load(cmd.ExecuteReader());
cmd.Connection.Close();

byte[] imgData = (byte[])myTable.Rows[0][0];

Image image = Image.FromStream(new MemoryStream(imgData));
pictureBox1.Image = image;

Ist eine rudimentäre Lösung die man noch eleganter gestalten kann und ich würde auf jeden Fall try'n'catches einbauen.

24.01.2017 - 12:08 Uhr

Hier im Forum gibts ein sehr gutes Tutorial zum Thema TCP mit einem Client-Server-Chat als Beispiel:[

[Tutorial] Client-/Server-Komponente über TCP-Sockets](http://www.mycsharp.de/wbb2/thread.php?threadid=19670)

Ist sehr basic, aber wenn man noch nie etwas mit TCP gemacht hat ein sehr guter Einstieg.

24.01.2017 - 11:09 Uhr

OleDbCommand cmd = new OleDbCommand("UPDATE videos set bild =@bytBLOBData WHERE vid = 5", dbConnection);

                OleDbParameter prmBlob = new OleDbParameter("@bytBLOBData", OleDbType.LongVarBinary);
                prmBlob.Value = bytBLOBData;
                cmd.Parameters.Add(prmBlob);

05.02.2016 - 17:39 Uhr

Guten Abend zusammen,

ich bastle momentan an einem WCF-Service welcher nur einem begrenzten & bekannten Kreis zur Verfügung stehen soll. Bisher ist das Ganze via SSL abgesichert, verfügt also über Transportsicherheit.

Plattformbedingt kann ich die mir bekannten Mechanismen zum Schutz der Message nicht verwenden (ob ich nur zu dumm bin eine funktionierende Lösung zu finden sei dahingestellt).

Ich möchte daher einen eigenen Mechanismus entwickeln der gleichzeitig eine Authentifizierung sowie eine Verschlüsselung der Nachricht darstellen soll:
Dazu verwende ich Private/public-Keypaare. Jeder Nutzer generiert bei der ersten Verwendung ein Keypaar, speichert den privaten und sendet den publiken an mein System (evtl. über ein Drittmedium, der Umfang des Systems erlaubt hier eine weniger automatisierte Lösung).

Bei der ersten Anmeldung im System wird ein zweites KeyPaar erstellt. Der publicKey dieses Paares wird dem Nutzer mitgeteilt (via Service) der diesen lokal speichert.

Nun wird ein Datenbankeintrag erzeugt der die NutzerID, den publicKey des Nutzers sowie den privateKey des zweitenKeypaares erhält.

Wenn der Nutzer nun Methode X des Services aufrufen will muss er seine NutzerID mitteilen. Der Service sucht den publicKey des Nutzers aus der Datenbank und verschlüsselt die Rückgabe der Methode mit diesem.

Möchte der Nutzer Daten an den Service senden funktioniert das gleiche andersherum indem der Nutzer den erhaltenen publicKey zum verschlüsseln verwendet und der Service den entsprechenden Decryption-Key verwendet.

Unabhängig von der eigentlichen Implementierung würde mich interessieren wo die Schwachpunkte in dem Konzept sind.

Beste Grüße
Timm

31.01.2016 - 01:14 Uhr

Soo nach einigem Gelese und probieren hab ich nun ein Konzept und eine teilweise Implementierung stehen.

Bevor ich nun weitermache wollte ich euch mal fragen, ob das in sich Sinn macht und auch einigermaßen sicher ist:

Ich habe einen WCF-Service der auf einem IIS gehostet ist. Die Verbindung zum Service läuft über https.

Der Server auf dem der Dienst ist steht in der DMZ wo er sonst nichts kennt/kann und läuft auf Win Server 2012 R2. Neben der Sicherheitssoftware hat er keine weitere Software installiert.

Im internen LAN steht ein MS SQL-Server der zwei Datenbanken enthält. Datenbank A enthält Stammdaten wie Kunden, Projekte, Standorte etc. Datenbank B enthält die Daten die für die Funktion des Services sind.

Die mobile App fragt über den Service zu Beginn direkt eine Liste mit Projekten, Standorten, etc. ab. Als erstes prüft der Service ob die gemeldete DeviceID in Datebank B vorhanden ist. Ist dem so werden die für den, der DeviceID zugeordneten, Mitarbeiter freigeschalteten Projekte aus Datenbank A gelesen und über den Service der App mitgeteilt.

Darauf hin kann der Mitarbeiter in der App Eintragungen vornehmen die zu Update- und Insert-Aktionen in Datenbank B führen.

Der User der für den Zugang zum MS Sql-Server benutzt wird hat in Datenbank A nur Lese- und in Datenbank B nur Schreibrechte (insert /update). (Hier wäre für mich eine Frage ob es praktischer ist einen SQL-User anzulegen oder einen speziell dafür eingerichteten User aus der Domäne via Win-Authentication zu verwenden, macht das einen effektiven Unterschied? - Ich würde intuitiv den Sql-User bevorzugen, weil meiner Meinung wenn ein Angreifer bis hierhin kommen sollte der Weg zum restlichen LAN größer ist wenn nur ein SQL-User kompromittiert ist als ein User der Domäne)

Ich würde mich über ein Feedback freuen. Ist wie gesagt meine erste Anwendung die mit direkter Internetanbindung umgehen muss.
Das heißt ich würde mich sehr über eine Bewertung freuen, welches Maß an Sicherheit ich so erreichen würde und welche Schwachstellen ich noch habe.

Beste Grüße
Timm

25.01.2016 - 19:47 Uhr

Besten Dank 😃
mit den Hinweisen werde ich jetzt erstmal wieder google bemühen und um mich da besser einzulesen.

25.01.2016 - 12:00 Uhr

Also grundsätzlich sage ich mal habe ich bisher keinerlei Sicherheit.

Alle mobilen Endgeräte sind bei uns hinterlegt mit Seriennummer, Identifier, etc. Das heißt bei der bisherigen Lösung via TCP-Socket schmeißt der Server sofort alles raus was sich nicht mit bekanntem Identifier meldet.

Den Ansatz über eine Identifikation über eine Geräte-ID soll auch bestehen bleiben.

Meine Frage wäre nun welche Schwachstellen ich habe, wenn ich in die vom Client aufgerufenen Funktionen imme eine Validierung einbaue, dass überhaupt nur etwas passiert wenn eine bekannte Geräte-ID gemeldet wird.

Also ich bin was das angeht auch für grundlegende Infos dankbar, weil ich bin eigentlich Maschinenbauingenieur und meine gesamte Programmiererfahrung bezieht sich auf praktische Anwendungen. Ich bin bisher noch nicht in die Verlegenheit gekommen Übertragungen via Internet zu implementieren und habe daher was Sicherheitssysteme angeht keine wirklichen Kenntnisse.

25.01.2016 - 11:32 Uhr

Meh.. Montage..

Aus irgendwelchen sich mir nicht ergebenen Gründen sind die Portfreigaben in der zweiten Firewall nicht mehr eingetragen gewesen.

Danke für die Hilfe, auch wenns ein dummer Fehler war.

Aber darüber hinaus mal die Frage:
Wenn ich das so wie es jetzt implementiere, wie sicher/unsicher wäre das ganze?

25.01.2016 - 11:20 Uhr

Ja das mit passiert nichts war meiner Ungeduldt geschuldet:

Die Exception tritt erst nach ca 5sec auf bis dahin hatte ich die Ausführungs meist schon beendet.

Er wirft eine EndpointNotFoundException mit> Fehlermeldung:

"Es war kein an
>
lauschender Endpunkt vorhanden, der die Nachricht annehmen konnte. Dies wird häufig durch eine fehlerhafte Adresse oder SOAP-Aktion verursacht. Weitere Details finden Sie unter "InnerException", sofern vorhanden."

InnerExeption: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat 94.114.xxx.xxx:9001

Einen IIS habe ich nicht, der gesamte Aufbau besteht nur aus dem Code oben (plus natürlich dem SharedProject mit dem Interface).

Dazu muss ich sagen, dass ich das ganze mit net.tcp schon am laufen hatte (und dann gemerkt habe, dass Xamarin.iOS da nicht mitspielt).

Das war aber aber mehr etwas zusammenkopiertes, dass ich mehr kopiert als verstanden habe.

25.01.2016 - 10:40 Uhr

Guten Morgen zusammen,

zunächst möchte ich mich entschuldigen, falls die Lösung doch direkt hier im Forum zu finden ist, aber ich hab mich jetzt gefühlt seit einer Ewigkeit durch google und das Forum geforstet und vllt steh ich einfach nur schwer auf dem Schlauch aber ich finde bisher einfach keine Lösung.

Zu meinem Problem:
Ich habe ein funktionierendes System in dem ein Server und mehrere Mobilgeräte Daten via TCP-Socket übers Internet austauschen.
Dies möchte ich gerne auf WCF umstellen bzw erstmal beide Schnittstellen gleichzeitig anbieten (größere Flexibilität usw.)

Da ich bisher in WCF gar keine Erfahrung habe wollte ich mich step-by-step herantasten.Das grundsätzliche Prinzip, Contracts, etc habe ich auch soweit verstanden und eine kleine Testapplikation erstellt. Diese funktioniert lokal ohne Probleme nur leider nicht im Internet.

Generell zu den Vorraussetzungen: Es muss HTTP sein und ich kann das Zyan Framework leider nicht benutzen, da die internen Handyapps mit Xamarin.iOS geschrieben werden und das unterstützt Zyan und net.tcp leider nicht.

Ich würde die Bindings und Konfigurationen gerne hardcoded (also ohne App.config) implementieren:

Server


    class Program
    {
        static void Main( string[ ] args )
        {
            ServiceHost serviceHost = new ServiceHost(new Service());
            serviceHost.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "http://subdomain.domain.com:9001/Service");
            serviceHost.Open();

            Console.WriteLine("Server running...");
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

            serviceHost.Close();
        }
    }

Client


    class Program
    {
        static void Main( string[ ] args )
        {
            //ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(new BasicHttpBinding(), "http://subdomain.domain.com:9001/Service");
            ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(new BasicHttpBinding(), "http://localhost:9001/Service");
            IService service = channelFactory.CreateChannel();
            Console.WriteLine("Client ready...");

            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Client: got response " + service.Operation("Hello " + i));
                Thread.Sleep(1000);
            }
        }
    }

Wenn ich den den Client über localhast verbinden lasse klappt alles ohne Probleme. Wenn ich die Domain verwende passiert nichts.
Ich scheine also ein Problem damit zu haben, dass der Client nicht übers Internet an den Server kommt (die entsprechenden Portfreigaben in Router, Firewall, etc. existieren natürlich).

Vielen Dank schonmal und beste Grüße
Timm

04.08.2015 - 10:50 Uhr

Vielen Dank schonmal für die seeehr ausführliche Antwort!

Das werde ich jetzt erstmal nachvollziehen müssen, aber auf jeden Fall schonmal sehr erleuchtend 😃

Eine weitere Frage hätte ich dazu noch:
Die Decrypt- und Encrypt-Methoden, die ich verwendet habe, in wie weit kann man die als "sicher" bezeichnen.

Oder generell: wenn ich Daten über TCP verschicken möchte, welche Art der Verschlüsselung wäre da am effektivsten, wenn der Anspruch ist, dass nicht jeder der den Datenstrom mitkriegt damit sofort (oder mit geringem Ressourcenaufwand) was anfangen kann.

18.07.2015 - 23:12 Uhr

Vielen Danks schonmal 😃

gesetzt den Fall, dass ich nur eine Kommunikation zwischen einzelnen Clients und dem Server möchte. Könnten dann beide den gleichen Privatekey gespeichert haben?
In dem Fall den ich mir gerade vorstelle gibt der Client dem Server Aufgaben auf (bsp weil der Client zu wenig Rechenkapazität hat oder nur der Server Zugriff auf Daten hat) und erhält dann die Ergebnisse vom Server zurück.

Aus dem Grund ist für mich nicht nur die Verschlüsselung wichtig sondern auch die eigentliche Art der Datenübertragung.

18.07.2015 - 21:52 Uhr

Guten Abend zusammen 🙂

zunächst einmal möchte ich als Hintergrund etwas zu mir sagen:
Ich bin eigentlich Ingenieur aus dem Bereich Berechnung. Hierfür schreibe ich oft kleinere Scripts (in den unterschiedlichsten Sprachen), die in der Regel einfach nur funktionieren müssen und ansonsten keine besonderen Anforderungen haben.

Das heißt mein Programmierstil ist gezeichnet von quick'n'dirty. Sicherheit (gar nicht) und Effizienz (höchstens auf eine einzelne Methode bezogen) haben für mich hierbei normalerweise wenig Relevanz.

Da ich mich aber nun an ein etwas größeres Projekt wagen möchte, muss ich mich vorher also zwangsweise etwas professionalisieren. Daher würde ich euch gerne etwas Code vorstellen und hoffe auf Feedback von euch.

In meinem Projekt wird Datenübertragung, die wenn möglich verschlüsselt werden soll, einen wichtigen Part einnehmen.
Zu Beginn habe ich mir daher ein TCP-System mit Client und Listener gebastelt (kann ich bei Bedarf dazu poste, sollte aber nicht nötig sein denke ich). Dabei schickt der Client Nachrichten als strings an den Listener welcher diese direkt an den Client zurückschickt (in Zukunft soll dies natürlich ein weiterer Client sein).

Auf diesem Wege würde ich nun gerne Dateien übertragen. Dazu habe ich mir eine Klasse "DataTransferEngine" gebaut.
Diese hat bietet dem Programm im Prinzip zwei Funktionien:

  1. Es erstellt auf Grundlage eines Dateipfades einen string der einige Informationen zu der Datei/dem Absender und die Datei selber in einem base64string enthält
  2. Es erstellt eine Klasse ReceivedFile" welche den string aus 1 wieder zurückbauen kann, die entsprechende Datei auf einen Dateipfad kopiert und noch einige Informationen zur Übertragung enthält
    Der string wird jeweils noch mittels TripleDES zerhackt bzw. wieder zusammengesetzt.

Das ganze funktioniert soweit auch ganz gut (Bilder, Textdaten, etc. sind kein Problem) selbst etwas größere Musikdateien werden noch problemlos übertragen.

Meine Fragen an euch wären nun, ob ihr hier grobe Patzer im Programmierstil seht, ob meine Art der Verschlüsselung überhaupt Sinn macht (also nicht mal mittelaufwändigen Methoden standhält) und natürlich generell, ob diese Art der Datenübertragung überhaupt praktikabel ist (große Dateien funktionieren z.B. gar nicht) und was hier bessere Ansätze wären.

Darüber hinaus wäre ich natürlich über jeden Artikel, Post dankbar der hierzu Informationen bietet 🙂

P.s.: Über das Zyan Framework bin ich bereits gestolpert und das klingt schonmal sehr nah an meinen Vorstellungen, leider habe ich hier noch keine Zeit gehabt mich dort weiter einzulesen

P.p.s: Ich habe den Code jetzt nicht weiter kommentiert, da ich denke dass dieser relativ übersichtlich formatiert ist, sollte eine Kommentierung gewünscht sein kann ich diese natürlich gerne nachreichen


    class DataTransferEngine
    {
        private const char Separator = ((char)007);

        public class ReceivedFile
        {
            public readonly string Sender;
            public readonly DateTime SendTime;
            public readonly DateTime ReceiveTime;
            public readonly double SendDuration;
            public readonly FileInfo FileData;
            public readonly bool TransferSuccessful;

            public ReceivedFile(string input, string path)
            {
                try
                {
                    string[] receivedParts = Decrypt(input).Split(Separator);

                    Sender = receivedParts[0];
                    SendTime = DateTime.FromBinary(long.Parse(receivedParts[1]));
                    ReceiveTime = DateTime.Now;
                    SendDuration = Math.Round((ReceiveTime - SendTime).TotalMilliseconds, 2);

                    byte[] bytes = Convert.FromBase64String(receivedParts[3]);


                    File.WriteAllBytes(path + "\\" + receivedParts[2], bytes);
                    FileData = new FileInfo(path + "\\" + receivedParts[2]);

                    TransferSuccessful = true;
                }
                catch (Exception)
                {
                    TransferSuccessful = false;
                }
            }
        }

        public static string SendString(string file)
        {
            if (File.Exists(file))
            {
                FileInfo fileInfo = new FileInfo(file);

                FileStream stream = File.OpenRead(file);
                byte[] fileBytes = new byte[stream.Length];
                stream.Read(fileBytes, 0, fileBytes.Length);
                stream.Close();

                string base64FileData = Convert.ToBase64String(fileBytes);
                string sendstring = Encrypt(Environment.UserName + Separator + DateTime.Now.ToBinary().ToString() + Separator + fileInfo.Name + Separator + base64FileData);

                return sendstring;
            }
            else
                return null;
        }

        private static string Encrypt(string toEncrypt)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            AppSettingsReader settingsReader = new AppSettingsReader();
            string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            tdes.Clear();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        private static string Decrypt(string cipherString)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Convert.FromBase64String(cipherString);

            AppSettingsReader settingsReader = new AppSettingsReader();
            string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));


            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            tdes.Clear();
            return UTF8Encoding.UTF8.GetString(resultArray);
        }
    }

Vielen Dank schonmal und ich hoffe stoße euch nicht allzu übel auf 😉
Timm

08.05.2015 - 14:20 Uhr

Würde mich der Frage erweitert anschließen:
Ich suche noch eine Lösung die trackt wie lange ich an einem Projekt gearbeitet habe (hier also speziell in Visual Studio 2013). Also auch unterscheiden kann wie lange ich bsp. in TolleKlasse.cs und SuperMethoden.cs rumgegeistert habe.

Eine (kostenpflichtige) Lösung die ich gefunden habe erledigt im Prinzip genau das:
Visual Time Spent

Allerdings finde ich den Preis für so eine "Spielerei" recht happig und will daher lieber eine eigene Lösung entwickeln.

Frage nun:
Kann ich wie in dem vorangegangen Ansatz nicht nur das gerade aktive Fenster sondern auch die innerhalb von VS gerade aktive Datei auf irgendeine Weise eroieren.

Thanks in advance
emuuu :3

13.02.2012 - 09:34 Uhr

Wenn du frei entscheiden kannst, was der Roboter sendet, dann schliesse die Übertragung doch immer mit "\r\n" ab und nutze statt "port.ReadExisting" "port.ReadLine" - dann solltest du immer einen kompletten Datensatz bekommen.

Das hats gebracht.. hab zwar nicht \r\n sondern blueLineFeed() verwendet (kommt aus der Bibliothek des Roboters, sollte aber den gleichen Befehl darstellen^^)

mit ReadLine() kommen jetzt alle Werte wie gewünscht an..

besten dank 😃

13.02.2012 - 00:58 Uhr

Ich habe den Roboter mit Hyperterminal verbunden und dann einen sensor auf schwarzen den anderen auf weißen untergrund gestellt. Da kommt dann sehr konstant ne Differenz von -600 raus.

Mein Programm gibt dabei aber nur 60, 63, 3, etc.. also werte die definitiv falsch sind.. ich glaube dass der da unter anderem das Minus und in dem Fall die Einer-Stelle unterschlägt.. Warum weiß ich wie gesagt auch nicht genau ich nehme an weil ich den Eingang oder den Port nicht richtig verwalte.

12.02.2012 - 23:47 Uhr

Die Daten sind die Differenz der Messwerte aus zwei Liniensensoren.. Also Integer-Werte die maximal an die 900 herankommen.

Gesendet werden die über ein Bluetooth-Modem, was, mit dem PC verbunden, einen COM-Port ansteuert.

Theoretisch könnte ich die mit jedem Schleifendurchlauf schicken, also sehr schnell, um die Übertragung nicht zu belasten begrenze ich die Datenmenge auf einen Sende-Vorgang alle halbe Sekunde.

12.02.2012 - 18:51 Uhr

Wunderschönen Abend erstmal,

mein Problem ist folgendes:

Ich will einen Roboter online regeln.. will meinen, der Roboter sendet Daten eines Sensors an die serielle Schnittstelle, das Programm analysiert die und schickt se zurück.

Das klappt soweit auch sehr gut. Mein einziges Problem ist, dass mein Programm sehr oft die Minus-Zeichen "verschluckt" das ist in sofern unwünschenswert, weil die Regelung dadurch nutzlos wird.

Dinge wie invoke für die Threads etc. habe ich beachtet:


SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
port.RtsEnable = true;
port.Encoding = Encoding.ASCII;
port.Open();

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            daten = port.ReadExisting();
            this.Invoke(new EventHandler(DisplayText)); 
        }


private void DisplayText(object sender, EventArgs e)
        {
            if (daten != "")
            {
                Werte.Add(i, int.Parse(daten)); 
            }
        }

Ich bin mir relativ sicher, dass das Problem darin liegt wie die Daten am serial port "in Empfang genommen werden".. ich hab aber keine so großen erfahrungen damit und darum keine idee mehr..

Eine Option ist es, dass ich relativ frei entscheiden kann, was ich vom Roboter schicken lasse (nur die werte, \n, \r, etc.) das könnte die Lösung evtl vereinfachen..

Schonmal danke im vorraus für die schnelle Hilfe
emuuu

15.07.2011 - 11:16 Uhr

So einen wunderschönen guten morgen erstmal...

ich sitze seit einiger Zeit an einer Verwaltungs/Berechnungssoftware und konnte bisher alle Probleme durch Recherche lösen.. aber bei den beiden hier finde ich kaum was brauchbares.

Es geht um folgendes: Das Programm soll nachdem diverse Daten zu Objekten angegeben wurden Berechnungen durchführen und am Ende einen Plan erstellen in dem alle einem Projekt zugeordneten Objekte aufgeführt sind.
Der Plan selbst besteht aus 3 Teilen: Einführung, Inhaltsangabe und den Objekten

Das erste Problem liegt bei den Objekten: Die Formeln mit denen das Objekt berechnet werden sollen müssen dort angegeben sein (mit den Ergebnissen).

Ich hab nur leider keine Ahnung ob und wie ich z.B. den Formeleditor von Word ansprechen kann..(es werden viele Indizes genutzt Also einfach d/3+l oder so kann ich nicht schreiben)
Eine, in meinen Augen sehr unelegante, Lösung wäre Bilder der Formeln zu nutzen und einzufügen aber optimal ist das nicht.
Bisher habe ich alle Dokumente erstellt indem ich Textmarken in Word angesprochen und gefüllt habe.

Mein zweites Problem: jedes Projekt hat eine variable Anzahl an Objekten also kann ich keinen Musterplan erstellen und einfach alles Eintragen sondern muss die Objektteile einzeln schreiben und dann am ende alles zu einem Dokument zusammenfügen.
Das wäre nun meine Frage: Wie kann ich mehrere Dokumente zu einem zusammenfügen (automatisch)? Copy&Paste ist leider keine gute Lösung, da die Formatierung sehr wichtig ist.

So ich hoffe mal das war detailiert genug und mir kann geholfen werden ^^

Gruß
emuu

09.03.2011 - 13:38 Uhr

also ich mag mich da direkt mal einklinken..
sitz seit ner weile an dem ähnlichen wenn nich sogar dem gleichen problem:

ich will bilderin ne access-db schreiben und wieder auslesen undhab mich dabei recht genau an die wege aus msdn gehalten.

in nem kleinen testprogramm (ne form, 2button und ne picturebox)
funktioniert das schreiben und lesen wunderbar mit folgendem code:

Schreiben:


                   OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb");

            OleDbCommand cmd = new OleDbCommand("UPDATE Objekte SET Test=@BildData WHERE Projekt=1", cn);
            String Filepath = "";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                Filepath = openFileDialog1.FileName;
            }

            FileStream myFileStream = new FileStream(Filepath, FileMode.Open, FileAccess.Read);
            Byte[] myByte = new Byte[myFileStream.Length];
            myFileStream.Read(myByte, 0, myByte.Length);
            myFileStream.Close();

            OleDbParameter prm = new OleDbParameter("@BildData", OleDbType.VarBinary, myByte.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, myByte);
            cmd.Parameters.Add(prm);

            cn.Open();
            cmd.ExecuteNonQuery();
            cn.Close();

Lesen:


            OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb");

            cn.Open();

            OleDbCommand cmd = new OleDbCommand("SELECT Test FROM Objekte WHERE Projekt=1", cn);
            OleDbDataReader myReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

            while (myReader.Read())
            {
                byte[] myByte = (byte[])myReader.GetValue(0);
                MemoryStream myStream = new MemoryStream(myByte, 0, myByte.Length);
                myStream.Write(myByte, 0, myByte.Length);
                pictureBox1.Image = Image.FromStream(myStream);
            }
            cn.Close();

Das klappt soweit wunderbar und ohne Probleme....

Schreibe ich nun den gleichen code in mein eigentliches programm. funktioniert es nicht mehr mit der gleichen Fehlermeldung wie bei Johhny B... (ArgumentException, Ungültiger Parameter..)

Was mir beim debuggen aufgfallen ist:
In der funktionierenden Version ist das ist des myByte so in der Dimension byte[280783].in der nicht funktionierenden nur byte[12].. ich hab absolut keine idee mehr woher das kommen kann...
beim schreiben sind se in beiden Versionen gleich groß für identische bilder..