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

Für allgemeine Fragen zur Programmierung mit PureBasic.
melow
Beiträge: 32
Registriert: 04.02.2006 05:05
Wohnort: Thailand

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

Beitrag 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 :-)
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

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

Beitrag von freak »

Einmal aufrufen sollte reichen.
melow
Beiträge: 32
Registriert: 04.02.2006 05:05
Wohnort: Thailand

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

Beitrag 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 :-)
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

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

Beitrag von _sivizius »

compiler-option »Thread sicher« eingestellt?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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'.
melow
Beiträge: 32
Registriert: 04.02.2006 05:05
Wohnort: Thailand

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

Beitrag 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 :-)
Antworten