Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1549 | Anzahl registrierter User: 1833 | Besucher online: 2089
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Data Fort


Autor: Sperneder Patrick
Sprache: C#
Bewertung:
7.77 (3 votes)
Anzahl der Aufrufe: 3886
  
Kick it on dotnet-kicks.de  

Beschreibung:

Speichert Passwörter und andere geheime Daten in den isolierten Speicher des Systems.
Es wird das "Protection in Deepth" Muster angewandt, denn die zu speichernden Daten werden
nur verschlüsselt (SHA512 Algorythmus inkl. SALT) in die gut geschützte XML Datei geschrieben.

Weiters ist es möglich nach einer gewissen Anzahl von Fehlversuchen ein Ereignis zu konsumieren.

Der Code !sollte! selbstklärend sein.



Abgelegt unter: password, safe file, isolated storage, isolated file, crypted file, crypted isolated storage.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
// Teil 1. von DataFort (partielle Klasse)

#region Part1 DataFort.cs

using System;
using System.Drawing;
using System.IO;
using System.IO.IsolatedStorage;
using System.Xml;
using System.Diagnostics;
using System.Security.Principal;
using System.Security.Cryptography;
using System.Text;
using System.ComponentModel;

namespace sxSpernsoft.DataFort
{
      [DesignTimeVisible (true ),ToolboxItem (true ),
      ToolboxBitmap (typeof(sxSpernsoft.DataFort.Properties.Resources),"shield"),
      Description("sxDataSafe ™.\n\n" +
      "Stellt Möglichkeiten bereit, um Passwörter in verschlüsselter Form im isolierten" +
      " Speicher des Betriebssystems zu speichern und zu manipulieren.\n" + 
      " ACHTUNG ! Die gespeicherten Passwörter können nur aus der Assembly die sie erstellt hat" + 
      " auch wieder ausgelesen oder verglichen werden !\n" +
      "Copyright © 2008 Doc.NET.Noodles")]
      public partial class sxDataSafe : Component
      {
            #region Konstruktoren

            public sxDataSafe()
            {
                  InitializeComponent();
            }
            public sxDataSafe(IContainer container)
            {
                  container.Add(this);

                  InitializeComponent();
            }
        
            #endregion

            #region lokale Variablen

            // Das Dokument indem das Passwort in verschlüsselter Form abgelegt ist.
            //
            XmlDocument settingsDoc = null;

            // Diese Datei heisst immer gleich !
            //
            const string storageName = "sxDataSafe.xml";

            // Der Zähler der zählt wie oft eine Passworteingabe falsch sein darf,
            // bevor das Event MultipleTriesFailed gefeuert wird.
            private int _WrongInputs = 0;

            // Die Begrenzung für die maximalen Anzahl der falschen Passworteingaben
            //
            private int _MAXWRONGINPUTS = 3;

            // Das flag das angibt, ob bei falschen Eingaben ein Event abgefeuert werden soll
            //
            private bool _RaiseWrongInputMaximumReachedEvent = false;

            // Das flag das angibt, ob bei gescheitertem Passwortwechsel ein Event gefeuert werden soll
            //
            private bool _RaisePasswordChangeFailedEvent = false;



            #endregion
      
            #region Ereignisse

            public event DataSafeWrongPasswordInputMaximumReachedEventHandler WrongPasswordInputMaxReached;
            public event DataSafePasswordChangeFailureEventHandler PasswordChangeFailed;

        
            #endregion

            #region sichere Eigenschaften

            // Benutzer Eigenschaft. Nur innerhalb der Klasse lesbar.
            //
            private string User
            {
                  get
                  {
                        if (settingsDoc != null)
                        {


                              XmlNode userNode = settingsDoc.SelectSingleNode("Settings/User");
                              if (userNode != null)
                              {
                                    return userNode.InnerText;
                              }
                              return "";
                        }
                        return "";
                  }
            }

            // Passwort Eigenschaft. Nur innerhalb der Klasse lesbar.
            //
            protected string _pwd;
            
            protected  string Password
            {
                  get
                  {
                        if (settingsDoc != null)
                        {


                              XmlNode pwdNode = settingsDoc.SelectSingleNode("Settings/Password");
                              if (pwdNode != null)
                              {
                                    return pwdNode.InnerText;
                              }
                              return "";
                        }
                        return "";
                  }
                  
                 
            }

            #endregion

            #region öffentliche Eigenschaften

            /// <summary>
            /// Die Anzahl der Fehlversuche bevor das event WrongInputsMaximumReached gefeuert wird.
            /// </summary>
            [Description ("Gibt die Anzahl der maximalen fehlgeschlagenen" + 
            " Anmeldeversuche zurück , oder legt diese fest.\n" +
            "Der Default ist auf 3 gesetzt.")]
            public int WrongInputsMaxValue
            {
                  get { return this._MAXWRONGINPUTS  ;}
                  set
                  {
                        if(value > 0)
                        {
                              this._MAXWRONGINPUTS  = value ;
                        }
                  }
            }

            /// <summary>
            /// Gibt die Anzahl der bereits falschen Passworteingaben zurück. (readonly)
            /// </summary>
            [Description("Gibt die Anzahl der fehlgeschlagenen Anmeldeversuche zurück.\n")]
            public int ActualWrongInputs
            {
                  get { return this._WrongInputs; }
            }

            /// <summary>
            /// Gibt an, ob das WrongInputMaximumReachedEvent abgefeuert wird oder nicht.
            /// Die Anzahl der Falscheingaben ist per Default auf 3 gesetzt, kann aber 
            /// über die Eigenschaft [int32] WrongInputMaxValue auf einen Wert > 0 gesetzt werden.
            /// </summary>
            [Description("Gibt an ob das Event 'WrongPasswordInputReached' abgefeuert werden soll, wenn das" + 
                  " Maximum an Falscheingaben erreicht wurde.\n" + 
                  "Diese Eigenschaft ist standardmässig deaktiviert.")]
            public bool RaiseWrongInputMaximumReachedEvent
            {
                  get { return this._RaiseWrongInputMaximumReachedEvent; }
                  set { this._RaiseWrongInputMaximumReachedEvent = value; }
            }

            /// <summary>
            /// Flag das angibt, ob bei einem gescheiterten Versuch das Passwort zu ändern 
            /// das event PasswordChangeFailedEvent gefeuert werden soll.
            /// </summary>
            [Description("Gibt an ob das Event 'PasswordChangeFailed' abgefeuert werden soll, wenn der" +
               " Wechsel des Passwortes fehlgeschlagen ist.\n" +
               "Diese Eigenschaft ist standardmässig deaktiviert.")]
            public bool RaisePasswordChangeFailedEvent
            {
                  get { return this._RaisePasswordChangeFailedEvent; }
                  set { this._RaisePasswordChangeFailedEvent = value; }
            }

            #endregion
       
            #region Private Methoden


            /// <summary>
            ///  Erzeugt ein gehashtes Passwort mit Salt. 
            /// </summary>
            /// <param name="password">Das Passwort im Klartext.</param>
            /// <param name="existingSalt">Wenn schon ein Salt vorhanden ist, dann mitübergen, ansonsten
            /// null übergeben, denn dann wird ein neuer Salt erzeugt.</param>
            /// <returns></returns>
            private string CreateHashedPassword(string password, byte[] existingSalt)
            {
                  byte[] salt = null;
                  if (existingSalt == null)
                  {
                        // Ein Salt zufälliger Grösse erzeugen.
                        Random random = new Random();
                        int size = random.Next(16, 64);

                        // Das SaltArray erzeugen
                        salt = new byte[size];

                        // Den besseren Zufallsgenerator benutzen um die Bytes
                        // für das Salt zu erhalten.
                        RNGCryptoServiceProvider rngSalt = new RNGCryptoServiceProvider();
                        rngSalt.GetNonZeroBytes(salt);
                  }
                  else
                      salt = existingSalt;
                        
                        // Den string in bytes umwandeln.
                        byte[] pwd = Encoding.UTF8.GetBytes(password);

                        // Speicherplatz für Passwort und Salt schaffen.
                        byte[] saltedPWD = new byte[pwd.Length + salt.Length];

                        // erst die PWD bytes hinzufügen
                        pwd.CopyTo(saltedPWD, 0);
                        // Jetzt das Salt hinzu ..
                        salt.CopyTo(saltedPWD, pwd.Length);

                        // SHA12 als Hashing Algorythmus verwenden.
                        byte[] hashWithSalt = null;
                        using (SHA512Managed sha512 = new SHA512Managed())
                        {
                              // Den Hash-Wert für das Passwort mit dem Salt berechnen.
                              byte[] hash = sha512.ComputeHash(saltedPWD);

                              // Salt an den Hash-Wert anhängen, damit er verfügbar ist.
                              hashWithSalt = new byte[hash.Length + salt.Length];

                              // Bytes einkopieren.
                              hash.CopyTo(hashWithSalt, 0);
                              salt.CopyTo(hashWithSalt, hash.Length);
                        }
                        
                        // Den Base64 codierten Hash-Wert mit Salt zurückliefern.
                        return Convert.ToBase64String(hashWithSalt);


                  }

            /// <summary>
            /// Diese Funktion wird aufgerufen, wenn ein bereits abgelegtes Passwort verglichen werden soll,
            /// aber die Klasse jedoch noch nicht initialisiert ist, und daher keine Daten geladen sind.
            /// 
            /// Wenn keine Datei im isolierten Speicherbereich gefunden werden kann, die für den 
            /// Vergleich entspricht, dann wird eine ArgumentException geworfen.
            /// </summary>
            private void InitDataSafe()
            {
                  // Den isolierten Speicher anfordern.
                  using (IsolatedStorageFile isoStorageFile =
                        IsolatedStorageFile.GetUserStoreForDomain())
                  {
                        // Ein internes DOM für die Einstellungen speichern
                        settingsDoc = new XmlDocument();
                        // wenn noch keine Einstellungen vorhanden sind, Exception werfen,
                        // denn es kann kein Passwort abgefragt werden wenn noch nie zuvor eine 
                        // Sicherheitsdatei angelegt wurde. Oder sie zuvor gelöscht wurde.
                        if (isoStorageFile.GetFileNames(storageName).Length == 0)
                        {
                              throw new ArgumentException("Es ist keine Datei namens '" + storageName +"' im isolierten Speicher vorhanden!");
                        }
                        // Zugriff auf den Einstellungsspeicher einrichten ..
                        using (IsolatedStorageFileStream isoFileStream =
                              new IsolatedStorageFileStream(storageName,
                                                            FileMode.Open,
                                                            isoStorageFile))
                        {
                              // Einstellungen aus dem isolierten Stream lesen.
                              settingsDoc.Load(isoFileStream);
                              // Einstellungen wurden geladen ..
                        }
                  }
            }


            #endregion

            #region Öffentliche Methoden

            /// <summary>
            /// Überprüft das Passwort das im Klartext übergeben wurde, mit dem Passwort
            /// das im isolierten Speicher im verschlüsselten Zustand liegt.
            /// </summary>
            /// <param name="password">Das Passwort im Klartext.</param>
            /// <returns>Wenn das Passwort authentifiziert ist, wird 'true' ansonsten 'false' zurückgeliefert.</returns>
            public bool CheckPassword(string password)
            {
                  if (this.Password == "")
                  {
                        // Dann ist es eine Abfrage des Passwortes, ohne das die Klasse zuvor erstellt wurde ..
                        // dadurch müssen wir jetzt die Datei aus dem Speicher laden und die Felder bestücken
                        // damit wir den Vergleich der Passwörter ausführen können.
                        InitDataSafe();
                  }

                  // Bytes für das Passwort ermitteln..
                  // Das ist die Hash/Salt-Kombination für das Passwort.
                  byte[] hashWithSalt = Convert.FromBase64String(Password);

                  // ich habe 512 Bits als Hash-Grösse verwendet (SHA512)
                  int hashSizeInBytes = 512 / 8;

                  // Eine Variable für das ursprüngliche Salte erzeugen
                  int SaltSize = hashWithSalt.Length - hashSizeInBytes;
                  byte[] salt = new byte[SaltSize];

                  // Den Salt-Wert herauskopieren
                  Array.Copy(hashWithSalt, hashSizeInBytes, salt, 0, SaltSize);

                  // Den Hash-Wert für dieses Passwort ermitteln.
                  string PasswordHash = CreateHashedPassword(password, salt);

                  // Wenn die errechneten Werte gleich sind, dann ist auch das Passwort
                  // verifiziert.
                  if (Password == PasswordHash)
                  {
                        // wenn die Passworteingabe gestimmt hat, dann wird der Fehlerzähler
                        // wieder zurückgesetzt.
                        this._WrongInputs = 0;
                        return true;
                  }
                  // wenn nicht, dann Fehler mitzählen ..
                  else
                  {
                        // Falscheingaben mitzählen ..
                        this._WrongInputs += 1;
                        // wenn das Maximum der Falscheingaben erreicht ist ,
                        if (this._WrongInputs >= this._MAXWRONGINPUTS)
                        {
                              // wenn dies auch gemeldet werden soll ,
                              if (this._RaiseWrongInputMaximumReachedEvent)
                              {
                                    // event abfeuern ..
                                    this.WrongPasswordInputMaxReached(this,
                                          new DataSafeWrongInputMaximumReachedEventArgs(this.User,
                                                                                     DateTime.Now,
                                                                                    this._WrongInputs));

                                    return false;
                              }
                        }
                        return false;
                       
                  }
            }

            /// <summary>
            /// Speichert das Passwort in isolierten Speicher ab.
            /// </summary>
            /// <param name="password">Klartext Passwort [string].</param>
            /// <returns>Wenn das Passwort gespeichert wurde 'true', wenn schon ein Passwort vorhanden ist 'false'.</returns>
            public bool SavePassword(string password)
            {
                  if (password == "") { throw new ArgumentException("Das Passwort darf nicht 'null' oder 'string.Empty' sein !"); }

                  try
                  {
                        // Den isolierten Speicher anfordern.
                        using (IsolatedStorageFile isoStorageFile =
                              IsolatedStorageFile.GetUserStoreForDomain())
                        {
                              // Ein internes DOM für die Einstellungen speichern
                              settingsDoc = new XmlDocument();
                              // wenn noch keine Einstellungen vorhanden sind, Defaults verwenden.
                              if (isoStorageFile.GetFileNames(storageName).Length == 0)
                              {
                                    using (IsolatedStorageFileStream isoFileStream =
                                          new IsolatedStorageFileStream(storageName,
                                                                        FileMode.Create,
                                                                        isoStorageFile))
                                    {
                                          using (XmlTextWriter writer = new
                                                XmlTextWriter(isoFileStream, Encoding.UTF8))
                                          {
                                                writer.WriteStartDocument();
                                                writer.WriteStartElement("Settings");
                                                writer.WriteStartElement("User");
                                                // aktuellen Benutzer abrufen,
                                                WindowsIdentity user = WindowsIdentity.GetCurrent();
                                                writer.WriteString(user.Name);
                                                writer.WriteEndElement();
                                                writer.WriteStartElement("Password");
                                                // CreateHashedPassword als Salt null übergeben,
                                                // damit ein Salt-Wert generiert wird.
                                                // CreateHashedPassword wird in Kürze vorgestellt.
                                                string hashedPassword =
                                                      CreateHashedPassword(password, null);
                                                writer.WriteString(hashedPassword);
                                                writer.WriteEndElement();
                                                writer.WriteEndElement();
                                                writer.WriteEndDocument();
                                          }
                                          return true;
                                    }
                              }
                              else
                              {
                                    // Es ist schon eine Passwortdatei vorhanden, 
                                    return false;
                              }
                              

                        }
                  }
                  catch (Exception)
                  {
                        return false;
                  }
                          
            }
             
            /// <summary>
            /// Ändert das aktuelle Passwort in das neue,
            /// vorausgesetzt es wird zuerst das alte 'richtige' Passwort übergeben.
            /// </summary>
            /// <param name="oldpassword">Das bisher verwendete Passwort.</param>
            /// <param name="newpassword">Das neue Passwort.</param>
            /// <returns>Bei Erfolg 'true' ansonsten 'false'.</returns>
            public bool ChangePassword(string oldpassword, string newpassword)
            {
                  // wenn das Passwort nicht stimmt, überprüfen was geschehen soll
                  if (!CheckPassword(oldpassword))
                  {     // wenn erwünscht, das event abfeuern
                        if (this._RaisePasswordChangeFailedEvent)
                        {
                              this.PasswordChangeFailed(this, new DataSafePasswordChangeFailedEventArgs(this.User, DateTime.Now));
                              return false;
                        }
                        return false;
                  }

                 // Nun da wir wissen, dass das Passwort stimmt, müssen wir das aktuelle Passwort
                 // neu verschlüsseln und im isolierten Speicher ablegen.
                 // Den isolierten Speicher anfordern.
                 using (IsolatedStorageFile isoStorageFile =
                       IsolatedStorageFile.GetUserStoreForDomain())
                 {
                       // Die Datei neu erstellen, und danach der Klasse wieder zur Verfügung zu stellen.
                       using (IsolatedStorageFileStream isoFileStream = new IsolatedStorageFileStream(storageName,
                                                                        FileMode.Open,
                                                                        isoStorageFile))
                       {
                             using (XmlTextWriter writer = new
                                                XmlTextWriter(isoFileStream, Encoding.UTF8))
                             {
                                   writer.WriteStartDocument();
                                   writer.WriteStartElement("Settings");
                                   writer.WriteStartElement("User");
                                   // aktuellen Benutzer abrufen,
                                   WindowsIdentity user = WindowsIdentity.GetCurrent();
                                   writer.WriteString(user.Name);
                                   writer.WriteEndElement();
                                   writer.WriteStartElement("Password");
                                   // CreateHashedPassword als Salt null übergeben,
                                   // damit ein Salt-Wert generiert wird.
                                   // CreateHashedPassword wird in Kürze vorgestellt.
                                   string hashedPassword = CreateHashedPassword(newpassword, null);
                                   writer.WriteString(hashedPassword);
                                   writer.WriteEndElement();
                                   writer.WriteEndElement();
                                   writer.WriteEndDocument();
                              }
                              // Die Datei wieder laden, um die Eigenschaften wieder darstellen zu können.
                              // Zugriff auf den Einstellungsspeicher einrichten ..
                              using (IsolatedStorageFileStream storedFileStream =
                                    new IsolatedStorageFileStream(storageName,
                                                                  FileMode.Open,
                                                                  isoStorageFile))
                              {
                                    // Einstellungen aus dem isolierten Stream lesen.
                                    settingsDoc.Load(storedFileStream);
                                    // Einstellungen wurden geladen ..
                              }


                       }

                 }
                 // Passwort erfolgreich geändert.
                 return true;
            }
           
            /// <summary>
            /// Löscht die Passwortdatei aus dem isolierten Speicher.
            /// </summary>
            /// <returns>Bei erfolgter Löschung 'true' andernfalls 'false'.</returns>
            public bool DeleteIsolatedCryptoFile()
            {
                  using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForDomain())
                  {
                        if (isoFile.GetFileNames(storageName).Length == 0)
                        {
                              // dann ist die Datei nicht mehr im isolierten Speicher vorhanden.
                              return false;
                        }
                        else
                        {     // Dateie löschen ..
                              isoFile.DeleteFile(storageName);
                              return true;
                        }

                  }
            }

            /// <summary>
            /// Löscht den gesamten Isolierten Speicher für diesen User.
            /// </summary>
            /// <returns>Wenn die Ausführung erfolgreich war, dann wird das Objekt anschliessend entsorgt,
            /// andernfalls liefert es false zurück.</returns>
            public bool DeleteIsolatedStorage()
            {
                  try
                  {
                        IsolatedStorageFile.Remove(IsolatedStorageScope.User );
                        // Alle Eigenschaften die aus dem XML Dokument lesen, werden mit dem
                        // Zurücksetzen auch zurückgesetzt.
                        // Wird nachdem das Dokument auf Null gesetzt wurde auf eine Eigenschaft zugegriffen,
                        // Dann wird eine Exception geworfen.
                        this.settingsDoc = null;
                        return true;
                  }
                  catch (Exception)
                  {
                        return false;
                  }
                                   
                  }



            #endregion

      }
}

#endregion

#region Part2 Datafort.designer.cs
// der zweite Teil der partiellen Klasse. (Designer)
namespace sxSpernsoft.DataFort
{
      partial class sxDataSafe
      {
            /// <summary>
            /// Erforderliche Designervariable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            /// <summary> 
            /// Verwendete Ressourcen bereinigen.
            /// </summary>
            /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
            protected override void Dispose(bool disposing)
            {
                  if (disposing && (components != null))
                  {
                        components.Dispose();
                  }
                  base.Dispose(disposing);
            }

            #region Vom Komponenten-Designer generierter Code

            /// <summary>
            /// Erforderliche Methode für die Designerunterstützung.
            /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
            /// </summary>
            private void InitializeComponent()
            {
                  components = new System.ComponentModel.Container();
            }

            #endregion
      }
}
#endregion

#region EventArgs

using System;
using System.Collections.Generic;
using System.Text;

namespace sxSpernsoft.DataFort
{
      public class DataSafeWrongInputMaximumReachedEventArgs : EventArgs
      {
            string _user;
            DateTime _timestamp;
            int _trys;
            public DataSafeWrongInputMaximumReachedEventArgs(string user, DateTime timestamp, int FailedTrys)
            {

                  this._user = user;
                  this._timestamp = timestamp;
                  this._trys = FailedTrys;
            }
            public string User { get { return _user; } }
            public DateTime TimeStamp { get { return _timestamp; } }
            public int FailedTrys { get { return _trys; } }

      }
      public class DataSafePasswordChangeFailedEventArgs : EventArgs
      {
            string _user;
            DateTime _timestamp;
            public DataSafePasswordChangeFailedEventArgs(string user, DateTime timestamp)
            {
                  this._user = user;
                  this._timestamp = timestamp;
            }
            public string User { get { return _user; } }
            public DateTime TimeStamp { get { return _timestamp; } }
      }

}
#endregion

#region Eventhandler
using System;
using System.Collections.Generic;
using System.Text;

namespace sxSpernsoft.DataFort
{
     
      public delegate void DataSafeWrongPasswordInputMaximumReachedEventHandler(object sender, DataSafeWrongInputMaximumReachedEventArgs e);
      public delegate void DataSafePasswordChangeFailureEventHandler(object sender, DataSafePasswordChangeFailedEventArgs e);



}


#endregion

Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Greenberet schrieb am:  07.04.2008 00:29:07

Nettes Beispiel, nur du solltest von dem Gedanken wegkommen, dass eine Hash Funktion ein Verschlüsselungsverfahren ist. Zwischen Hash und Verschlüsselung liegen Welten...
Sperneder Patrick schrieb am:  08.06.2008 13:46:16

Du hast recht. Aber wirklich lesbar ist eine gehashte Datei auch nicht mehr.
Aber da die Datei im geschützten Speicher liegt ( und die CLR die Berechtigung auf die Datei zuzugreifen verwaltet ) denke ich ist es für normale Fälle absolut ausreichend.
Danke für dein Feedback


Diese Snippets könnten für Sie interessant sein:

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.