Tạo sao char[] được sử dụng để thao tác với password thay vì String

Gần đây mình có hướng dẫn một cách gửi email sử dụng gmail của google, mình dùng thư viện Java Mail với phiên bản rất cũ. Lúc này ở bước truyền username/password để nó tiến hành xác thực với google đều ở dạng String. Tuy nhiên có một số bạn lại báo lỗi với mình là đang bị lỗi vì thư viện bắt buộc truyền dữ liệu cho password là một mảng char[] thay vì String như trước đây.

Điều gì khiến nhà phát triển Java Mail chuyển đổi cách thức truyền dữ liệu cho password vậy? Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu tại sao người ta lại làm như vậy.

Tại sao sử dụng chart[] để thao tác với password

Đầu tiên, xin hãy lưu ý rằng chúng ta chỉ tập trung vào cách thao tác với mật khẩu trên memory, không cần quan tâm đến cách chúng được lưu xuống database thế nào, và thường công việc này được xử lý ở tầng persistence.

Nếu các bạn đã từng học qua lập trình Java swing và sử dụng JPasswordField control để tạo ô nhập mật khẩu cho người dùng thì có thể dễ dàng thấy rằng method getText() trả về String đại diện cho password mà người dùng đã nhập đã bị deprecated từ phiên bản Java 2 và nó được thay thế bởi getPassword() trả về mảng char[].

Dưới đây là một số lý do để lý giải tại sao cần làm như vậy

String Immutable

String trong Java có tính chất immutable nghĩa là chúng ta không thể thay đổi giá trị của chúng sau khi đã khởi tạo. Bất hành động nào thực hiện thay đổi trên String object đều sẽ tạo ra một String mới và giá trị cũ vẫn được giữ trên memory.

Chính vì điều này, password được lưu trữ trong String sẽ vẫn còn tồn tại cho đến khi trình dọn rác tiến hành thu gom. Chúng ta sẽ không thể kiểm soát hoặc biết trước khi nào nó sẽ bị xóa khỏi memory, nhưng thông thường nó sẽ tốn một khoảng thời gian khá lâu vì String được dùng cho mục đích tái sử dụng.

Bằng việc sử dụng mảng char[] thay thế String chúng ta có quyền xóa dữ liệu sau khi đã hoàn thành công việc. Bằng cách này, chúng ta sẽ đảm bảo rằng password sẽ bị xóa khỏi memory mà không cần chờ đến quá trình thu gom rác diễn ra.

In password một cách tình cờ

Chúng ta đều biết rằng password là một dữ liệu cần được bảo mật và không nên tiết lộ trong bất kỳ tình huống nào. Vì vậy việc in password ra màn hình console hoặc log-file là một việc hết sức nguy hiểm. Bằng cách sử dụng char[] cho dù chúng ta có vô tình in password ra thì dữ liệu vẫn đảm bảo an toàn vì giá trị được in ra khác hoàn toàn so với password thật sự.

String passwordString = "password";
char[] passwordArray = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
System.out.println("Printing String password -> " + passwordString);
System.out.println("Printing char[] password -> " + passwordArray);

Output

Printing String password -> password
Printing char[] password -> [C@6e8cf4c6

Tóm lược

Như vậy chúng ta đã biết được lý do chính người ta lại sử dụng char[] thay cho String khi thao tác với password là vì vấn đề bảo mật. Sử dụng char[] sẽ giúp password khó bị lộ hơn so với String, không những với password mà đối với những dữ liệu nhạy cảm thì chúng ta cũng nên sử dụng char[] thay cho String như mã sô thẻ ngân hàng, CMND v.v

Nguồn tham khảo

https://www.baeldung.com/java-storing-passwords

https://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x