Laden...

Forenbeiträge von hinrich Ingesamt 116 Beiträge

18.11.2008 - 20:27 Uhr

Hallo,

habe nun, nachdem die Suche hier wieder funktioniert, eine Lösung von michIG gefunden, die genau das tut, was ich brauche. Das Ding habe ich in eine statische Klasse verpackt, so dass ich diese im Ergebnis mit einer Befehlszeile verwenden kann (Namespace ggf. anpassen):


using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace CCRM.Tools.Misc
{
    /// <summary>
    /// Verschlüsselung
    /// </summary>
    /// <remarks>
    /// Source für die String-Verschlüsselung von michIG von myCSharp.de
    /// </remarks>
    static public class TripleDES
    {
        /// <summary>
        /// Diese Methode verschlüsselt den mitgegebenen String
        /// </summary>
        /// <param name="plainMessage">Zu verschlüsselnder String</param>
        /// <param name="password">Passwort mit dem der String verschlüsselt werden soll</param>
        /// <returns>Den verschlüsselten String</returns>
        public static String Encrypt(String plainMessage, String password)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.IV = new byte[8];
            PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, new byte[0]);
            des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, new byte[8]);
            MemoryStream ms = new MemoryStream(plainMessage.Length * 2);
            CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            byte[] plainBytes = Encoding.UTF8.GetBytes(plainMessage);
            encStream.Write(plainBytes, 0, plainBytes.Length);
            encStream.FlushFinalBlock();
            byte[] encryptedBytes = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(encryptedBytes, 0, (int)ms.Length);
            encStream.Close();
            return Convert.ToBase64String(encryptedBytes);
        }

        /// <summary>
        /// Diese Methode entschlüsslt den mitgegebenen String
        /// </summary>
        /// <param name="encryptedBase64">zu entschlüsselnder string</param>
        /// <param name="password">Passwort mit dem der String verschlüsselt wurde</param>
        /// <returns>Den entschlüsslten string</returns>
        public static String Decrypt(String encryptedBase64, String password)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.IV = new byte[8];
            PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, new byte[0]);
            des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, new byte[8]);
            byte[] encryptedBytes = Convert.FromBase64String(encryptedBase64);
            MemoryStream ms = new MemoryStream(encryptedBase64.Length);
            CryptoStream decStream = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            decStream.Write(encryptedBytes, 0, encryptedBytes.Length);
            decStream.FlushFinalBlock();
            byte[] plainBytes = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(plainBytes, 0, (int)ms.Length);
            decStream.Close();
            return Encoding.UTF8.GetString(plainBytes);
        }
    }
}

in der datenbank speichert man normalerweise nur den md5 hash. Somit kann weder Betreiber, noch ein potentieller Hacker das Passwort auslesen, wenn er sich die Daten anschaut. Zum abgleichen bildet man einfach von der User-Eingabe wieder den Hash und prüft diesen.

Nun ist es aber recht unkomfortabel und unsicher, wenn der Benutzer einer Anwendung das Datenbank-Kennwort kennen muss, um das Programm nutzen zu können. Jeder Benutzer hat sein eigenes Kennwort, um die Software bedienen zu können, aber die Software selbst sollte schon ohne äußere Hilfe mit dem Datenbank-Server kommunizieren können. Meiner Meinung nach jedenfalls.

Vielen Dank für die Anmerkungen.

Hinrich

18.11.2008 - 18:18 Uhr

Hallo,

da die Suche leider zu einem Fehler führt, möchte ich die Frage hier einmal stellen.

Ich suche eine einfache (= einzeilige) Lösung, einen einfachen String mit einem Kennwort hinreichend sicher zu verschlüsseln (und natürlich auch wieder zu entschlüsseln). Den Schlüssel möchte ich fix im Source einbauen.

Konkret geht es um die Verschlüsselung des Datenbankkennworts in der Registry, so dass nicht jeder Hans und Franz selbiges auslesen kann.

Any hints?

Hinrich

18.11.2008 - 18:12 Uhr

Hallo,

die Suche funktioniert (bei mir) leider nicht:

SQL-DATABASE ERROR Database error in WoltLab Burning Board (2.2.1): Invalid SQL: INSERT INTO bb1_searchs (searchhash,searchstring,searchuserid,postids,showposts,sortby,sortorder,searchtime,userid,ipaddress) VALUES ('528f40c1b447469d8b27152c0cdbac18','verschlüsseln','',',345,1582,3073,3075,3083,4840,5748,6700,6714,7178,7179,7289,8578,10649,12332,13851,13982,16588,18274,18278,18284,18286,18610,18612,18629,19255,19267,19277,21548,21801,23671,23681,23715,24113,25063,25071,25614,25621,26842,26848,27029,27598,28772,29293,30022,30036,30654,31487,32612,32669,33409,33470,33977,41166,41177,46477,48173,48350,48627,49956,50404,52587,52592,52806,53013,54803,56092,56983,56989,58110,58215,59574,61016,62170,62280,62598,63075,63213,63251,66486,66492,67264,67270,67296,67429,67707,67863,70430,71928,72174,72245,73021,76737,79341,79461,79537,82119,82443,84812,85268,90158,91261,91278,91292,91368,91373,92738,92744,95229,99458,100629,102619,105123,105517,105539,105632,106810,108961,108971,110021,110252,110828,113619,114607,117504,117513,118329,119052,120504,120675,120684,120700,121987,125164,125175,125462,125518,127669,128415,131187,132134,133101,133106,133153,133797,133810,135776,135818,138410,139928,139987,140820,141424,141446,142060,142302,142369,142587,142596,142845,142952,143895,145625,146254,148537,148558,148824,149249,150605,150609,150787,150807,150959,152351,154338,157553,157557,157965,159924,160015,162972,166934,170336,170462,170935,171983,171999,173668,175231,175246,177296,179252,181105,182100,182565,183478,184012,186191,186348,188215,189933,190831,191606,192715,192811,194133,194196,194779,195435,196334,196941,197728,197811,199549,199849,200859,200923,200971,200976,202182,202186,202242,202342,202543,202652,203180,203202,203904,203906,204564,204848,207275,211613,212172,214073,214093,216010,216812,217102,217267,217282,217314,217362,217379,217502,218083,218204,218860,218935,218977,222082,222092,222112,222301,223592,224215,224226,228526,230245,232373,232562,233668,233776,233779,233853,234056,235291,235454,235549,238020,238029,238046,238250,238325,238688,242859,243017,244587,244642,244895,244904,244910,244924,244930,246110,246724,250153,250228,250680,250979,251299,251312,251322,251323,251764,251770,251822,252071,253881,254540,257477,259752,259812,260926,260993,262329,262335,262645,263126,264737,264888,264890,265186,265274,266397,267481,269597,269653,271309,274086,274198,274230,274502,275462,275502,279138,279243,279635,281370,282694,283238,283612,283766,284287,284359,284360,284466,286473,288058,289535,291211,291243,291443,291583,291927,292751,293198,294928,295418,296189,297054,299023,300721,302085,302904,303701,304864,305147,309579,310738,311946,316597,316602,316605,316608,316630,320585,321349,321464,324104,326120,326922,327054,329102,329406,329484,333395,334086,334453,335313,336019,337366,340225,340226,342723,343741,345689,345690,345961,345971,349595,349616,349641,350400,3492625,3493022,3493033,3493262,3493467','0','lastpost','desc','1227027990','11187','*.*.*.*') mysql error: Duplicate entry '417100' for key 1 mysql error number: 1062 mysql version: 4.0.25-Max-log php version: 4.4.4 Date: 18.11.2008 @ 18:06 Script: /wbb2/search.php Referer: _IP unkenntlich gemacht_ Gruß, Hinrich
06.11.2008 - 21:54 Uhr

Das ist zwar alles etwas OT, aber sei's drum, denn eigentlich ist es logisch:

Denn warum "0" == 0 ist, ist mir noch klar, aber warum in der tat für jeden string string == 0 ist verstehe ich nicht.

Es war einmal vor langer Zeit ein Compiler. Wenn man dort mit Hilfe der mitgelieferten Systembibliothek (Neudeutsch: Library) aus einer Zeichenkette eine Zahl extrahieren wollte, so wurde aus "0123test" vielleicht nicht ganz logisch, aber verständlich und bequem für den Programmierer 123. Und in der Konsequenz wurde das Ergebnis einer Zeichenkette, die keine Ziffern am Anfang enthielt, 0.

Die Entwickler von PHP haben das wohl übernommen, denn in der Konsequenz geht folgendes:
[php]
<?php
$testString1 = "0123test";
$testString2 = "test0123";
echo "$testString1 == 123 => " . (($testString1 == 123) ? "True" : "False") . "\n";
echo "$testString2 == 123 => " . (($testString2 == 123) ? "True" : "False") . "\n";
?>
[/php]
Die Ausgabe ist dann auch wie in diesem Kontext erwartet:


hd@lan:~> php -f test.php
$testString1 == 123 => True
$testString2 == 123 => False
hd@lan:~>

Dieser völlig verwahrloste Umgang mit Datentypen hat dann einige Entwickler wohl dazu getrieben, zumindest Elemente in die Sprache zu bringen, die Typenschärfe zeigen, wenn sie schon nicht strenge Typen insgesamt durchsetzen können. Und so entstanden dann eben die (imho) sehr hilfreichen Operatoren \=== und !==.

(mir fiele aber kein konkreter Anwendungsfall ein)

Nun, PHP ist eine Skriptsprache, bei der man es mit Typen nicht so genau nimmt. Warum auch? Es geht doch darum, schnell einen Batch On The Fly zu erledigen. Und die mit PHP zusammengeschraubte Web-Site nutzt intensiv Zeichenketten, vor allem aus dem Array $_REQUEST. Da ich mal davon gehört habe, dass es sinnvoll sein könnte, Variablen aus diesem Array einer etwas gründlicheren Prüfung zu unterziehen (keine Ahnung, wieso eigentlich), bleibt einem kaum eine Funktion wie strpos erspart. Die liefert aber $needle aus dem Heuhaufen als 0-basierten Index und FALSE wenn der Heuhaufen doch nicht pikt. Und ich könnte mir vorstellen, dass die Erkennung einer Zeichenkette wie "; DROP TABLE ..." durchaus für den einen oder anderen von einem gewissen, wenngleich untergeordnetem Interesse sein könnte...

In C# und sonstigen streng typisierten Sprachen ist so ein Operator eh überflüssig.

Eben.

29.09.2008 - 21:58 Uhr

Um eine schrittweise Umstellung zu ermöglichen möchte ich jedoch ganze Teile in Delphi als Modul anlegen und erst einmal weiternutzen.

Warum drehst Du den Spieß nicht um und lagerst konvertierte Teile in in C# geschriebene DLL's aus? Die sollte Delphi verarbeiten können, und so die endgültige Konvertierung des Hauptprogramms am Ende der Migration stehen.

Fragend, Hinrich

16.09.2008 - 23:56 Uhr

Keiner 'ne Idee?

13.09.2008 - 18:19 Uhr

Danke für den Hinweis. Aber am Server ist in der Zeit nichts los. Der zugehörige Thread ist im SLEEP-Modus und wartet auf Anfragen.

13.09.2008 - 15:56 Uhr

Hallo,

ich wollte gerne Crystal Reports nutzen, was auch soweit funktioniert (mühsam). Nun dauert es aber Ewigkeiten (30s), bis der Bericht angezeigt wird. Der Hänger entsteht dabei in der Methode SetDataSource(DataSource ds).

Übergeben wird eine DataSource, die zwei Tabellen enthält, nebst MySqlTableAdapter.

Wo kann ich das kleine Männchen suchen, das so lange die Handbremse zieht?

Schönes WE,
Hinrich

25.05.2008 - 15:14 Uhr

Die Leute sollten schon wissen was Sie tun, und dass 2 Leute dieselebn Datensätze bearbeiten deutet eigentlich eher darauf hin, dass in der Arbeitsteilung in der Firma etwas nicht funktioniert.

Das sehe ich etwas anders, wobei das Vergessen des offenen Vorganges in der Tat ein qualitatives Problem ist. Allerdings eines in der Person des Sachbearbeiters.

In einer Firma kann es aber durchaus zu einer solchen Situation kommen. Gerade bei kleineren Firmen (unter 10 Mitarbeiter) kommt vielen Mitarbeitern häufig eine ganzheitliche Betrachtung eines Vorganges zu.

Wahrscheinlich wird ein Logging ausreichend sein, so dass der zweite Nutzer, der auf einen Datensatz zugreift, eine Meldung bekommt. Nachts, zu einer definierten Zeit, wird dann das Logbuch auf dem Server einfach zurückgesetzt. Das Restrisiko dürfte dann unter 0,01% liegen.

Schönen Sonntag.
Hinrich

24.05.2008 - 00:44 Uhr

Hallo,

ich hätte diese Frage auch in dem Forum Datentechnologien stellen können, meine aber, dass sie hier besser aufgehoben ist. Also lasst uns bitte nicht darüber streiten.

Mein Projekt verarbeitet Daten, die auf einem zentralen (Intranet-) Server mit MySQL verwaltet werden. MySQL kam aus mehreren Gründen zum Einsatz: Ich kenne mich mit den SQL-Möglichkeiten und dem Syntax gut aus, der Server läuft unter Linux und die Lastverteilung entlastet die Clients. Hinzu kommt, dass ein Teil der Daten regelmäßig extrahiert und auf einen Web-Server kopiert werden soll, wo diese dann mittels PHP auf einer Web-Site verwendet werden.

Bisher habe ich mich in der Frage Datenkonsistenz in Client/Server-Fragen nur auf der Ebene von PHP-Skripten bewegt, wo diese Frage zwar in gleicher Form auftritt, aber m. W. bisher nicht wirklich thematisiert wurde.

Ein Client A ruft den Datensatz X auf, um ihn zu bearbeiten, hält ihn also in einer Maske. Der Anwender unterbricht seine Tätigkeit, ohne den Vorgang selbst abzubrechen, weil jemand anruft oder so, vergisst seine Tätigkeit, da er die Maske wegen des Bildschirmschoners nicht mehr sieht, geht zu Tisch und danach ins den Feierabend.

Am Client B möchte jemand anderes in diesem Zeitfenster etwas ändern.

Ein Record-Lock scheint mir wenig hilfreich, da Client A z. B. durch Windows Update einen Reboot durchführen könnte. Außerdem wäre ein über Stunden aufrecht erhaltener Lock kontraproduktiv.

TRANSACTIONS könnten sinnvoll sein, was aber eine offene Verbindung zum Server verlangen würde. Außerdem würde dabei ein Anwender am Client B im Gegensatz zum LOCK nicht merken, dass jemand anderes auch gerade an dem Datensatz arbeitet. Somit würde in jedem Fall einer der beiden umsonst arbeiten.

Die Daten selbst sind hoch sensibel, so das die Integrität höchste Priorität hat.

Wie löst Ihr ein solches Problem?

Hinrich

24.05.2008 - 00:15 Uhr

Ergo ersteres wird sehr oft gebracht(mach ich auch ab und an) aber zweiteres ist einfach besser und entspricht der allgemeinen Programmier ansicht.

Eigentlich macht "Rapide Programming" alles falsch, was jeder vernünftige Softwarentwickler in seiner Ausbildung lernt.

Danke für die Aussagen. Microsoft ist wohl, wie zuvor auch Borland, über das sprichwörtliche Ziel hinaus geschossen. Ein UI zusammen zu klicken macht imho viel Sinn, aber der Rest passt auch gut in eigene Schichten.

Hinrich

23.05.2008 - 14:18 Uhr

Hallo,

VS bietet ja viele Möglichkeiten, per Klicki-Bunti eine Anwendung zusammen zu schustern. Dabei kann man auch datensensitive Objekte (TableAdapter etc.) auf ein Form ziehen. Imho ist das eine zu starke Verquickung zwischen Datenhaltung, Programmlogik und UI.

Wie handhabt Ihr das?*Innerhalb des Form einfach die Logik umsetzen, oder *eigene Klassen entwickeln, die die Logik übernehmen und durch angedockte Klassen die Datenhaltung abstrahieren?

Hinrich

13.03.2008 - 14:44 Uhr
myDataGridView.CurrentRow.Cells[0].Value

wäre vielleicht möglich?

28.02.2008 - 22:27 Uhr

Also Steuer abschaffen?
Ich finde die Argumentation im Artikel eher abstossend.

Edit: das Steuermodell selbst ist überholt und unpraktisch, hat aber im Artikel so nicht die Reflektion erhalten.

Die Steuern abzuschaffen, das kann es nicht sein. Steuern haben sehr viel Sinn, denn sie finanzieren die gemeinschaftlichen Aufgaben des Staates. Dennoch muss man in diesem Zusammenhang einmal folgende Punkte sehen, ohne Anspruch auf Vollständigkeit:*Der Bundestag erhöht seine Diäten um knapp 10%, aber der Innenminister hält 5-8% Gehaltserhöhungen für Beamte und Angestellte der Öffentlichen Hand für überzogen; *die Staatsverschuldung ist ein Problem für die nachfolgenden Generationen, dennoch stellt eine Nettoneuverschuldung das "weiter wie bisher" dar; *der Spitzensteuersatz beträgt 45%, aber das oberste Hunderstel der Steuerzahler wird durch die Abgeltungsteuer entlastet; *Steuerhinterziehung ist strafbar, die Verschwendung von Steuergeldern aber nicht; *der Spitzensteuersatz beträgt 45% plus Soli, wird das (versteuerte) Einkommen ausgegeben, werden weiter 19% Steuer fällig, insgesamt also knapp 70% von jedem Konsum, obwohl das BVG die "hälftige Teilung" als Obergrenze definierte;

  • der Arbeitgeberanteil von Steuern und Abgaben müsste eigentlich berücksichtigt werden; und *öffentlich-rechtliche Abgabensysteme sind eigentlich steuerähnlich, so dass sich für kleine bis mittlere Einkommen die Staatsabgaben für Entsorgung (staatliches Zwangsmonopol), Krankenkassen, Rentenversicherung, GEZ usw. einschließlich Soli und Umsatzsteuer auf rund 80-90% erhöht.

Neben den aufgezeigten, inakzeptablen Verwerfungen kommen vollkommen unverständliche und willkürliche Subventionen und Bürokratiekosten, die an der Moral der Steuerzahler knabbern. Finanzministerien bezahlen externe Gutachten in schwindelerregenden Höhen, um Fragen zu klären, die sie selbst aufwerfen (und für deren Beantwortung sie auch über das qualifizierte Personal verfügen), Kommunen verbraten Milliarden in Projekte, die niemand braucht und niemand will (bestes Beispiel das Elmshorner Knickei) und jede Transparenz im Steuer- und Abgabensystem ist nicht andeutungsweise erkennbar.

Ich persönlich kennen niemanden, weder einen HARTZ-IV-Empfänger noch einen vermögenden Prinzen, der unter der derzeitigen Rechtslage das Steuersystem in diesem Land akzeptiert. Aber trotzdem zahlen diesen Menschen (zumindest die meisten von ihnen) ihre Steuern, was im übrigen auch der Kommentator des umstritten Beitrags verdeutlichte. Dieses Land aber braucht eine Revolution der politischen Kaste, damit sich etwas ändert.

26.02.2008 - 22:05 Uhr

Sehr lesenswert.

26.02.2008 - 21:57 Uhr

na ja, eben genau dieses "selbst hinzufügen müssen" beziehungsweise erst mal die Meldung, dass das Zertifikat eben NICHT vertrauenswürdig sei, schließt einen halbwegs professionell wirkenden Einsatz irgendwo aus ...

Das Problem lässt sich leider kaum vermeiden. Interessant könnte aber dennoch das CAcert-Projekt sein.

http://www.cacert.org/