2016-05-26 2 views
0

0-255の範囲で高度に保護された乱数を生成し、しかも高速なパフォーマンスで最も良い方法を教えてください。確かに私はSecureRandomクラスを使用する必要がありますが、もし私が.getInstance(SHA1PRNG)を使用しなければならないかどうかわからないか、引数なしのコンストラクタでデフォルトにする方が良いです。SecureRandomクラスを使用してJavaで乱数を生成する最も安全な方法を決定する方法

私は、これらの二つの選択肢の間で午前:

まず道

public class RandomGenerator { 

    private static final String sha1prng = "SHA1PRNG"; 

    private final SecureRandom csprng; 
    private final byte[] bytes = new byte[1]; 

    public RandomGenerator() { 
     try { 
      csprng = SecureRandom.getInstance(sha1prng); 
     } catch (NoSuchAlgorithmException e) { 
      throw new RuntimeException(e); 
     } 
     csprng.nextBoolean(); 
    } 



    protected int generateByte() { 
     do { 
      csprng.nextBytes(bytes); 
     } while (bytes[0] == 0); 

     return ((byte)(bytes[0] & 0xff) + 256) % 256; 
    } 

    } 

Secondway:

public class SomethingThatNeedsRandomBytes { 

    private static final int NUMBER_OF_RANDOM_BYTES = ... ; 

    private final SecureRandom csprng; 

SomethingThatNeedsRandomBytes(SecureRandom csprng) { 
    if (csprng == null) 
    throw new IllegalArgumentException(); 

    this.csprng = csprng; 

    } 

    void doSomethingInvolvingRandomness() { 
    byte[] bytes = new byte[NUMBER_OF_RANDOM_BYTES]; 
    csprng.nextBytes(bytes); 
// Do something with random bytes here. 
    } 
    } 

私は、このサイトで他の回答をたくさん見てきたそれらのほとんどはない示唆しますSHA1PRNGを使用してデフォルトにしますが、他のいくつかの答えはNativePRNG(高速ではないので好きではない)やSHA1PRNGを使用することを示唆しています。私はどの方法が高い安全な乱数を生成し、どちらが最速のものであるかのフィードバックを得たいと思います。

ありがとうございます。

+0

あなたは本当に決定する方法を求めて、あるいは答えがあるだけで何していますか? – EJP

+0

@ EJPそれを決める方法を知りたいですか?ベンチマークやSystem.nanoTime()を使用してスピード性能テストを行うことができますが、どちらがより安全であるかを判断する方法はわかりません。 –

答えて

0

SecureRandomは、空のコンストラクタを使用して、SecureRandomアルゴリズムをサポートする最初に登録されたセキュリティプロバイダを選択します。存在しない場合、これはデフォルトでSHA1PRNGになります。これはシステムによって異なります。アプリケーションが異なる環境で実行される場合は、コンストラクタでアルゴリズムを指定する必要があります。 SecureRandomのためのセキュリティプロバイダの順序を取得するには、次の操作を実行できます。

import java.security.Security; 
import java.security.Provider; 
import java.security.Provider.Service; 

for (Provider provider : Security.getProviders()) { 
    for (Service service : provider.getServices()) { 
     if (service.getType().equals("SecureRandom")) { 
      System.out.println(service.getAlgorithm()); 
     } 
    } 
} 

NativePRNGの実装は、オペレーティング・システムによって異なりますが、一般的にランダムな値を生成するために、ハードウェアまたはオペレーティングシステムのイベントによって生成されたエントロピーを使用しています。しばしば、これは値が返される前にエントロピーが生成されるのを待たなければなりません。絶対的に言えば、これはSHA1PRNGよりも安全です。しかし、実際には違いを気付かれることはまずありません。アプリケーションのアルゴリズムの速度が重要な場合、SHA1PRNGは一般的にNativePRNGより高速であり、どちらのアルゴリズムも暗号操作に十分なランダム値を提供します。パスワードハッシングなどのアプリケーションでは、通常、より低速のアルゴリズムが好まれることに注意してください。

参照してください:https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html#SecureRandom--

+0

D.Holland本当に感謝しています。それは本当に私のために役立った。私はShamirSecretSharingスキームを使用しています。このスキームでは、ファイルの各バイトに適用する必要があります。ファイルにGbとNativePRNGを使用すると、ファイルを共有して再構築するのに多くの時間がかかります。私の操作は、最も効率的なGF(256)に基づいており、乗数を減らす多項式を評価するためにHornerのルールを使用しています。 SHA1PRNGを使用すれば、十分に安全だと思いますか?私が求めている理由は、私がより安全であることを証明する方法が見つからないからです –

関連する問題