JavaRush /Blog Java /Random-VI /Hỏi & Đáp: Tại sao lưu trữ mật khẩu trong Java trong một ...

Hỏi & Đáp: Tại sao lưu trữ mật khẩu trong Java trong một mảng ký tự thay vì Chuỗi lại tốt hơn?

Xuất bản trong nhóm
Bạn có thể nghe thấy câu hỏi như vậy trong một cuộc phỏng vấn cho vị trí Java Junior. Nhưng bạn tôi đã được hỏi điều này trong một cuộc phỏng vấn cho vị trí Trưởng nhóm Kỹ thuật.
Hỏi & Đáp: Tại sao lưu trữ mật khẩu trong Java trong một mảng ký tự thay vì Chuỗi lại tốt hơn?  - 1
Cả hai Stringvà một mảng ký tự đều có thể được sử dụng để lưu trữ dữ liệu văn bản. Nhưng việc lựa chọn cái này hay cái kia cho một nhiệm vụ cụ thể sẽ khó khăn nếu bạn chưa gặp phải tình huống tương tự. Tuy nhiên, như bạn tôi đã chỉ ra, bất kỳ câu hỏi nào liên quan đến String, thường liên quan đến một thuộc tính đặc biệt của chuỗi được gọi là tính bất biến ( Immutable), và anh ấy đã tận dụng điều này trong cuộc phỏng vấn. Vì vậy, hãy xem xét một số lý do tại sao bạn nên sử dụng char []mà không nên sử dụng để lưu trữ mật khẩu của mình String.

Lý do 1. Chuỗi là bất biến

Vì các chuỗi là bất biến trong Java nên mật khẩu văn bản đơn giản của bạn sẽ có sẵn trong bộ nhớ cho đến khi trình thu gom rác xóa nó. Và vì Stringchúng được sử dụng String poolđể tái sử dụng nên khả năng khá cao là mật khẩu sẽ tồn tại trong bộ nhớ trong một thời gian dài, điều này không hề an toàn chút nào.
Nhóm chuỗi Java là một nhóm hoặc tập hợp các đối tượng (chuỗi) được đặt ở một vị trí đặc biệt - vùng heap. Chuỗi trong Java là một trong những kiểu dữ liệu phổ biến nhất. Đây không phải là kiểu nguyên thủy mà là một đối tượng vì nó rất tốn tài nguyên. Vì vậy, để lưu trữ một chuỗi gồm bốn ký tự, bạn cần phân bổ 56 byte bộ nhớ. Đây là lý do tại sao các chuỗi, giống như các đối tượng khác, được lưu trữ trên heap.
Bất kỳ ai có quyền truy cập vào kết xuất bộ nhớ đều có thể tìm thấy mật khẩu ở dạng văn bản thuần túy, đây là lý do chính đáng để sử dụng mật khẩu được mã hóa thay vì văn bản thuần túy. Bởi vì chuỗi là bất biến nên nội dung của chúng không thể thay đổi được. Mọi thay đổi sẽ tạo ra một dòng mới. Nhưng trong trường hợp char [], bạn có thể thay thế bất kỳ phần tử nào của nó bằng 0 hoặc ký tự trống. Vì vậy, việc lưu trữ mật khẩu trong một mảng ký tự sẽ giảm rõ ràng nguy cơ bị chặn mật khẩu.

Lý do 2. Khuyến nghị của tác giả

Bản thân Java (tất nhiên là thông qua những người tạo ra nó) khuyên bạn nên sử dụng một phương thức getPassword ()từ lớp JPasswordFieldtrả về char []. Bạn cũng có thể thử phương pháp không được dùng nữa getText (). Tại sao không làm theo khuyến nghị của các tác giả ngôn ngữ?

Lý do 3. In

Với một kiểu, Stringluôn có nguy cơ là văn bản được lưu trong chuỗi sẽ được in trong tệp nhật ký hoặc trong bảng điều khiển. Đồng thời, nếu sử dụng Array, bạn sẽ không in nội dung của mảng mà chỉ in vị trí của nó trong bộ nhớ. Tất nhiên, đây không hẳn là một lý do nghiêm trọng, nhưng nó vẫn có lý.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
Tất nhiên, việc sử dụng char []Java để lưu trữ mật khẩu không phải là thuốc chữa bách bệnh. Bạn cần quan tâm đến vấn đề bảo mật, chẳng hạn như làm việc với hàm băm và mã hóa mật khẩu thay vì lưu trữ chúng ở dạng văn bản thuần túy. Và tất nhiên, hãy xóa nó khỏi bộ nhớ ngay sau thủ tục xác thực. Dựa trên các tài liệu từ Javarevisited
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION