2012-10-05 14 views
1

我有幾天讀這篇文章,大約javax.crypto中的其他教程
Using block modes and initialisation vectors in Java我怎樣才能最好地保護IV和密鑰密碼,在此javax.crypto中的服務器客戶端

下面我的測試代碼是一個客戶端誰將數據發送到服務器。

我讀了關於不同的塊模式和CFB8流模式似乎工作,因爲我分割任意大小的文件。除了最後一個較小的塊以外,每個塊都是0.5MB,它們會一個接一個地發送到將文件放回在一起的服務器。

我有幾個問題:

1)我應該使用非對稱加密公佈/私法鍵發送SecretKeySpec密碼和IV到服務器之前,我開始轉移?

2)用於保護IV的SecretKeySpec密碼是什麼?

客戶端加密數據

Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding"); 
SecretKeySpec keySpec = new SecretKeySpec("password12345678".getBytes(), "AES"); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec); 

AlgorithmParameters params = cipher.getParameters(); 
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 

out.write(iv); //Send IV to Server 
out.flush(); 

// THE ENCRYPTET STREAM 
cos = new CipherOutputStream(out, cipher); 

while ((val = byteArrayInputStream.read(buffer, 0, 1024)) > 0) { 
     cos.write(buffer, 0, val); 
     cos.flush(); 
} 

cipher.doFinal() 

THE SERVER解密數據

byte[] iv = new byte[16]; 
    in.read(iv); 

    Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding"); 
    SecretKeySpec keySpec = new SecretKeySpec("password12345678".getBytes(), "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); 

    cos = new CipherInputStream(in, cipher);   

    while (offset < tmpBuffer.length && (numRead=cos.read(tmpBuffer, offset,  tmpBuffer.length-offset)) >= 0) { 
     offset += numRead; 
     savedFileSize = savedFileSize + numRead; 
    }  
    // CREATE HASH FROM THE DOWNLOAD CHUNK PART 
    String retCrC = DoEncryption.getCRC32ChecksumFromArray(tmpBuffer); 
    String hash2 = Long.toHexString(Long.parseLong(retCrC)); 

    // TEST SO THE REMOTE HASH MATCH THE LOCAL HASH 
    if(!hash1.equals(hash2)){ 
    ... 

回答

1

我應該使用非對稱加密公共區域/ PRIV鍵發送SecretKeySpec密碼和IV至服務器在我開始傳輸之前?

這大體上是SSL如何工作的,儘管通常是相反的。任何你無法使用SSL/TLS的原因?生成您自己的安全傳輸協議並不是一件小事。

+0

是的,你的權利SSL來想到它。此代碼現在正在生產中名爲SPRiiD的Android應用程序中。我想先試試這個CipherOutputStream,以便了解一些東西是如何工作的,然後深入SSL – Erik

+1

@Erik你應該閱讀Java的Beginning Cryptography。這是王牌。 –

+0

感謝愛它,但沒有足夠的時間去那麼深。如果我現在切換到SSL,可以推薦一些適用於Android SSL的教程。不是在談論自簽名證書。我意識到這個話題是巨大的,也許SSL與CA更容易 – Erik

1

通常一個人通過將其包含在HMAC中來保護IV。

+0

是的Hmac是我的想法。那我的問題:2呢? – Erik

0

爲了保護我簡單的代碼,可以使用SSL/TSL。

得到的一切使用從博客這裏自簽名證書的SSL/TSL工作:
@Marcus Krantz's blog Creating iself-signed certificates

我必須說,這不是一件輕鬆的事情.. :)

順便說一句,這是真的只有bcprov-jdk15on-146工作,而不是bcprov-jdk15on-147使用keytool作爲* .bks文件時?

相關問題