Tôi đang sử dụng Hibernate/Java để duy trì một thực thể cho một cơ sở dữ liệu. Pháp nhân có một trường mật khẩu là Chuỗi. Khi đăng ký một người dùng trong ứng dụng của tôi, tôi băm mật khẩu bằng SHA-1 (tôi thừa nhận đây là một chút yếu). Điều này tạo ra một byte [] mà tôi sau đó chuyển sang Chuỗi sử dụng new String(byte[] arr);
Bất cứ khi nào tôi muốn đăng nhập người dùng vào, tôi chỉ đơn giản lấy lại mật khẩu băm từ cơ sở dữ liệu (như Chuỗi) và so sánh nó với tiêu hóa của mật khẩu đầu vào lúc đăng nhập sử dụng hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
Làm thế nào để ánh xạ một thuộc tính byte [] với Hibernate?
này đã làm việc một cách hoàn hảo trên hệ thống phát triển của tôi (Windows 7, JDK 1.6.0_23/JDK 1.7, MySQL 5.5, Tomcat 6.0.26) nhưng khi triển khai nó trên máy chủ của chúng tôi (chạy JDK 1.6 trên Linux), bằng phương pháp nev er đánh giá thành TRUE ngay cả đối với mật khẩu bằng nhau. Tôi nhanh chóng thiết lập một hệ thống phát triển mới (Ubuntu 12.04, MySQL 5.5, JDK 1.7.0_03, Tomcat 7.0.22) và nó cũng không hoạt động ở đó.
Tôi biết các vấn đề mã hóa có thể được nêu trong tài liệu Java API cho lớp Chuỗi và cũng được nêu ở một số nơi ở đây trên SO. Tôi đã thử một vài mã hóa được đề xuất trên diễn đàn này (ví dụ: Base64, Latin-1) và tôi đã kết thúc với UnsupportedEncodingException. Tôi nghĩ rằng tôi sẽ tốt hơn để tránh chuyển đổi Chuỗi. Vì vậy, làm cách nào để thiết kế cơ sở dữ liệu của tôi sao cho lớp tổ chức được tạo Hibernate đi kèm với byte [] cho trường hợp mật khẩu thay vì Chuỗi?
+1, câu hỏi rất hay. Là một bên không phải là một câu trả lời cho câu hỏi của bạn, tôi đã có may mắn rất tốt bằng cách sử dụng một số tiện ích Commons Base64 đi vào và ra khỏi cơ sở dữ liệu. –
Tại sao bạn lưu trữ một chuỗi đại diện cho một số thay vì lưu trữ chính số đó? – m0skit0
Không sử dụng một vòng băm để bảo vệ mật khẩu. Sử dụng một cái gì đó như PBKDF2 hoặc bcrypt với 10s của hàng ngàn vòng --- thậm chí 100k không phải là không hợp lý. Việc lưu trữ một 'byte []' có độ dài cố định trực tiếp nên dễ dàng cho nhiều cơ sở dữ liệu hơn, nhưng bạn luôn có thể tạo một 'BigInteger' từ một mảng byte và lưu trữ nó như là một kiểu số. – erickson