Seite 1 von 1

OpenCryptRandom() 1 x global oder jedesmal neu öffnen?

Verfasst: 21.11.2013 14:06
von melow
Hi Leute,
bin grad dabei ein Programm zu schreiben daß ein paar Stunden durchläuft und zig tausend mal CryptRandomData() aufruft...

Frage mich dabei gerade ob es auch reicht wenn ich zur Programm Initialisierung Global einmalig OpenCryptRandom() aufrufe oder ob es besser ist jedesmal:OpenCryptRandom() -> CryptRandomData() -> CloseCryptRandom() aufzurufen für die kryptografisch sicheren Pseudozufallsdaten?

aus der Doku konnt ich's nicht genau entnehmen... vermute aber daß ein Global einmaliges OpenCryptRandom() es auch tut ...

Weiß evntl. wer von Euch mehr darüber? Irgendwelche Fallstricke evntl. bei einem zeitlich lang geöffneten OpenCryptRandom() ?
Evntl. läuft mein Programm auch übere mehrere Tage inkl. potentiell mehreren System Standby's / Ruhezustände...

Danke :-)

Schöne Grüße
Melow :-)

Re: OpenCryptRandom() 1 x global oder jedesmal neu öffnen?

Verfasst: 21.11.2013 22:09
von freak
Einmal aufrufen sollte reichen.

Re: OpenCryptRandom() 1 x global oder jedesmal neu öffnen?

Verfasst: 22.11.2013 07:39
von melow
Danke für Deine Antwort. Nee hab ich dann nun auch so gemacht. Global einmalig OpenCryptRandom() aufgerufen... läuft auch alles einwandfrei.

Nur nebenbei bemerkt:
OpenCryptRandom() und CloseCryptRandom() scheinen nicht thread-safe zu sein... hatte das beim Testen mit mehreren Threads bemerkt.

Code: Alles auswählen

;not thread safe
;PB bricht ab mit einem Fehler
Procedure thread(*void=0)
  Protected *buf = AllocateMemory(1)
  Repeat
    If OpenCryptRandom()
      CryptRandomData(*buf,1)
      CloseCryptRandom()
    EndIf
  ForEver
EndProcedure

CreateThread(@thread(),0)
thread()
CryptRandomData() selbst allerdings ist (nach meinen tests zumindest) thread-safe wenn OpenCryptRandom() zuvor prozessweit einmalig aufgerufen wurde.

Code: Alles auswählen

;thread safe
OpenCryptRandom()
Procedure thread(*void=0)
  Protected *buf = AllocateMemory(1)
  Repeat
    CryptRandomData(*buf,1)
  ForEver
EndProcedure

CreateThread(@thread(),0)
thread()
(könnte man ja evntl. bei Gelegenheit in der PB Doku vermerken)

Schöne Grüße
Melow :-)

Re: OpenCryptRandom() 1 x global oder jedesmal neu öffnen?

Verfasst: 29.11.2013 21:53
von _sivizius
compiler-option »Thread sicher« eingestellt?

Re: OpenCryptRandom() 1 x global oder jedesmal neu öffnen?

Verfasst: 29.11.2013 23:05
von NicTheQuick
Die "Thread safe"-Option ist hauptsächlich für Strings wichtig. Bei anderen Funktionen habe ich da noch keinen Vorteil bemerkt.
Aber ich nehme auch an, dass 'OpenCryptRandom()' eine globale Funktion ist, also man kann in einem Thread 'Open...' und in einem anderen 'Close...' machen, was natürlich keine besonders saubere Sache wäre und vor allem eine große Fehlerquelle. Wenn dann müsste man das jedes mal mit Mutex absichern, und zwar den kompletten 'Open'-'Close'-Block und nicht etwa jedes 'Open' und 'Close' einzeln.
Weiterhin macht es für mich auch irgendwie keinen Sinn mehrmals 'Open' und 'Close' in einem Programm zu nutzen. Einmal am Anfang und einmal am Ende reicht doch vollkommen. Da die Zufallswerte kryptografisch sicher sind, sind sie das immer und nicht nur direkt nach jedem 'Open'.

Re: OpenCryptRandom() 1 x global oder jedesmal neu öffnen?

Verfasst: 30.11.2013 05:52
von melow
Moin Leute

@_sivizius: Jo, Compiler-Threadsafe Checkbox war aktiviert.
Aber ich nehme auch an, dass 'OpenCryptRandom()' eine globale Funktion ist
Jo. Ich auch. Ansonsten müsste sie (glaub ich) einen #PB_Any Parameter erwarten der das OpenCryptRandom() für die weiteren Aufrufe identifiziert.
also man kann in einem Thread 'Open...' und in einem anderen 'Close...' machen, was natürlich keine besonders saubere Sache wäre und vor allem eine große Fehlerquelle.
Genau. Da bin ich drüber gestolpert auch gleich :-) Habs aber dann auch gleich gemerkt daß OpenCryptRandom() Global arbeitet.
Wenn dann müsste man das jedes mal mit Mutex absichern, und zwar den kompletten 'Open'-'Close'-Block und nicht etwa jedes 'Open' und 'Close' einzeln.
Genau. Hatte das zuerst dann auch gemacht. Funzte danach dann auch. Aber ich wollte auch nicht jedesmal (Un)LockMutex() machen... tat mir irgendwie das Betriebssystem leid :-)
Da die Zufallswerte kryptografisch sicher sind, sind sie das immer und nicht nur direkt nach jedem 'Open'.
Da war ich ich mir eben nicht so ganz sicher ob eben die Zufälligikeit beinträchtigt wird oder nicht. Aber ich was bisher nachrecherchiert haben ist die Sicherheit der Zufälligkeit bei einem global Open() nicht beinträchtigt.

Aufpassen muss man aber dennoch, so oder so, im Falle wenn man PB-Libs/DLLs bzw. 3rd Party PB-Code includiert/benützt die ebenfalls OpenCryptRandom()/CloseCryptRandom() verwenden daß man sich nicht gegenseitig überschneidet mit diesen 2 Aufrufen.

Aufjedenfall geht ein einmaliges globales OpenCryptRandom() einwandfrei, die anderen Aufrufe wie zB CrytRandomData() sind dann auch Threadsafe, und die Zufälligkeit der Daten scheinen auch nicht beinträchtigt zu sein wenn man es so benützt... hab die Entropy der Zufallsdaten gemessen innerhalb 100 gleichzeitig laufender Threads... eine Stunde lang. War immer einwandrei.


lg Melow :-)