Archiv

Archiv für die Kategorie ‘Microsoft .NET’

.NET Open Space Süd 2010

Dieses Wochenende fand in Karlsruhe der .NET Open Space Süd 2010 statt. Für mich war es das erste Mal, das ich an so einer Veranstaltung teilgenommen habe. Die Veranstaltung wurde in den Räumen von bluehands ausgerichtet.
Die Themen wurden durch die ca. 50 Teilnehmer selbst bestimmt. Dabei legte sich automatisch ein großer Fokus auf die Schnittstelle zwischen Kunden und Entwickler. Hier stecken wohl für alle die größten Probleme bzw. es ist einfach der meiste Handlungsbedarf. Es gab einige Sessions in Richtung BDD und DDD. Diese Sessions waren sehr informativ und es fand eine angeregte Diskussion ab. Ein Fazit der Veranstaltung war für viele, dass wir Entwickler mit Tools für die Entwicklung selbst, gut versorgt sind. Wo es mangelt, ist eine sinnvolle Unterstützung durch Software, Anforderungen des Kunden zu erfassen und umzusetzen bzw. deren Umsetzung zu prüfen.
Ein Highlight der Veranstaltung war ein kleines DoJo, initiert durch Ilker. Thema war die Umsetzung von arabischen Zahlen in das römische Zahlensystem.

RSA Signierung von Strings

19. März 2010 Keine Kommentare

Im Rahmen eines Projektes wollte ich ursprünglich Strings mittels eines asymmetrischen Verschlüsselungsverfahrens verschlüsseln. Hierzu wählte ich als Verfahren RSA. Nachdem ich alles soweit fertig hatte, ist mir leider aufgefallen, dass RSA mittels des privaten Schlüssels nur entschlüsseln kann, nicht jedoch verschlüsseln. Um trotzdem Nutzen aus der Sache zu ziehen (es ging nur um Prüfung von Daten), nutze ich den privaten Schlüssel nun zur Erzeugung einer Datensignatur. Die Anwendung des Anwenders kann diese mittels des öffentlichen Keys problemlos überprüfen.

Da es recht aufwendig ist, die geeigneten konkreten Klassen und Funktionen zur Erzeugung und Speichern der Schlüssel sowie zur Anwendung der Signierung herauszusuchen, habe ich eine kleine Demo-Anwendung geschrieben. Die jeweils benötigten Eingabefelder wurden farbig passend hervorgehoben.

Benötigt wird zuerst der passende Namespace:

using System.Security.Cryptography;

Die Erzeugung der Schlüssel ist extrem einfach:

            var rsa = new RSACryptoServiceProvider();
            textBoxPrivateKey.Text = rsa.ToXmlString(true);
            textBoxPublicKey.Text = rsa.ToXmlString(false);

Die ToXmlString-Funktion erzeugt ein sehr gut speicherbares Format der Schlüssel, dass so auch wieder gut eingelesen werden kann. Wichtig ist aber, die Signatur in ein übertragungstaugliches Format zu bringen, da diese standardmäßig aus Bytes besteht. Hierzu nutze ich eine Hilfsfunktion BytesToHex:

        public static string BytesToHex(byte[] bytes)
        {
            var hexString = new StringBuilder(bytes.Length);
            for (int i = 0; i < bytes.Length; i++)
            {
                hexString.Append(bytes[i].ToString("X2"));
            }
            return hexString.ToString();
        }
 
        private void ButtonSignTextClick(object sender, EventArgs e)
        {
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(textBoxPrivateKey.Text);
 
            var encryptedSymmetricKey = rsa.SignData(
                Encoding.Unicode.GetBytes(textBoxSourceText.Text), 
                new SHA1CryptoServiceProvider());
            textBoxSignature.Text = BytesToHex(encryptedSymmetricKey);
        }

Ist die Signatur erstellt, kann sie auf ähnliches Weg überprüft werden.

        public static byte[] StringToByteArray(String hex)
        {
            int numberChars = hex.Length;
            var bytes = new byte[numberChars / 2];
            for (int i = 0; i < numberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
 
        private void ButtonTestSignClick(object sender, EventArgs e)
        {
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(textBoxPublicKey.Text);
 
            byte[] signText = StringToByteArray(textBoxSignature.Text);
            byte[] originalText = Encoding.Unicode.GetBytes(textBoxSourceText.Text);
 
            bool signOk = rsa.VerifyData(originalText, new SHA1CryptoServiceProvider(), signText);
 
            MessageBox.Show("Signature OK: " + signOk);
        }

Hier kann das ganze noch als VS2008-Anwendung mit einer ausführbaren Datei zusammen heruntergeladen werden: RSA Source

KategorienMicrosoft .NET Tags: , ,

Roulette, ein sicheres System?

23. Januar 2010 1 Kommentar

In letzter Zeit findet man immer wieder Berichte, wie man Online-Casinos angeblich mit einem todsicherem System austricksen könnte. Das soll wie folgt funktionieren:

Man setzt einen Euro auf eine Farbe. Gewinnt man, fährt man mit einem Euro fort. Verliert man, so setzt man das doppelte und zwar solange, bis man wieder gewinnt. Der Verlust wird dadurch vollständig ausgeglichen und ist auch unter dem Begriff Martingal Roulette System bekannt.

Das klingt erst mal gut, funktioniert auch theoretisch. Allerdings gibt es ein paar praktische Probleme: Tischlimits führen schnell dazu, dass man seine Strategie nicht fortsetzen kann. Der Gewinn pro Runde bleibt bei einem Euro stehen. Man muss also 200 erfolgreiche Runden absolvieren, für einen Gewinn von 200 Euro…

Ich habe dazu eine kleine Anwendung geschrieben, die das ganze durchtestet. Die einzelnen Parameter sind einstellbar, ob man gewinnt oder nicht, wird dem Zufall überlassen. Die Anwendungen läuft, bis entweder die maximale Rundenzahl erreicht wurde, oder man den Einsatz mangels Kapital nicht mehr bringen kann. Das geht oft schneller, als gewünscht. Am Ende siegt eben immer noch die Bank:

Downloads:
Ausführbare Anwendung (10 kByte), Microsoft .Net 2.0 erforderlich
Quellcode für C# 2.0 (18 kByte)

KategorienAllgemein, Microsoft .NET Tags:

Klonen von Objekten in C#

30. November 2009 2 Kommentare

Möchte man existierende Objekte in Microsoft.NET klonen, so steht scheinbar die Schnittstelle System.ICloneable zur Verfügung. Dazu wird dann oft zur Implementation der Methode MemberwiseClone geraten. In der Praxis zeigt sich leider, das Referenzen somit aber nicht geklont werden.

Eine Lösung wird durch Serialisierung angeboten:
http://www.csharp411.com/c-object-clone-wars/ (Punkt 4)
Auf diesem Weg kann ein Datenabzug eines Objekts erstellt werden und auf dieser Basis kann eine Kopie (Clone) erzeugt werden. Eine Demonstration eines CloneManagers habe ich hier dargestellt.

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleApplication6
{
    public static class CloneManager
    {
        public static T Clone<T>(T instance) where T : class
        {
            var serializer = new BinaryFormatter();
            var stream = new MemoryStream();
            serializer.Serialize(stream, instance);
            stream.Seek(0, SeekOrigin.Begin);
            return serializer.Deserialize(stream) as T;
        }
    }
 
    [Serializable]
    public class A
    {
        public int C { get; set; }
        public B B { get; set; }
        public A()
        {
            B = new B();
        }
    }
    [Serializable]
    public class B
    {
        public int[] Ints { get; set; }
 
        public B()
        {
            Ints = new[] {2, 4, 5};
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var a = new A {C = 3};
            var a2 = CloneManager.Clone(a);
            a.B.Ints[1] = 3;
            Console.WriteLine("a.C {0} - a2 {1}", a.C, a2.C);
            Console.WriteLine("a.B [0] {0} - a2.B [0] {1}", a.B.Ints[0], a2.B.Ints[0]);
            Console.WriteLine("a.B [1] {0} - a2.B [1] {1}", a.B.Ints[1], a2.B.Ints[1]);
            Console.ReadKey();
        }
    }
}

Der CloneManager ist an diese Version http://www.codeproject.com/KB/cs/CloneManager.aspx angelehnt.

KategorienMicrosoft .NET Tags:

Blog-Parade: Die 3 beliebtesten Fachbücher aus dem .NET-Umfeld

28. September 2009 Keine Kommentare

Mit diesem Beitrag möchte ich mich der Blog-Parade zum Thema der beliebtesten Fachbücher aus dem NET-Bereich anschließen.

1. Richtlinien für das Framework-Design
Dieses Buch enthält Richtlinien für die Namensgebung im .NET-Bereich. Außerdem enthält man Einblicke, wie speziell die Konventionen innerhalb des .NET-Frameworks herausgearbeitet wurden. Nach dem Durcharbeiten des Buches fällt es leichter, Namensfehler zu vermeiden und die Benennung geschickter zu wählen.

2. C# 3.0 Entwurfsmuster
Das Buch ist eine Einführung in Entwurfsmuster. Vielen andere Einführungen, welche nicht speziell auf die Spracheigenschaften von C# ausgelegt sind, wirken komisch, wenn am Ende des Kapitels beispielsweise klar wird, welche bekannte C#-Technik dahinter steckt.

3. Grundlagen der Anwendungsentwicklung mit dem .NET Framework 2.0
Dieses Buch setzt vernünftiges Grundwissen voraus und vermittelt einen darauf basierenden breiten Querschnitt über die vorhandenen Technologien und deren Anwendung. Es zeigt das .NET Framework 2.0 aus der Sicht, wie es von Microsoft konzipiert wurde und wie es eingesetzt werden sollte.

KategorienMicrosoft .NET Tags: ,

Asp.NET TimeOut bei Form-Authentifizierung

4. September 2009 Keine Kommentare

Verwendet man Formular-Authentifizierung, so lässt sich der TimeOut von Asp.NET Anwendungen scheinbar nicht über 20min erhöhen. Damit es doch geht, muss in der web.config der TimeOut explizit vermerkt werden:

...
    <authentication mode="Forms">
      <forms name="WebFormlogin" loginUrl="WebFormlogin.aspx" timeout="60">
...
KategorienMicrosoft .NET Tags: ,

Beispiele für String-Formatierungen

6. August 2009 Keine Kommentare

Ein Beispiel sagt oft mehr, als tausend Worte… Um mit .NET Strings zu formatieren, gibt es viele Möglichkeiten, leider ist die Hilfe dazu zwar oft korrekt, aber nicht wirklich erklärend.

Darum hier ein Link mit praktischen Beispielen dazu sind hier zufinden:
http://alexonasp.net/samples/stringformatting/
Sogar die Ländereinstellungen sind umschaltbar.

Installationsproblem von KB 971092 für Visual Studio 2008 SP1

Bei dem Security Update for Microsoft Visual Studio 2008 Service Pack 1 (KB971092) zeigten sich auf meinem Rechner massive Installationsprobleme. Das Update scheint sich problemlos zu installieren, es wird aber immer wieder angeboten. Nach einigem Suchen scheint das Problem darin zu liegen, dass ich die C++ Komponenten nicht mit installiert habe.

Aber es sich auch schon Workarounds verfügbar:

  • Herunterladen der VS90SP1-KB971092-x86.exe
  • Installation der VS90SP1-KB971092-x86.exe starten und den Pfad merken, wohin die Dateien entpackt werden.
  • Auf die Fehlermeldung warten und das Fehlerfenster unbedingt offen lassen!
  • In den Ordner der entpackten Dateien gehen und den Inhalt in einen anderen Ordner kopieren
  • Die Fehlermeldung und Installation beenden
  • {Program Files}\Microsoft Visual Studio 9.0\Common7\Tools öffnen und die Datei vsvars32.bat suchen
  • Die Rechte dieser Datei auf „Jeder kann ändern“ stellen
  • Die VS90SP1-KB971092-x86.msp aus dem kopierten Ordner starten
  • Die Sicherheiten der Datei vsvars32.bat wieder zurück setzen
KategorienMicrosoft .NET Tags:

ReSharper und Probleme mit Codevervollständigung

Seit geraumer Zeit zeigte die Code-Vervollständigung unter C# folgendes Bild:
Codevervollständigung für IF

Dabei sind viele unnütze if-Kombination zu sehen, welche sich auf vorhandene Namespace-Definitionen beziehen. Nach längerer Suche konnte ich den Verursacher ausmachen. Ich verwende in den betroffenen Projekten VistaDB. In der Version 3.5 build 84 wurde die Library mittels Obfuscation unleserlich gemacht. Leider hat genau diese Verschlüsselung der Bibliothek den Effekt, dass jedes nicht öffentliche Objekt in einen eigenen neuen Namespace gelegt wird, hier also beispielsweise:

if
If
IF
@if

Diese Namespace-Definitionen bietet der Resharper per Code-Vervollständigung. Leider steht sowohl seitens VistaDB als auch seitens JetBrains eine Lösung noch aus.

Installation .NET 3.5 auf Virtuellem Server

1. Juli 2009 1 Kommentar

Bei der Installation vom SQL-Server 2008 und dem dafür notwendigen .NET Framework 3.5 hatte ich auf einem virtuellen Windows 2003 Webserver unerwartete Problem. Keine der Installation funktionierte, obwohl der Server zuvor frisch initialisiert wurde.
Nach einiger Suche bin ich dann doch noch in einem anderen Blog fündig geworden.

Die Probleme treten in der Kombination Windows Server 2003 x64 SP2 und Virtuozzo scheinbar reproduzierbar auf. Der Installer des .NET Frameworks schließt mit Fehlern der Art

XPSEPSC x64 Installer: [2] Error code 1603
 for this component means "Fatal error during installation."

ab. Die Aktualisierung vom Windows-Installer oder das Setup der Powershell melden Probleme beim Cryptographic-Dienst.

Geholfen hat letztendlich:

  • das Starten des Printer Spooler-Dienstes
  • das Umbennen des System32\Catroot2-Verzeichnises nach dem Neustart des Viruozzo-Panels

Danach liefen alle Installation ohne Probleme.

Aber: So ganz sicher, damit eine langfristig sinnvolle Lösung gefunden zu haben, bin ich mir nicht. 1&1 schreibt dazu in der Hilfe sinngemäß, dass von der Installation von Hotfixes und Windows Updates abzusehen sei. Grund können Versionsprobleme im Zusammenspiel mit Aktualisierungen von Virtuozzo sein.

Evtl. habe ich so nur einen Weg gefunden, die Absicherung von Virtuozzo zur Verhinderung von Windows-Updates zu umgehen. Mir war das auf lange Sicht für ein Produktivsystem zu riskant.

KategorienAllgemein, Microsoft .NET Tags: