2012-06-28 30 views
8

Tôi đang phát triển ứng dụng Android và tôi cần sử dụng java Signature class để xác thực dữ liệu.SHA256 có chữ ký RSA trả về các kết quả đầu ra khác nhau trên các thiết bị Android khác nhau

Trên mỗi thiết bị Android, tôi có thể ký dữ liệu và xác minh chữ ký của thiết bị. Tuy nhiên, với một đoạn dữ liệu nhất định để ký, một mô đun xác định, số mũ riêng xác định và số mũ công khai xác định, kết quả đầu ra của chữ ký của tôi khác nhau, tùy thuộc vào thiết bị. Tôi đã thử với nhiều thiết bị và tôi có được chữ ký tương tự cho Android 3.2 và 3.2.1, nhưng khác biệt đối với thiết bị Android 2.2.x.

Tôi tính toán chữ ký này từ các trường không đổi mà tôi đã tạo trước đó bằng cách sử dụng KeyFactory với RSA trong dự án java. Các keyize là 2048bit.

Dưới đây là trích dẫn mã tôi sử dụng cho chữ ký và xác minh hóa đơn.

public byte[] signData(byte[] data, PrivateKey privateKey) throws ... { 
     Signature signature = Signature.getInstance("SHA256withRSA"); 
     signature.initSign(privateKey); 
     signature.update(data); 
     return signature.sign(); 
} 

public boolean verifyData(byte[] data, byte[] sigBytes, PublicKey publicKey) throws ... { 
     Signature signature = Signature.getInstance("SHA256withRSA"); 
     signature.initVerify(publicKey); 
     signature.update(data); 
     return signature.verify(sigBytes); 
} 

Nếu tôi không nhầm, chữ ký sử dụng SHA256 với RSA là xác định. Vậy làm thế nào tôi có thể giải thích một hành vi như vậy? Một câu hỏi thú vị khác, làm thế nào tôi có thể làm cho các thiết bị chéo đó hoạt động, tức là chữ ký sẽ giống nhau, không có thiết bị nào tôi sử dụng?

Cảm ơn bạn trước, Franck!

+0

Mã có vẻ đúng, mặc dù việc dán trình xử lý lỗi hầu như không cần thiết. Đảm bảo khóa và dữ liệu được ký là giống nhau. –

+0

@SevaAlekseyev Vâng, tôi chắc chắn tất cả các yếu tố đầu vào của hệ thống của tôi đều giống nhau. Tôi cứng mã hóa chúng như là cuối cùng tĩnh, trong một lớp học, có chứa các hằng số. Tôi không liên kết các giá trị hằng số một cách thuận tiện. – franckysnow

+0

Gỡ lỗi từng bước. Đầu tiên, tính toán băm SHA256 trên tất cả các nền tảng đó và so sánh chúng. –

Trả lời

11

Có, SHA256withRSA là hoàn toàn xác định.

Về lý thuyết, bạn có thể bị ảnh hưởng bởi lỗi (see an example) trong phiên bản thư viện BouncyCastle đã được sửa đổi cũ được tìm thấy trên một trong các phiên bản Android. Một lỗi như vậy có thể bị loại bỏ nếu bạn sử dụng SHA512withRSA thay vào đó, tốt, ít nhất là lỗi được tham chiếu.

Tuy nhiên, trước khi bạn bắt đầu đào sâu vào thuật toán băm, hãy kiểm tra gần nhà.

Có thể bạn đã nhận được mảng byte của mình thông qua cuộc gọi đến String.getBytes. Cuộc gọi này tùy thuộc vào mã hóa nền tảng mặc định là different giữa Android 2.2 và Android 2.3. Điều này ngụ ý rằng trong khi các chuỗi của bạn giống nhau trong cả hai trường hợp, các mảng byte có thể không.

Để có được mã hóa dưới sự kiểm soát, và làm cho nền tảng mã của bạn độc lập, chỉ định mã hóa như một tham số:

plainText.getBytes("UTF-8") 

Không này, có thêm vài chiến thuật để có được một nền tảng thực hiện độc lập.

  • chờ đợi cho đến khi 2.2 với thư viện có lẽ lỗi chết ra
  • phân phối một thư viện tốt được biết đến (jar) với phần mềm của bạn. Nếu đó là BouncyCastle, bạn sẽ gặp sự cố khi đảm bảo rằng các lớp học của bạn và Android không được tải. Giải pháp này được gọi là SpongyCastle.
  • chơi với căn chỉnh/đệm. Cố gắng làm cho độ dài tin nhắn theo byte là đồng dư với 0,55, 56 hoặc 63 modulo 64 bằng cách thêm đệm cố định của riêng bạn và hy vọng rằng một trong các tùy chọn này sẽ bắt đầu cho chữ ký di động. Các giá trị này được chọn để tương tác với phần ngoài cùng của thuật toán nghi ngờ được đệm tới khối 512 bit.
+0

Cảm ơn câu trả lời của bạn Jirka. Tôi đã thay đổi 'SHA256withRSA' thành' SHA512withRSA', nhưng nó chưa sửa vấn đề. Tôi vẫn có chữ ký tương tự cho một thiết bị Android 3.2.1 và 3.2, và trình mô phỏng (2.1) vẫn nhận được một chữ ký khác. Dữ liệu nhập không phải là một 'Chuỗi' nhưng một' byte [] được mã hóa cứng. Bất kỳ ý tưởng nào khác bằng bất kỳ cơ hội nào? – franckysnow

+0

Tôi cũng nhận được kết quả tương tự như đối với 3.2.1 và 3.2 với thiết bị mô phỏng 4.0.3. – franckysnow

+1

@FranckStudiesCommEng - câu trả lời được mở rộng bằng ba tuyến đường mà tôi sẽ xem xét tiếp theo. –

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