2015-03-25 16 views
7

Tôi đang triển khai và công cụ mã hóa AES cho PBE trong Android và tôi đã tìm thấy hai cách để triển khai tạo IV và tôi muốn biết cái nào tốt hơn và an toàn hơn để nhận IvParameterSpec:Tạo ngẫu nhiên IV cho AES trong Java

Phương pháp # 1:

SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG"); 
byte[] iv = new byte[cipher.getBlockSize()]; 
randomSecureRandom.nextBytes(iv); 

IvParameterSpec ivParams = new IvParameterSpec(iv); 

Phương pháp # 2:

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

ivParams = new IvParameterSpec(iv2); 

Trả lời

10

Sử dụng phương pháp # 1, vì Java API quy định cụ thể sau đây cho API Cipher.init() rằng chỉ mất mã hóa/chế độ giải mã và chìa khóa:

Nếu dụ mật mã này cần bất kỳ thông số thuật toán hoặc giá trị ngẫu nhiên mà các khóa được chỉ định không thể cung cấp, việc triển khai cơ bản của mật mã này được cho là tạo các tham số bắt buộc (sử dụng nhà cung cấp của nóhoặcgiá trị ngẫu nhiên).

(tôi nhấn mạnh)

Nó cũng là minh bạch hơn những gì đang xảy ra và dễ dàng hơn trên mắt. Tuy nhiên, tôi sẽ sử dụng new SecureRandom() thay vì chỉ định một thuật toán cụ thể cho trình tạo số ngẫu nhiên. Hãy để nền tảng tìm ra cái nào là tốt nhất.

Nhìn vào mã nguồn Android, có vẻ như rằng ít nhất một số phiên bản (bao gồm cả phiên bản 21?) Sẽ không tạo ra một IV ngẫu nhiên - tạo ra IV ngẫu nhiên dường như nhận xét ra ...

+0

tôi sẽ kiểm tra nó, ngày mai , hiện tại tôi không thể. Cảm ơn bạn – user1576396

+0

tôi đã sửa đổi mã như sau: SecureRandom random = SecureRandom.getInstance (PRNG_ALGO); random = new SecureRandom(); Log.d ("generateSalt", "Thuật toán được chọn bởi SO:" + random.getAlgorithm()); Nhật ký cho thấy điều này: D/generateSalt ﹕ Thuật toán được chọn bởi SO: SHA1PRNG SO bản ngã được chọn là SHA1PRNG – user1576396

+0

Thật tuyệt vời, nhưng SHA1PRNG bị xác định là không đúng và có thể khác nhau giữa các lần triển khai. Ngay cả khi nó có sẵn nó có thể không phải là lựa chọn tốt nhất có sẵn wrt an ninh và hiệu quả. Như đã chỉ ra, tôi sẽ sử dụng hàm tạo không đối số cho 'SecureRandom' để thay thế. –