2012-06-26 27 views
6

Tôi đang thử nghiệm bật FIPS 180-3 trên ứng dụng java của mình. FIPS 180-3 chỉ cho phép sử dụng 5 [băm] an toàn (http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf), MD5 không phải là một trong số chúng. Do đó tôi đang cố gắng để loại bỏ chương trình thuật toán MD5 từ nhà cung cấp Sun. Đây là mã mẫu.Tại sao MD5 là bắt buộc để khởi tạo JCE


public static void main(String[] args) throws Exception { 
    Security.removeProvider("SUN"); 
    Sun sun = new Sun(); 
    sun.remove("MessageDigest.MD5"); //Comment and it will work !!! 
    Security.addProvider(sun); 
    Cipher ciph = Cipher.getInstance("AES");     
} 

Nhưng điều này là ném ngoại lệ sau. Nếu bạn bình luận "sun.remove (.." chương trình hoạt động tốt. Nếu tôi xóa MD2, thay vì MD5 thì nó cũng hoạt động tốt.

Với tôi có vẻ như các thư viện jre đang sử dụng MD5 để ký, nhưng i kiểm tra jre/lib/ext/người ký sunjce_provider.jar và sử dụng sha1 của nó.

Bất cứ ý tưởng tại sao mã của tôi là không có lỗi này?

Exception in thread "main" java.lang.ExceptionInInitializerError tại javax .crypto.Cipher.getInstance (DashoA13 * ..) tại TestRemoveMD5.main (TestRemoveMD5.java:20)

Nguyên nhân: java.lang.SecurityException:. Không thể thiết lập Certs cho tin cậy CA tại javax.crypto.SunJCE_b (DashoA13 * ..) ... thêm 3

Nguyên nhân: java.lang.SecurityException: Các lớp chữ ký đã bị giả mạo với số tại javax.crypto.SunJCE_b.d (DashoA13 * ..) tại javax.crypto.SunJCE_b.c (DashoA13 * ..) tại javax.crypto.SunJCE_b $ 1.run (DashoA13 *. .) tại java.security.AccessController.doPrivileged (Phương pháp Gốc) ... 4 thêm

+0

Bạn đã xóa tất cả chứng chỉ từ cửa hàng tin cậy JRE sử dụng hàm băm MD5 chưa? – Robert

+0

Tôi đang sử dụng một jdk mới 1.6 –

+0

Sau đó, bạn phải xóa chứng chỉ đã từng sử dụng MD5 khỏi kho lưu trữ tin cậy của JRE. – Robert

Trả lời

1

Đây là tính năng bảo mật ngăn mã không đáng tin cậy xóa nhà cung cấp Sun. Có một cách để làm điều đó liên quan đến việc có quyền thích hợp để làm như vậy. Nếu bạn đi đến liên kết này http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html và cuộn xuống tiêu đề Lớp bảo mật bạn có thể đọc về cách xóa nhà cung cấp và điều gì sẽ xảy ra.

EDIT

Trích từ các tài liệu mà đi qua đó các nhà cung cấp được cài đặt mà không phải là phần mở rộng có thể bù lại một tệp chính sách để thực hiện các hành động nhất định chẳng hạn như thêm và loại bỏ các nhà cung cấp. Đáng thử.

Tài liệu từ nhà cung cấp của từng nhà cung cấp mà bạn sẽ sử dụng phải bao gồm thông tin về quyền cần thiết và cách cấp quyền như vậy. Ví dụ, các điều khoản sau đây có thể là cần thiết bởi một nhà cung cấp nếu nó không phải là một phần mở rộng được cài đặt và quản lý bảo mật được cài đặt

-

Lớp An ninh quản lý cung cấp dịch vụ và an ninh toàn cài đặt tính chất. Nó chỉ chứa các phương thức tĩnh và không bao giờ được khởi tạo. Các phương thức để thêm hoặc xóa các nhà cung cấp, và để thiết lập các thuộc tính bảo mật, chỉ có thể được thực hiện bởi một chương trình đáng tin cậy.Hiện nay, một "chương trình tin cậy" là một trong hai

  • một ứng dụng địa phương không chạy theo một người quản lý an ninh, hoặc
  • một applet hay ứng dụng với sự cho phép để thực hiện các phương pháp quy định (xem dưới đây).

Xác định mã được coi là đáng tin cậy để thực hiện hành động cố gắng (chẳng hạn như thêm nhà cung cấp) yêu cầu applet được cấp quyền thích hợp cho hành động cụ thể đó.

-

Mỗi "cấp" tuyên bố trong một file như cấp một mã nguồn xác định một tập các điều khoản quy định cụ thể những hành động được cho phép.

Đây là một mẫu tập tin cấu hình chính sách:

grant codeBase "file:/home/sysadmin/", signedBy "sysadmin" { 
    permission java.security.SecurityPermission "insertProvider.*"; 
    permission java.security.SecurityPermission "removeProvider.*"; 
    permission java.security.SecurityPermission "putProviderProperty.*"; 
}; 
+0

Tôi không nghĩ rằng đây là trường hợp kể từ khi tôi có thể loại bỏ/thêm nhà cung cấp với ra bất kỳ vấn đề với ra loại bỏ MD5. Ngoài ra tôi có thể loại bỏ MD2 từ nhà cung cấp mặt trời với bất kỳ vấn đề. Chỉ khi tôi loại bỏ MD5 tôi nhận được lỗi này. Đó là lý do tại sao tôi tự tin rằng vấn đề là với MD5. –

+0

Tôi tin rằng dấu vết ngăn xếp cuối cùng được đăng trên câu hỏi của bạn giữ chìa khóa cho câu trả lời của bạn. Có điều gì đó không cho phép bạn loại bỏ nhà cung cấp cụ thể đó. –

+0

Tôi đang xóa, sửa đổi và thêm nhà cung cấp đó và tôi có thể làm điều đó cho đến khi tôi không xóa MD5. –

0

Tôi đoán tôi có thể đã tìm ra nguyên nhân gốc rễ, nhưng vẫn coudn't tìm ra từ nơi đến của nó. Tôi đã cố gắng để gỡ lỗi X509CertImpl và tôi đã nhận một giấy chứng nhận ký kết "Phát triển JCE" đang sử dụng MD5. Nhưng tất cả các chứng chỉ khác được nạp đã được ký chính xác bằng SHA1withDSA. Tôi không chắc chắn nếu điều này nên là một lỗi trên jre.

[ [ Version: V1 Subject: CN = Phát triển JCE, OU = Java Phần mềm, O = Sun Microsystems, L = Cupertino, ST = CA, C = US Chữ ký Algorithm: MD5withRSA, OID = 1.2. 840.113549.1.1.4

chính: Sun RSA khóa công khai, 512 bit mô đun: 9182591386680323574119504178341234548416270629561070323164514737894957593991212767744352158438329809500219147803751143974067780130174290713135793698837217 mũ công cộng: 65.537 Hiệu lực: [Từ: Thu 31 tháng 10 20:57:44 IST 2002, Để: Wed 31 tháng 10 20:57:44 IST 2007] Nơi cấp: CN = Phát triển JCE, OU = Java Phần mềm, O = Sun Microsystems, L = Cupertino, ST = CA, C = US serialNumber: [02]

] Thuật toán: [MD5withRSA] Chữ ký: 0000: 2F E5 9C 54 5C A3 FA 25 E5 11 53 55 41 B3 4E 39 /..T..%..SUA.N9 0010: 49 56 9A 59 97 1A 23 4A 29 79 C8 74 D7 1C D5 95 IV .Y .. # J) yt ... 0020: 32 8B E2 56 D3 39 A5 7D 9E E2 53 F7 91 62 11 04 2..V.9 .... S..b .. 0030: 24 1C 1D AD 4A 32 88 63 86 2E 8E E9 8B A2 73 00 $ ... J2.c ...... s.

]

+1

Bạn có chứng chỉ bằng MD5 và bạn đã xóa thuật toán MD5. Làm cho tôi không có thắc mắc tại sao bạn nhận được một ngoại lệ. Xem lib/security/cacerts. mật khẩu của kho khóa là "thay đổi". – Robert

+0

Không phải từ cacerts. –

0

Vì vậy, suy luận của tôi từ bài tập này là vì JCE bản thân cần MD5 để xác minh các lớp học của nó cho các mục đích ký kết, chúng ta không thể loại bỏ thuật toán MD5 từ jre và do đó JRE 1.6 chính nó không thể được thực hiện FIPS 180-3 khiếu nại .

C# trong FIPS không thể tải MD5. Tham khảo Is there an alternate hashing algorithm to MD5 for FIPS-enabled systems?. Với bài kiểm tra trên tôi đoán java không thể làm điều đó hành vi.

Hãy cho tôi biết nếu có ai đó phản đối hoặc quan sát thấy bất kỳ sai lầm rõ ràng nào mà tôi có thể đã bỏ qua.

Các vấn đề liên quan