Rozwiązanie
- MessageDigest => tworzenie nowych instancji tak często jak potrzeba
- KeyFactory => stosowanie jednolitej wspólnej wystąpienie
- SecureRandom => użyć StackObjectPool
- Cipher => użyć StackObjectPool
Pytanie
I twarz regularny dilemna podczas kodowania do bezpieczeństwa ram „na basenie lub nie połączyć”basenu czy nie połączyć usługodawców java kryptograficznych
Zasadniczo kwestia ta jest podzielona na dwie „grupy”:
Grupa 1:
SecureRandom
ponieważ połączenie z numeremnextBytes(...)
jest zsynchronizowane i może stać się wąskim gardłem aplikacji WebApp/a wielowątkowejGrupa 2: Dostawcy usług kryptograficznych, tacy jak
MessageDigest
,Signature
,Cipher
,KeyFactory
... (ze względu na kosztgetInstance()
?)
Jaka jest Twoja opinia?
Jakie są twoje przyzwyczajenia w takich pytaniach?
Edit 09/07/2013
I wreszcie znalazł czas, aby przetestować @Qwerky Share
klasę sam i uważam wynik dość ... zaskakujące.
W klasie brakowało mojej głównej uwagi: Baseny takie jak GenericObjectPool lub StackObjectPool.
więc mam przerobione klasa przetestować wszystkie 4 warianty:
- jednolitej wspólnej wystąpienie z synchronizacją gist
- nowe instancje wewnątrz każdej pętli (nie jestem zainteresowany w przypadku, gdy można wyciągnąć tworzenie trawienie poza pętlą) gist
- GenericObjectPool: gist
- StackObjectPool: gist
Musiałem zmniejszyć liczbę pętli do 100000, ponieważ 1M zabierało zbyt dużo czasu z pulami.
Dodałem również Thread.yield()
na końcu każdej pętli, aby ładunek był ładniejszy.
Wyniki (narastająco wykonania):
- MessageDigest
- nowych przypadków: 420 s
- pojedynczy przykład 550 s
- StackObjectPool: 800 s
- GenericObjectPool 1900 s
- KeyFactory
- nowych przypadków: 400S
- jednej instancji 350 s
- StackObjectPool: 2900 s
- GenericObjectPool: 3500 s
- SecureRandom
- StackObjectPool 1600 s
- nowe instancje : 2300 s
- GenericObjectPool: 2300s
- jednej instancji: 2800 s
- szyfrowania
- StackObjectPool: 2800 s
- GenericObjectPool: 3500 s
- jednej instancji: 5100 s
- nowe wystąpienia: 8000 s
Wnioski
Dla MessageDigest i KeyFactory, baseny są perf zabójcy i są jeszcze gorsze niż jednej instancji z gardłem synchronizacji, podczas gdy są one naprawdę przydatny, jeśli chodzi o SecureRandom i Cipher
Ponowne użycie sprowadza się do kompromisu między kosztami związanymi z kosztownym tworzeniem i zsynchronizowanym dostępem. Tylko Ty możesz wybrać i zależy to od Twojego profilu użytkowania. Zauważ, że nie ma różnicy między tymi dwiema grupami, musisz zsynchronizować dostęp do 'MessageDigest' itp, jeśli udostępniasz instancję między wątkami. – Qwerky
Oczywiście @Qwerky jakakolwiek opcja wymaga synchronizacji pomiędzy wątkami/blokiem użytkowania. Pytanie brzmi raczej, jak sobie z nimi radzić w swoich aplikacjach? – Cerber
To jest świetne - chciałbym, aby takie informacje były łatwiej dostępne dla wszystkich rodzajów zajęć. Naprawdę, chciałbym, żeby było w standardowym Javadoc. –