hoi :)
kann mir jemand sagen wie ich datein in den ich passwörter abspeichere verschlüssle und wenn ich das passwort wieder aufruf entschlüssel.
thx haraxx
Wozu denn wieder entschluesseln?
Wenn du es wirklich wieder entschluesseln moechtest, solltest du einen der vielen Verschluesselungsalgorithmen verwenden.
Davon kann ich aber nur abraten (Sicherheitsbedingt).
Wozu gibt es nette einweg-Verschluesselungen like MD5 etc.?
Das heisst, es wird ein nicht zurueckberechenbarer hash des Passwortes erstellt und abgespeichert.
Wenn User das naechste mal das Passwort eingibt, erstellst du halt einfach nochmal einen Hash von dem Pass und vergleichst den Hash des eingegebenen Pw's mit dem Hash aus der db.
Gruß z3r0x
also wenn du nur vergleichen muss ob user xyz das password richtig eingeben hat dann wuerdue auch ich dir einweg-Verschluesselungen empfehlen.
wenn du jedoch einen password manager oder aehnliches machen willst nimm einfach einen freien algo ich wuerde die Twofish empfehlen.
Cord Worthmann
10.06.2004, 14:19
oder one-time-pads...
(weil unknackbar)
grtz
chief
Sir Dragonslayer
10.06.2004, 17:46
Hi
Wenn du die auch wieder entschlüsseln willst brauchst du eine abgeleitete Klasse vom CryptoStream (z.B. Rijndael). Da gibst du dann nur noch den Initialisierungsvektor und den Key an, und legst den Stream als Zusatz Strom über die Datei oder wo immer das hin soll.
hihi :) tach
hmm nen kleinen link zu nen beispiel oder wo ich was dazu lesen kann wäre nett. die verschlüsselung muss für den anfang kein banksafe werden :) will nur das die userdaten (pw accountname) in ner z.b. config.ini gespeichert werden und nich gleich wenn ma ein fremder die datei öffnet die daten lesbar sind :) also nur was das fix es verschnürgelt beim speichern.
thx haraxx
oder one-time-pads...
(weil unknackbar)
Das ist Kaese.
One-Time-Pads werden (wie der Name schon aussagt) nur einmal verwendet.
Fuer eine Passwortabfrage absolut ungeeignet.
Wirkliche One-Time-Pads (und damit meine ich keine Pseudo-Zufallsgenerierten Pads) fuer groessere Datenmengen sind auch nur kaum- oder sehr schwer erstellbar.
Da muesstest du schon die Emissionen von Radioaktivem Zerfall messen, um wirklich zufaellige Werte zu erhalten.
Afaik wurde soetwas das letzte mal fuer die Leitung "Rotes Telefon" zwischen den Amis und den Russen verwendet.
Ein Hash sollte fuer seine Zwecke (und die meisten Zwecke) schon vollkommen ausreichen. :p
@haraxx
Suche mal nach -> MD5 <-
Gruß z3r0x
Sir Dragonslayer
10.06.2004, 21:50
Ein Beispiel. Hmmm.
Gib mal in der Hilfe bei Index Cryptostream bzw. rijandel oder so (so ein scheiß Name) ein. Hab mir das auch aus der Hilfe beigebracht.
Nebenbei da gibt symmetrische und asymmetrische. Asymmetrische sind sicherer, aber nur für kleine Daten gedacht. die hab ich leider aber noch nie verwendet.
Aber ich geb dir mal das was ich mal gemacht hab. Da hab ich ne Highscore Datei verschlüsselt.
Diese Definition hab ich ins Highscorefenster geschmissen:
public static RijndaelManaged RMglobal=new RijndaelManaged();
Also das muß zunächst irgendwohin wo es immer zuerst ausgeführt wird:
(bei mir ist das die main() .
HighScoreFenster.RMglobal.Key=new byte[]{0x0A, 0xAB, 0xAC, 0xAD, 0xF2, 0xF3, 0xAA, 0xFA, 0xD2, 0x42, 0x11, 0x27, 0xF6, 0xB2, 0xEB, 0xA1};
HighScoreFenster.RMglobal.IV=new byte[] {0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x04, 0x08};
Das ist ein 16Bit-Array in Hex-dec für den IV und den KEY.
Das muß immer derselbe sein sonst kannst dus nicht mehr entschlüsseln.
Dann hab ich getestet ob die Datei vorhanden ist bzw. entschlüsselbar und gegebenfalls sie neu erstellt.
SoapFormatter sf=new SoapFormatter();
if (!File.Exists(HighScoreFenster.Pfad))
{
FileStream test=File.Create(HighScoreFenster.Pfad);
test.Close();
}
FileStream fs=new FileStream(HighScoreFenster.Pfad,FileMode.Open,FileAccess.ReadWrite);
try
{
CryptoStream cs=new CryptoStream (fs,HighScoreFenster.RMglobal.CreateDecryptor(HighScoreFenster.RMglobal.Key,HighScoreFenster.RMglobal.IV),CryptoStreamMode.Read);
ArrayList Ar=(ArrayList)sf.Deserialize(cs);
HEintrag he=(HEintrag) Ar[0];
fs.Close();
}
catch
{
fs.Close();
FileStream fs2=new FileStream(HighScoreFenster.Pfad,FileMode.Truncate,FileAccess.Write);
ArrayList Ar=new ArrayList();
for (int i=0;i<10;i++)
{
Ar.Add(new HEintrag("Anonym",0,2));
}
CryptoStream cs=new CryptoStream(fs2,HighScoreFenster.RMglobal.CreateEncryptor,HighScoreFenster.RMglobal.Key,HighScoreFenster.RMglobal.IV),CryptoStreamMode.Write);
sf.Serialize(cs,Ar);
cs.Close();
fs2.Close();
}
nebenbei das decryptor ist der Entschlüsselungsteil des Rijndael-constructor
Jetzt kommt noch der Teil wo ich einen neuen eintrag reingeschrieben hab.
private void HighScoreEintrag(int Richtig)
{
ArrayList Ar=new ArrayList();
SoapFormatter sf=new SoapFormatter();
int pos=0;
HEintrag Eintrag;
FileStream fs=new FileStream(HighScoreFenster.Pfad,FileMode.Open,FileAccess.Read);
CryptoStream cs=new CryptoStream(fs,HighScoreFenster.RMglobal.CreateDecryptor(HighScoreFenster.RMglobal.Key,HighScoreFenster.RMglobal.IV),CryptoStreamMode.Read);
Ar=(ArrayList)sf.Deserialize(cs);
for (int i=10;i>0;i--)
{
Eintrag=(HEintrag)Ar[i-1];
if (this.Punktzahl>Eintrag.Punkte)
{
pos=i;
if (i!=10)
{
Ar[i]=Ar[i-1];
}
else
Ar[i-1]=null;
}
}
if (pos!=0)
{
EintragsFenster EF=new EintragsFenster(pos,Richtig,this);
EF.ShowDialog();
Ar[pos-1]=new HEintrag(EF.HighScoreName,this.Punktzahl,this.Level);
}
cs.Close();
fs.Close();
FileStream fs2=new FileStream(HighScoreFenster.Pfad,FileMode.Open,FileAccess.Write);
CryptoStream cs2=new CryptoStream(fs2,HighScoreFenster.RMglobal.CreateEncryptor(HighScoreFenster.RMglobal.Key,HighScoreFenster.RMglobal.IV),CryptoStreamMode.Write);
sf.Serialize(cs2,Ar);
cs2.Close();
fs2.Close();
}
Sorry läßt sich garantiert schweineschwer lesen. War aber leider schon ein ziemlich komplexes Programm (sogar mit Multi-Threading :D )
Ansonsten kann ich dir nur die Hilfe raten.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.