2011-01-07 42 views
5

Tôi đã xây dựng một vài dll từ nguồn. Chúng chủ yếu từ cùng một nguồn, sqlite-3.6.22, Open SSL 0.9.8 và sqlcipher.Mã hóa SQLite khác nhau giữa các nền tảng

Lý do tôi xây dựng hai là tôi cần một để làm việc với dự án C++ và một là trình điều khiển JDBC cho java (do đó, một java jni dll).

Bây giờ tôi có hai DLL, tôi có thể viết và tạo cơ sở dữ liệu trong C++ và C# (sử dụng C), và giống nhau trong java. Cả hai đáp ứng như tôi mong đợi, bạn có thể mở chúng nếu bạn cung cấp cho đúng mật khẩu, nó không thành công nếu bạn đưa ra một mật khẩu sai, vv Cả hai lý thuyết nên là mặc định cho sqlcipher, được mã hóa cứng để aes-256- cbc. Tuy nhiên, tôi không thể mở một cơ sở dữ liệu được tạo bằng một với cơ sở dữ liệu khác. Tôi có thể mở một cơ sở dữ liệu được tạo bằng phiên bản c trong SQLite3 Management studio, nhưng chỉ khi tôi đặt mật khẩu với RSA được chọn, tôi không thể mở một mật khẩu được tạo bằng java trong bất kỳ thứ gì khác mà tôi có.

Điều khác là nếu tôi tạo hai cơ sở dữ liệu với nội dung giống hệt nhau với cơ sở dữ liệu c, chúng là byte cho byte giống hệt nhau, trong khi các byte java thì không.

Tôi chắc chắn tôi đang làm điều gì đó rõ ràng sai, nhưng tôi thực sự không thể nhìn thấy nó - theo như tôi có thể thấy java đang làm việc tốt (dễ dàng hơn để gỡ lỗi vì lý do nào đó).

+0

Xin lỗi cho lỗi đánh máy khủng khiếp 'khác biệt'! – Woody

+0

Không chắc liệu câu hỏi của tôi có liên quan hay không. Bạn có thể tạo hai cơ sở dữ liệu không được mã hóa với Java là byte-cho-byte giống hệt nhau không? –

+0

Tôi đã sửa lỗi đánh máy tiêu đề của bạn! – CraigTP

Trả lời

1

Sau khi rời khỏi đây một thời gian, vì nó khá bực bội và đã quay lại với nó ngay hôm nay. Gỡ lỗi sqlite3.dll mang lại cho tôi câu trả lời.

Nếu bạn đang truy cập thông qua JDBC trong Java, bạn không có các chức năng chính cho mật khẩu byte [], vì vậy cần nhập mật khẩu qua PRAGMA key = '' trong một câu lệnh. Có vẻ như từ tài liệu này là tương đương và nếu bạn cần một khóa nhị phân, bạn hex mã hóa nó và đặt "x" ở phía trước. Vì vậy, trong java tôi đã có:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a" 

trong khi trong C# tôi đã sử dụng các chữ số nhị phân đó trong một mảng byte.

Bật ra rằng chuỗi đang được sử dụng làm mật khẩu theo nghĩa đen, mật khẩu 42 ký tự.

Vì vậy, tôi có thể tạo cơ sở dữ liệu bằng java và đọc nó trong C# và ngược lại, sử dụng các phương thức pragma hoặc key, miễn là tôi không muốn mật khẩu nhị phân mà tôi không thể sử dụng trong java.

Đoán xem tôi cần phương pháp nào!

+0

Tôi đang ở trong cùng một chiếc thuyền như bạn ngay bây giờ. Làm thế nào bạn tạo một cơ sở dữ liệu sqlite được mã hóa có thể truy cập thông qua cả JDBC và C#? –

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