crypto api aufruf

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

crypto api aufruf

Beitrag von lycaner »

Hallo Forums Spezialisten,

ich habe eine ähnliche Frage unter Procedure create self aber dieses mal geht es auch darum den
Crypto API Aufruf zu Inegrieren, woebei ich mir nicht sicher bin ob ich das korrekt verstanden habe
http://www.lazarusforum.de/viewtopic.php?f=55&t=9441


Mein Projekt Migräne Tagebuch findet Ihr hier:
http://www.lazarusforum.de/viewtopic.php?f=17&t=9368

Ausgelagerte Procedure:

Code: Alles auswählen

 
Procedure TForm1.RunOnece_one (Sender: TObject);
var
 INI:TINIFile;
 fromMail,toMail,smtp,UserName,Passwort,port:String;
 
 Hash: TDCP_ripemd160;
    Digest: array[0..19] of byte;  // RipeMD-160 produces a 160bit digest (20bytes)
    Source: TFileStream;
    i: integer;
    s: string;
 
    j: integer;
    Cipher: TDCP_rc6;
    KeyStr: string;
 begin
 INI := TINIFile.Create('./log/crashreport.ini');
  fromMail := INI.ReadString('INIDB','from','');
  toMail := INI.ReadString('INIDB','to','');
  smtp := INI.ReadString('INIDB','smtp','');
  port := INI.ReadString('INIDB','port','');
  UserName := INI.ReadString('INIDB','User','');
  Passwort := INI.ReadString('INIDB','Password','');
 
  fromMail:='cschaer131@bluewin.ch';
  toMail:='cschaer131@bluewin.ch';
  smtp:='smtpauth.bluewin.ch';
  port:='25';
  UserName:='cschaer131';
  Passwort:='DaSiStM31NP477W0Rt';
 
  Hash:= TDCP_ripemd160.Create(Self);          // create the hash
      Hash.Init  ;
 
      Hash.UpdateStr(toMail);
      Hash.Final(Digest);                          // produce the digest
      Source.Free;
      s:= '';
      for i:= 0 to 19 do
        s:= s + IntToHex(Digest[i],2);
      KeyStr:= s;
//if InputQuery('Passphrase','Enter passphrase',KeyStr) then  // get the passphrase
    begin
      Cipher:= TDCP_rc6.Create(Self);
      Cipher.InitStr(KeyStr,TDCP_sha1);         // initialize the cipher with a hash of the passphrase
for j:= 0 to Memo1.Lines.Count-1 do       // encrypt the contents of the memo
Memo1.Lines[j]:= Cipher.EncryptString(Memo1.Lines[j]);
Passwort:=Memo1.Lines[j];
Cipher.Burn;
Cipher.Free;
    end;
 
 
    Writeln('from : '+fromMail);
    Writeln('to : '+toMail);
    Writeln('smtp : '+smtp);
    Writeln('port : '+port);
    Writeln('User : '+UserName);
    Writeln('Password : '+Passwort);
    Readln;
 end;
 
Ich möchte die INI Erstellen wobei zum ersten male soll ein standard Wert eingetragen werden
in der INI und das Passwort soll nicht klartext sein.

Aufgerufen wird diese Procedure dann wie im andrenen Post über den aufruf:

Code: Alles auswählen

RunOnece_one(self);
Wobei ich gerne bereits in der OnCreate eine auswahl zur ausführung treffen möchte und mich
frage ob das geht:

Code: Alles auswählen

 
if not FileExists('./ini/crashreport.ini') then
RunOnece_one(self);
 
Die Routine wird mir aber leider nicht ausgeführt. Und ich weis leider nicht weshalb.
Vielleicht kann mir jemand von Euch weiter Helfen.


Viele Grüsse

Chris

Source Code zum Projekt
https://github.com/lycaner/Migraene-Tag ... a49ffce97e

Warf
Beiträge: 2194
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: crypto api aufruf

Beitrag von Warf »

Relative Pfade kannst du nicht so einfach verwenden, je nach Betriebsystem wird das nichts, entweder verwendest du die CreateAbsolutePath Funktion aus der Unit FileUtil, oder du machst es einfacher mit:

Code: Alles auswählen

FileExists(ExtractFilePath(ParamStr(0))+PathDelim+'ini'+PathDelim+'crashreport.ini')
Generell ist deine Art Pfade anzugeben im Unix Stil, und ich weiß nicht in wie weit Windows das mitmacht, daher würde ich immer mit Pathdelim oder ähnlichen dingen arbeiten, um das Projekt Crossplatform zu halten

Außerdem, etwas mit einem öffentlich bekannten Schlüssel (wie der Hash der Mailadresse) zu verschlüsseln hat recht wenig Sinn, da kannst du dir die Berechnungsdauer auch sparen und es gleich unverschlüsselt lassen. Generell verstehe ich in deinem Code noch nicht so ganz wie das mit dem Verschlüsseln aussehen soll, z.B.

Code: Alles auswählen

for j:= 0 to Memo1.Lines.Count-1 do       // encrypt the contents of the memo
Memo1.Lines[j]:= Cipher.EncryptString(Memo1.Lines[j]);
Passwort:=Memo1.Lines[j];
Wird dir eine schöne Out of Bounds Exception werfen, da begin und end fehlen. Und das neusetzen des Passworts ergibt für mich absolut keinen Sinn.

Zu deinem Problem dass du das Passwort nicht lesbar in die ini schreiben möchtest, jede Verschlüsselung mit Konstantem Passwort ist unsicher, entweder du lässt den User immer ein Passwort eingeben nachdem du die Daten verschlüsselst, oder du kannst es lassen. Wenn du es einfach unleserlich machen willst kannst du das Passwort in einer Binärdatei schreiben, und jedes Byte um ein Offset rotieren lassen, z.B. -65 das verrückt einen Teil der Bytes aus dem Rahmen der Leserlichen Zeichen raus, in Steuersymbole (z.b. #00 bis #32), aber dann kannst du dafür kein Textformat wie Ini mehr verwenden, aber sicher ist das nicht


Außerdem noch einige gut gemeinte Tipps zu deinem generellen Projekt:
1. Verwende keine rar Dateien, sonder zip. Zip ist ein Bekanntes Format was nicht deutlich schlechter als rar ist, dafür von jedem geöffnet werden kann.
2. Benenne deine Units vernünftig, Unit1 bis X sind nicht sehr durchschaubar.
3. Benenne deine Controls vernünftig, Sobald ein Projekt größer wird bringen es die Namen ControlTypX mit X als Nummer nicht wirklich, richtige Namen tuen niemandem weh und verringern die Selbstmordgedanken beim Warten des Codes nach einiger Zeit oder durch Fremde um fast 90%, als Namen empfehle ich immer eine Beschreibung was das Control tut, also ein Button der deinen Rückwertssalto ausführt würde dann BackFlipButton heißen, öder ähnliches
4. Formatiere deinen Sourcecode, Lazarus hat dafür ein Tool im Package jcfidelazarus, der Hotkey ist Strg+D, sollte das Package nicht installiert sein kannst du dies über Package->Installierte Packages einrichten... in der Box Verfügbar für die Installation (die rechte) auswählen und installieren
5. Methoden die keine Lazarus Events sind müssen nicht unbedingt Public sein, und benötigen auch nicht unbedingt einen Parameter Sender, das macht nur für Ereignisse sinn, wenn man mehreren Controls eine Ereignis Prozedur zuweisen kann, wenn die Funktionen wie RunOnece_one sowieso nur durch einen expliziten Aufruf im Code angesprochen werden benötigt man einen Solchen Parameter nicht.

PS: ich entschuldige mich für meine grauenhafte Orthographie, aber es sind so viele Fehler dass sich das korrigieren auch schon nicht mehr lohnt

Antworten