2014-09-04 139 views
1

我一直試圖在android中生成唯一的密鑰對。任何人都可以告訴我爲什麼第一次調用它時爲什麼總是產生相同的鍵?Android上的唯一密鑰對生成

long ltime = System.currentTimeMillis(); 
    SecureRandom random = null; 
    random = new SecureRandom(); 
    byte[] seed = ByteBuffer.allocate(8).putLong(ltime).array(); 
    random.nextBytes(seed); 
    RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4); 
    try { 
     mKeyPairGenerator.initialize(spec, random); 
    } catch (InvalidAlgorithmParameterException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    mKeyPair = mKeyPairGenerator.generateKeyPair(); 
    mPublicKey = (PublicKey) mKeyPair.getPublic(); 
    mPrivateKey = (PrivateKey) mKeyPair.getPrivate(); 

回答

1

總是生成相同的密鑰,因爲SecureRandom與種子是確定性的並始終產生相同的結果。只是不設置種子,這可能是不安全的,你可以在參考書目讀:

播種SecureRandom的可能不安全

種子是用於啓動隨機數生成 字節數組。爲了產生密碼安全的隨機數,種子和算法都必須是安全的。

默認情況下,此類的實例將使用內部熵源(如/ dev/urandom)生成初始種子 。這個種子是不可預知的,適合安全使用的 。

只需使用一個KeyPairGenerator類:

KeyPair keys = null; 
    try { 
     RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4); 
     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
     keyGen.initialize(spec); 
     keys = keyGen.generateKeyPair(); 
    } catch (InvalidAlgorithmParameterException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 

    if(keys != null){ 
     PublicKey mPublicKey = (PublicKey) keys.getPublic(); 
     PrivateKey mPrivateKey = (PrivateKey) keys.getPrivate(); 
    } 
+0

不,每次都是一樣的鑰匙。這讓我瘋狂。 – musterjunk 2014-09-04 17:33:35

+0

它看起來非常直截了當,但我有一個單元測試,它創建並實例化了這個關鍵字,它總是一樣的。 – musterjunk 2014-09-04 17:42:28

+0

嘗試使用我更新的代碼。 – Joseph 2014-09-04 17:47:45

0

最後這個問題的答案是從充氣城堡加海綿的城堡我的應用程序。

0

我的最終解決方案是將海綿堡提供者添加到我的應用程序中。一旦我這樣做,鑰匙開始隨機。