Durch das Forum lesen, scheint es, dass die SecureRandom
Thread sicher ist, aber es in Multi-Threaded-Systemen wegen Konkurrenz zu kämpfen, siehe Is SecureRandom thread safe? . Auch die Initialisierung eines neuen SecureRandom
ist eine teure Operation. Ein Vorschlag zur Verbesserung der Leistung ist die Verwendung von ThreadLocalRandom.SecureRandom: Thread sicher ohne Konkurrenz und immer noch kryptographisch sicher?
Also änderte ich meinen Code aus:
SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
zu:
private final ThreadLocalRandom randomThreadLocal = ThreadLocalRandom.current();
ich einige Tests haben - 100 Läufe für 10000 String-Werte zu verschlüsseln, und ich kann deutliche Verbesserung sehen.
**With ThreadLocalRandom**
Thread #18New encryption service took on average: 66.44ms.
Thread #17New encryption service took on average: 64.79ms.
Thread #14New encryption service took on average: 70.77ms.
Thread #13New encryption service took on average: 72.33ms.
Thread #19New encryption service took on average: 73.42ms.
Thread #15New encryption service took on average: 74.21ms.
Thread #11New encryption service took on average: 76.79ms.
Thread #16New encryption service took on average: 78.72ms.
Thread #12New encryption service took on average: 78.95ms.
Thread #20New encryption service took on average: 78.99ms.
**With SecureRandom**
Thread #19New encryption service took on average: 87.26ms.
Thread #18New encryption service took on average: 93.65ms.
Thread #13New encryption service took on average: 93.1ms.
Thread #15New encryption service took on average: 95.81ms.
Thread #16New encryption service took on average: 96.9ms.
Thread #11New encryption service took on average: 97.0ms.
Thread #20New encryption service took on average: 94.93ms.
Thread #17New encryption service took on average: 96.63ms.
Thread #12New encryption service took on average: 97.41ms.
Thread #14New encryption service took on average: 99.08ms.
Es scheint, dass ich auf jeden Fall die Geschwindigkeit hier verbessert, jedoch verschlechtert ich die Sicherheit, weil es die ThreadLocalRandom scheint nicht kryptographisch sicher:
* <p>Instances of {@code ThreadLocalRandom} are not cryptographically
* secure. Consider instead using {@link java.security.SecureRandom}
* in security-sensitive applications
Meine Frage ist - ist es eine Möglichkeit, kryptographisch sicher zu schaffen Zufallszahl, die threadsicher ist und in einem Multithread-System gut funktioniert?
Es gibt eine weitere Frage zu diesem Thema zu berühren, aber die Antwort darauf hindeutet, den gleichen Übergang von SecureRandom
->ThreadLocalRandom
, die sehen Minimizing SecureRandom performance problems in multithreaded environment? nicht kryptografisch sicher ist.
Wie viele Threads müssen die zufällige verwenden? Ich weiß, dass Sie gesagt haben, dass das Erstellen eines 'SecureRandom' teuer ist. Dennoch möchten Sie vielleicht messen, ob das Erstellen eines einzelnen Threads am Ende ein schnelleres Ergebnis liefert, weil es keine Konkurrenz gibt. –
Es gibt andere Möglichkeiten, Zufallswerte zu generieren, d.Durch die Verwendung von Hardware, das Hören des Geräuschhintergrunds eines Mikrofons oder die Verwendung eines externen Magnetometers kann man auch zufällige Daten aus dem Internet herunterladen, jedoch ist es sehr unwahrscheinlich, dass diese Methoden in einer Multithread-Umgebung schneller und effektiver sind. Ich schlage vor, bei "SecureRandom" zu bleiben und sicherzustellen, dass Sie dieselbe Instanzinstanz unter mehreren Threads wiederverwenden und einfach die '.nextBytes (..)' Funktion aufrufen. Am Ende, wenn Sie kryptografisch starke Werte wollen, müssen Sie dafür Leistung zahlen. – cristianhh
Sie haben also ungefähr 30 ms pro Anruf gespeichert. Das ist kaum eine große Veränderung, wird das in der Gesamtleistung von Bedeutung sein? Möchten Sie sichere Zufallszahlen oder nur Zufallszahlen? – john16384