2016-07-05 66 views
0

我有一個Java庫,它有一個類(ShrubSecureRandom),它使用SecureRandom生成數字,句子等。
它採用獲得Random類的方法是這樣的:如果SecureRandom無法使用,可以隨機回退嗎?

public Random getSRGInstance() { 
    Random instanceToReturn; 
    try { 
     instanceToReturn = SecureRandom.getInstance("SHA1PRNG"); 
    } catch (Exception e) { 
     System.out.println("SecureRandom algorithm not found! Reverting to INSECURE Random instance..."); 
     instanceToReturn = new Random(); 
    } 
    return instanceToReturn; 
} 

如果代碼變得異常而創建SecureRandom類(拋出:NoSuchAlgorithmException等),它會使用一個Random類來代替。
我的問題是:這是安全嗎?如果不是,我該怎麼做呢?

+3

'java.util.Random'不安全。 – ifly6

+0

@ ifiy6我知道,但該方法只使用隨機,如果SecureRandom無法訪問。 – InitializeSahib

+0

@VinceEmigh它還沒有被解決。這個try/catch塊用於沒有SHA1PRNG算法的可能錯誤。 – InitializeSahib

回答

0

根據答案中的評論,它似乎是不安全的。最好的辦法是失敗災難,投擲NoSuchAlgorithmException

+0

不要使用'System.exit':總是導致JVM退出。拋出異常 - 「NoSuchAlgorithmException」 - 並允許方法的調用者決定如何處理該問題。調用者可能有一個策略來從這個問題中恢復(我希望不是使用'Random')。 –

+1

也許包裝NSAE在一個IllegalStateException或一些這樣的(你也可能有你自己的適用例外也包裝它) – Taylor

1

如果您沒有受RNG算法的約束(例如,您在模擬遊戲中的骰子,並且想要使用比隨機更好的東西),則可以返回new SecureRandom(),它實現了Java的默認隨機數算法VM。在這種情況下,你不關心實現細節,但你保證發生器是加密強

請注意,某些用途確實需要特定算法。例如,當生成AES-256加密密鑰時,RNG必須提供至少256位的熵,而SHA1PRNG不會。