Hướng dẫn how does mysql hash passwords? - mật khẩu băm mysql như thế nào?

6.1.2.4 & nbsp; mật khẩu băm trong MySQL

Ghi chú

Thông tin trong phần này chỉ áp dụng cho các tài khoản sử dụng các plugin xác thực mysql_native_password hoặc mysql_old_password.

MySQL liệt kê các tài khoản người dùng trong bảng user của cơ sở dữ liệu mysql. Mỗi tài khoản MySQL có thể được gán một mật khẩu, mặc dù bảng user không lưu trữ phiên bản Cleartext của mật khẩu, nhưng giá trị băm được tính toán từ nó.

MySQL sử dụng mật khẩu trong hai giai đoạn giao tiếp máy khách/máy chủ:

  • Khi khách hàng cố gắng kết nối với máy chủ, có một bước xác thực ban đầu trong đó máy khách phải trình bày mật khẩu có giá trị băm phù hợp với giá trị băm được lưu trong bảng user cho tài khoản mà máy khách muốn sử dụng.

  • Sau khi khách hàng kết nối, nó có thể (nếu nó có đủ đặc quyền) đã đặt hoặc thay đổi mật khẩu băm cho các tài khoản được liệt kê trong bảng user. Máy khách có thể làm điều này bằng cách sử dụng chức năng

    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    3 để tạo băm mật khẩu hoặc bằng cách sử dụng câu lệnh tạo mật khẩu (
    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    4,
    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    5 hoặc
    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    6).

Nói cách khác, máy chủ kiểm tra các giá trị băm trong quá trình xác thực khi máy khách lần đầu tiên cố gắng kết nối. Máy chủ tạo ra các giá trị băm nếu máy khách được kết nối gọi hàm

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
3 hoặc sử dụng câu lệnh tạo mật khẩu để đặt hoặc thay đổi mật khẩu.checks hash values during authentication when a client first attempts to connect. The server generates hash values if a connected client invokes the
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
3 function or uses a password-generating statement to set or change a password.

Các phương thức băm mật khẩu trong MySQL có lịch sử được mô tả sau đây. Những thay đổi này được minh họa bằng các thay đổi trong kết quả từ hàm

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
3 tính toán các giá trị băm mật khẩu và trong cấu trúc của bảng user nơi lưu trữ mật khẩu.

Phương thức băm bản gốc (trước 4,1)

Phương pháp băm ban đầu tạo ra một chuỗi 16 byte. Những băm như vậy trông như thế này:

mysql> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e   |
+--------------------+

Để lưu trữ mật khẩu tài khoản, cột

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 của bảng user tại thời điểm này dài 16 byte.

Phương pháp băm 4.1

MySQL 4.1 đã giới thiệu mật khẩu băm cung cấp bảo mật tốt hơn và giảm nguy cơ mật khẩu bị chặn. Có một số khía cạnh cho sự thay đổi này:

  • Định dạng khác nhau của các giá trị mật khẩu được tạo bởi hàm

    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    3

  • Mở rộng cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0

  • Kiểm soát phương thức băm mặc định

  • Kiểm soát các phương thức băm được phép cho máy khách đang cố gắng kết nối với máy chủ

Những thay đổi trong MySQL 4.1 đã diễn ra trong hai giai đoạn:

  • MySQL 4.1.0 đã sử dụng phiên bản sơ bộ của phương thức băm 4.1. Phương pháp này đã tồn tại ngắn và các cuộc thảo luận sau đây không nói gì thêm về nó.

  • Trong MySQL 4.1.1, phương pháp băm đã được sửa đổi để tạo ra giá trị băm 41 byte dài hơn:

    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+

    Định dạng băm mật khẩu dài hơn có các thuộc tính mật mã tốt hơn và xác thực máy khách dựa trên các băm dài an toàn hơn so với các băm ngắn cũ hơn.

    Để phù hợp với các băm mật khẩu dài hơn, cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 trong bảng user đã được thay đổi tại thời điểm này thành 41 byte, độ dài hiện tại của nó.

    Cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 được mở rộng có thể lưu trữ các băm mật khẩu ở cả hai định dạng Pre-4.1 và 4.1. Định dạng của bất kỳ giá trị băm nào có thể được xác định theo hai cách:

    • Độ dài: 4,1 và băm trước 4,1 lần lượt là 41 và 16 byte.

    • Các băm mật khẩu ở định dạng 4.1 luôn bắt đầu bằng ký tự

      $> mysql -h localhost -u root
      Client does not support authentication protocol requested
      by server; consider upgrading MySQL client
      7, trong khi mật khẩu ở định dạng Pre-4.1 không bao giờ làm.

    Để cho phép tạo ra các băm mật khẩu trước 4,1, hai thay đổi bổ sung đã được thực hiện:

    • Hàm

      $> mysql -h localhost -u root
      Client does not support authentication protocol requested
      by server; consider upgrading MySQL client
      8 đã được thêm vào, trả về các giá trị băm ở định dạng 16 byte.

    • Đối với mục đích tương thích, biến hệ thống

      $> mysql -h localhost -u root
      Client does not support authentication protocol requested
      by server; consider upgrading MySQL client
      9 đã được thêm vào, để cho phép DBA và các ứng dụng kiểm soát phương thức băm. Giá trị
      $> mysql -h localhost -u root
      Client does not support authentication protocol requested
      by server; consider upgrading MySQL client
      9 mặc định là 0 Nguyên nhân băm sử dụng phương thức 4.1 (giá trị băm 41 byte), nhưng cài đặt
      mysql> SET @@SESSION.old_passwords = 0;
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
      +-------------------------+------------------------+
      | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
      +-------------------------+------------------------+
      |                       0 |                      1 |
      +-------------------------+------------------------+
      1 row in set (0.00 sec)
      
      mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
      Query OK, 0 rows affected (0.03 sec)
      
      mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
      Query OK, 0 rows affected (0.00 sec)
      1 gây ra băm để sử dụng phương thức pre-4.1. Trong trường hợp này,
      mysql> SELECT PASSWORD('mypass');
      +-------------------------------------------+
      | PASSWORD('mypass')                        |
      +-------------------------------------------+
      | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
      +-------------------------------------------+
      3 tạo ra các giá trị 16 byte và tương đương với
      $> mysql -h localhost -u root
      Client does not support authentication protocol requested
      by server; consider upgrading MySQL client
      8

    Để cho phép kiểm soát DBA về cách khách hàng được phép kết nối, biến hệ thống

    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    4 đã được thêm vào. Khởi động máy chủ với biến đã bị vô hiệu hóa hoặc được bật giấy phép hoặc cấm máy khách kết nối bằng phương thức băm mật khẩu trước 4 tuổi cũ hơn. Trước MySQL 5.6.5,
    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    4 bị tắt theo mặc định. Tính đến 5.6.5,
    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    4 được bật theo mặc định để quảng bá một cấu hình mặc định an toàn hơn DBA có thể vô hiệu hóa nó theo quyết định của chúng, nhưng điều này không được khuyến nghị và các băm mật khẩu trước 4,1 được không dùng nữa và nên tránh. .

    Ngoài ra, máy khách MySQL hỗ trợ tùy chọn

    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    7 tương tự như
    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    4, nhưng từ phía máy khách. Nó có thể được sử dụng để ngăn chặn các kết nối với các tài khoản kém an toàn hơn sử dụng mật khẩu trước 4.1. Tùy chọn này bị tắt theo mặc định trước MySQL 5.6.7, được bật sau đó.mysql client supports a
    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    7 option that is analogous to
    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    4, but from the client side. It can be used to prevent connections to less secure accounts that use pre-4.1 password hashing. This option is disabled by default before MySQL 5.6.7, enabled thereafter.

Các vấn đề tương thích liên quan đến các phương pháp băm

Việc mở rộng cột

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 trong MySQL 4.1 từ 16 byte đến 41 byte ảnh hưởng đến các hoạt động cài đặt hoặc nâng cấp như sau:

  • Nếu bạn thực hiện cài đặt mới của MySQL, cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 sẽ tự động thực hiện 41 byte.

  • Việc nâng cấp từ MySQL 4.1 trở lên các phiên bản hiện tại của MySQL không nên làm phát sinh bất kỳ vấn đề nào liên quan đến cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 vì cả hai phiên bản đều sử dụng cùng một phương thức băm mật khẩu và độ dài cột.

  • Để nâng cấp từ bản phát hành trước 4,1 lên 4.1 trở lên, bạn phải nâng cấp các bảng hệ thống sau khi nâng cấp. .

Phương thức băm 4.1 chỉ được hiểu bởi các máy chủ và máy khách MySQL 4.1 (và cao hơn), có thể dẫn đến một số vấn đề tương thích. Máy khách 4.1 hoặc cao hơn có thể kết nối với máy chủ Pre-4.1, vì máy khách hiểu cả các phương thức băm mật khẩu trước 4,1 và 4.1. Tuy nhiên, máy khách Pre-4.1 cố gắng kết nối với máy chủ 4.1 hoặc cao hơn có thể gặp khó khăn. Ví dụ: máy khách MySQL 4.0 có thể thất bại với thông báo lỗi sau:mysql client may fail with the following error message:

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client

Cuộc thảo luận sau đây mô tả sự khác biệt giữa các phương thức băm trước 4,1 và 4.1 và những gì bạn nên làm nếu bạn nâng cấp máy chủ của mình nhưng cần duy trì khả năng tương thích ngược với máy khách trước 4,1. . Thông tin này có tầm quan trọng đặc biệt đối với các lập trình viên PHP di chuyển cơ sở dữ liệu MySQL từ các phiên bản cũ hơn 4,1 đến 4.1 trở lên.

Sự khác biệt giữa băm mật khẩu ngắn và dài có liên quan đến cách máy chủ sử dụng mật khẩu trong quá trình xác thực và cách nó tạo băm mật khẩu cho các máy khách được kết nối thực hiện các hoạt động thay đổi mật khẩu.

Cách mà máy chủ sử dụng băm mật khẩu trong quá trình xác thực bị ảnh hưởng bởi chiều rộng của cột

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0:

  • Nếu cột ngắn, chỉ sử dụng xác thực hash ngắn.

  • Nếu cột dài, nó có thể giữ các băm ngắn hoặc dài và máy chủ có thể sử dụng định dạng:

    • Các máy khách Pre-4.1 có thể kết nối, nhưng vì họ chỉ biết về phương thức băm trước 4.1, họ chỉ có thể xác thực bằng cách sử dụng các tài khoản có băm ngắn.

    • 4.1 và các máy khách sau này có thể xác thực bằng cách sử dụng các tài khoản có băm ngắn hoặc dài.

Ngay cả đối với các tài khoản hash ngắn, quy trình xác thực thực sự an toàn hơn một chút cho các máy khách 4.1 và sau đó so với các khách hàng lớn tuổi. Về mặt bảo mật, độ dốc từ ít nhất đến an toàn nhất là:

  • Pre-4.1 máy khách xác thực bằng mật khẩu ngắn

  • 4.1 hoặc sau đó máy khách xác thực bằng mật khẩu ngắn

  • 4.1 hoặc sau đó máy khách xác thực bằng mật khẩu dài

Cách mà máy chủ tạo ra băm mật khẩu cho các máy khách được kết nối bị ảnh hưởng bởi chiều rộng của cột

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 và biến hệ thống
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9. Máy chủ 4.1 trở lên chỉ tạo các băm dài nếu đáp ứng một số điều kiện nhất định: cột
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 phải đủ rộng để giữ các giá trị dài và không được đặt thành 1.

Những điều kiện áp dụng như sau:

  • Cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 phải đủ rộng để giữ các băm dài (41 byte). Nếu cột chưa được cập nhật và vẫn có chiều rộng trước 4,1 byte, thì máy chủ thông báo rằng băm dài không thể phù hợp với nó và chỉ tạo các băm ngắn khi máy khách thực hiện các hoạt động thay đổi mật khẩu bằng hàm
    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    3 hoặc mật khẩu- Tạo tuyên bố. Đây là hành vi xảy ra nếu bạn đã nâng cấp từ phiên bản MySQL cũ hơn 4.1 lên 4.1 trở lên nhưng chưa chạy chương trình MySQL_Upgrade để mở rộng cột
    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0.mysql_upgrade program to widen the
    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 column.

  • Nếu cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 rộng, nó có thể lưu trữ các băm mật khẩu ngắn hoặc dài. Trong trường hợp này, các câu lệnh
    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    3 và các câu lệnh tạo mật khẩu tạo ra các băm dài trừ khi máy chủ được bắt đầu với biến hệ thống
    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    9 được đặt thành 1 để buộc máy chủ tạo ra các băm mật khẩu ngắn thay thế.

Mục đích của biến hệ thống

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 là cho phép khả năng tương thích ngược với máy khách trước 4,1 trong trường hợp máy chủ sẽ tạo ra các băm mật khẩu dài. Tùy chọn không ảnh hưởng đến xác thực (4.1 và các máy khách sau này vẫn có thể sử dụng các tài khoản có băm mật khẩu dài), nhưng nó ngăn chặn việc tạo ra một hàm băm mật khẩu dài trong bảng user do kết quả của hoạt động thay đổi mật khẩu. Điều đó được phép xảy ra, tài khoản không còn có thể được sử dụng bởi các máy khách trước 4,1. Với
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 bị vô hiệu hóa, kịch bản không mong muốn sau đây là có thể:

  • Máy khách Pre-4.1 cũ kết nối với tài khoản có hàm băm mật khẩu ngắn.

  • Khách hàng thay đổi mật khẩu của riêng mình. Với

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    9 bị vô hiệu hóa, điều này dẫn đến tài khoản có hàm băm mật khẩu dài.

  • Lần tới khi khách hàng cũ cố gắng kết nối với tài khoản, không thể, vì tài khoản có hàm băm mật khẩu dài yêu cầu phương thức băm 4.1 trong quá trình xác thực. .

Kịch bản này minh họa rằng, nếu bạn phải hỗ trợ các máy khách Pre-4.1 cũ hơn, có vấn đề là chạy máy chủ 4.1 hoặc cao hơn mà không cần

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 được đặt thành 1. Bằng cách chạy máy chủ bằng
mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)
1, các hoạt động thay đổi mật khẩu không tạo ra băm mật khẩu dài và do đó Không làm cho các tài khoản trở nên không thể truy cập được đối với các khách hàng lớn tuổi. .

Nhược điểm của

mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)
1 là bất kỳ mật khẩu nào được tạo hoặc thay đổi sử dụng các băm ngắn, thậm chí đối với các máy khách 4.1 trở lên. Vì vậy, bạn mất bảo mật bổ sung được cung cấp bởi các băm mật khẩu dài. Để tạo một tài khoản có hàm băm dài (ví dụ: để sử dụng cho máy khách 4.1) hoặc để thay đổi tài khoản hiện có để sử dụng hàm băm mật khẩu dài, quản trị viên có thể đặt giá trị phiên là
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 được đặt thành 0 trong khi để lại bộ giá trị toàn cầu đến 1:

mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)

Các kịch bản sau đây là có thể trong MySQL 4.1 trở lên. Các yếu tố là liệu cột

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 ngắn hay dài, và, nếu lâu, liệu máy chủ được bắt đầu với
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 được bật hay tắt.

Kịch bản 1: Cột ngắn

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 trong bảng người dùng: Short
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 column in user table:

  • Chỉ có thể lưu trữ các băm ngắn trong cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0.

  • Máy chủ chỉ sử dụng các băm ngắn trong xác thực máy khách.

  • Đối với các máy khách được kết nối, các hoạt động tạo băm mật khẩu liên quan đến chức năng

    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    3 hoặc các câu lệnh tạo mật khẩu sử dụng các băm ngắn. Bất kỳ thay đổi nào đối với mật khẩu của tài khoản đều dẫn đến tài khoản đó có hàm băm mật khẩu ngắn.

  • Giá trị của

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    9 là không liên quan vì với cột
    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0 ngắn, máy chủ chỉ tạo ra băm mật khẩu ngắn.

Kịch bản này xảy ra khi cài đặt Pre-4.1 MySQL đã được nâng cấp lên 4.1 trở lên nhưng MySQL_Upgrade chưa được chạy để nâng cấp các bảng hệ thống trong cơ sở dữ liệu mysql. (Đây không phải là cấu hình được đề xuất vì nó không cho phép sử dụng mật khẩu 4.1 an toàn hơn.)mysql_upgrade has not been run to upgrade the system tables in the mysql database. (This is not a recommended configuration because it does not permit use of more secure 4.1 password hashing.)

Kịch bản 2: Cột dài

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0; Máy chủ bắt đầu với
mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)
1:
Long
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 column; server started with
mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)
1:

  • Các băm ngắn hoặc dài có thể được lưu trữ trong cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0.

  • 4.1 và các máy khách sau này có thể xác thực cho các tài khoản có băm ngắn hoặc dài.

  • Khách hàng trước 4,1 chỉ có thể xác thực cho các tài khoản có băm ngắn.

  • Đối với các máy khách được kết nối, các hoạt động tạo băm mật khẩu liên quan đến chức năng

    mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    3 hoặc các câu lệnh tạo mật khẩu sử dụng các băm ngắn. Bất kỳ thay đổi nào đối với mật khẩu của tài khoản đều dẫn đến tài khoản đó có hàm băm mật khẩu ngắn.

Giá trị của

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 là không liên quan vì với cột
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 ngắn, máy chủ chỉ tạo ra băm mật khẩu ngắn.

Kịch bản này xảy ra khi cài đặt Pre-4.1 MySQL đã được nâng cấp lên 4.1 trở lên nhưng MySQL_Upgrade chưa được chạy để nâng cấp các bảng hệ thống trong cơ sở dữ liệu mysql. (Đây không phải là cấu hình được đề xuất vì nó không cho phép sử dụng mật khẩu 4.1 an toàn hơn.)

Kịch bản 2: Cột dài

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0; Máy chủ bắt đầu với
mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)
1:

Các băm ngắn hoặc dài có thể được lưu trữ trong cột

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0. Long
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
0 column; server started with mysql_old_password8:

  • Các băm ngắn hoặc dài có thể được lưu trữ trong cột

    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    0.

  • 4.1 và các máy khách sau này có thể xác thực cho các tài khoản có băm ngắn hoặc dài.

  • Khách hàng trước 4,1 chỉ có thể xác thực cho các tài khoản có băm ngắn.

  • Trong kịch bản này, các tài khoản mới được tạo có băm mật khẩu ngắn vì

    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    1 ngăn chặn việc tạo các băm dài. Ngoài ra, nếu bạn tạo một tài khoản có hàm băm dài trước khi đặt
    $> mysql -h localhost -u root
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    9 thành 1, thay đổi mật khẩu của tài khoản trong khi
    mysql> SET @@SESSION.old_passwords = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
    +-------------------------+------------------------+
    | @@SESSION.old_passwords | @@GLOBAL.old_passwords |
    +-------------------------+------------------------+
    |                       0 |                      1 |
    +-------------------------+------------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
    Query OK, 0 rows affected (0.00 sec)
    1 dẫn đến tài khoản được cung cấp mật khẩu ngắn, khiến nó mất lợi ích bảo mật của hàm băm dài hơn.

Như đã chỉ ra trước đó, một mối nguy hiểm trong kịch bản này là có thể các tài khoản có hàm băm mật khẩu ngắn để trở nên không thể truy cập được đối với các máy khách trước 4,1. Thay đổi mật khẩu của tài khoản như vậy được thực hiện bằng hàm

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
3 hoặc câu lệnh tạo mật khẩu dẫn đến tài khoản được cung cấp mật khẩu dài băm. Từ thời điểm đó, không có máy khách Pre-4.1 có thể kết nối với máy chủ bằng tài khoản đó. Khách hàng phải nâng cấp lên 4.1 trở lên.

Nếu đây là một vấn đề, bạn có thể thay đổi mật khẩu theo một cách đặc biệt. Ví dụ: thông thường bạn sử dụng user5 như sau để thay đổi mật khẩu tài khoản:

SET PASSWORD FOR 'some_user'@'some_host' = PASSWORD('password');

Để thay đổi mật khẩu nhưng hãy tạo một hàm băm ngắn, hãy sử dụng chức năng

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
8 thay thế:

SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('password');

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
8 rất hữu ích cho các tình huống trong đó bạn rõ ràng muốn tạo ra một hàm băm ngắn.

Nhược điểm cho từng kịch bản trước đó có thể được tóm tắt như sau:

Trong kịch bản 1, bạn không thể tận dụng các băm dài hơn cung cấp xác thực an toàn hơn.

Trong Kịch bản 2,

mysql> SET @@SESSION.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@SESSION.old_passwords, @@GLOBAL.old_passwords;
+-------------------------+------------------------+
| @@SESSION.old_passwords | @@GLOBAL.old_passwords |
+-------------------------+------------------------+
|                       0 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpass';
Query OK, 0 rows affected (0.03 sec)

mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
Query OK, 0 rows affected (0.00 sec)
1 ngăn các tài khoản có băm ngắn không thể truy cập được, nhưng các hoạt động thay đổi mật khẩu khiến các tài khoản có băm dài để trở lại băm ngắn trừ khi bạn cẩn thận thay đổi giá trị phiên là
$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
9 thành 0 trước tiên.

Trong Kịch bản 3, các tài khoản có băm ngắn trở nên không thể truy cập được đối với máy khách trước 4.1 nếu bạn thay đổi mật khẩu mà không sử dụng rõ ràng

$> mysql -h localhost -u root
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
8.

Cách tốt nhất để tránh các vấn đề tương thích liên quan đến băm mật khẩu ngắn là không sử dụng chúng:

  • Nâng cấp tất cả các chương trình khách hàng lên MySQL 4.1 trở lên.

  • Chạy máy chủ với mysql_old_password8.

  • Đặt lại mật khẩu cho bất kỳ tài khoản nào bằng băm mật khẩu ngắn để sử dụng băm mật khẩu dài.

  • Để bảo mật bổ sung, hãy chạy máy chủ với mysql_old_password9.

MySQL mã hóa mật khẩu như thế nào?

Máy chủ MySQL sử dụng chức năng mật khẩu để mã hóa mật khẩu MySQL để lưu trữ trong cột Mật khẩu của bảng cấp người dùng. Giá trị được trả về bởi hàm mật khẩu là chuỗi băm hoặc null nếu đối số là null. Hàm Mật khẩu chấp nhận một tham số là chuỗi được mã hóa.uses the PASSWORD function to encrypt MySQL passwords for storage in the Password column of the user grant table. The value returned by the PASSWORD function is a hashed string, or NULL if the argument was NULL. The PASSWORD function accepts one parameter which is the string to be encrypted.

MySQL lưu trữ mật khẩu người dùng như thế nào?

MySQL lưu trữ thông tin đăng nhập trong bảng người dùng trong cơ sở dữ liệu hệ thống MySQL.Các hoạt động gán hoặc sửa đổi mật khẩu chỉ được phép cho người dùng có đặc quyền tạo người dùng hoặc, thay vào đó, các đặc quyền cho cơ sở dữ liệu MySQL (chèn đặc quyền để tạo tài khoản mới, cập nhật đặc quyền để sửa đổi các tài khoản hiện có).in the user table in the mysql system database. Operations that assign or modify passwords are permitted only to users with the CREATE USER privilege, or, alternatively, privileges for the mysql database ( INSERT privilege to create new accounts, UPDATE privilege to modify existing accounts).

Mật khẩu được lưu trữ trong băm như thế nào?

Băm biến mật khẩu của bạn (hoặc bất kỳ phần dữ liệu nào khác) thành một chuỗi ngắn các chữ cái và/hoặc số bằng thuật toán mã hóa.Nếu một trang web bị hack, tội phạm mạng không có quyền truy cập vào mật khẩu của bạn.Thay vào đó, họ chỉ có quyền truy cập vào Hash được mã hóa được tạo bởi mật khẩu của bạn.. If a website is hacked, cyber criminals don't get access to your password. Instead, they just get access to the encrypted “hash” created by your password.

Các băm mật khẩu MySQL được lưu trữ ở đâu?

Các băm mật khẩu được lưu trữ trong bảng người dùng của cơ sở dữ liệu MySQL.Bản thân các tệp bảng thường được lưu trữ trong cấu trúc cây dưới/var/lib/mysql, nhưng vị trí đó có thể được sửa đổi bằng các tùy chọn xây dựng hoặc cấu hình thời gian chạy.in the user table of the mysql database. The table files themselves are typically stored in a tree structure under /var/lib/mysql , but that location can be modified by build options or run-time configuration.