Câu trả lời:
Ngay từ đầu, các hệ điều hành Unix và Unix (bao gồm cả Linux) đã luôn lưu trữ mật khẩu dưới dạng băm mật mã (1). Các giá trị băm này ban đầu được lưu trữ /etc/passwd, nhưng tệp này cần có thể đọc được để cung cấp thông tin cho các mục đích khác - ngay cả một ls -lnhu cầu đơn giản để đọc /etc/passwdđể chuyển đổi id người dùng số của chủ sở hữu tệp sang tên người dùng của họ để hiển thị. Tuy nhiên, việc có mật khẩu băm trong một tệp có thể đọc được trên thế giới cho phép người dùng độc hại dễ dàng có được các giá trị băm đó và cố gắng tạo mật khẩu có thể sử dụng (2) cho tài khoản của người dùng khác.
Để ngăn chặn điều này, mật khẩu băm cuối cùng đã được chuyển vào một tệp chỉ có thể đọc được bằng root (và đôi khi là một nhóm quản trị viên đặc quyền) , /etc/shadow. Điều này ẩn băm từ người dùng bình thường của hệ thống trong khi vẫn giữ chúng cho mục đích xác thực người dùng.
Ghi chú :
Pedantic, tôi biết, nhưng mật khẩu được lưu trữ không được mã hóa. Chúng được băm bằng thuật toán băm bảo mật bằng mật mã (ít nhất là tại thời điểm nó được viết). Sự khác biệt chính có liên quan ở đây là băm có độ dài cố định (độ dài của văn bản được mã hóa thay đổi dựa trên độ dài của văn bản được mã hóa) và không thể đảo ngược (văn bản được mã hóa có thể được giải mã; văn bản băm không thể).
Bởi vì giá trị băm có độ dài cố định, có vô số đầu vào sẽ khớp với bất kỳ đại diện băm nào. Do đó, kẻ tấn công có thể tìm thấy một mật khẩu hoạt động không nhất thiết phải giống với mật khẩu của người dùng - mặc dù điều này rất khó xảy ra với kích thước của băm mật mã hiện đại.
Các /etc/shadowtập tin được tạo ra vì lý do an ninh, và giữ mật khẩu mã hóa của mỗi người dùng.
Ban đầu, mật khẩu được mã hóa được lưu trữ trong /etc/passwd. /etc/passwdphải có thể đọc được trên thế giới để hệ thống có thể ánh xạ tên người dùng thành tên người dùng và để người dùng có thể tìm hiểu thông tin về nhau, ví dụ như thư mục nhà của người dùng khác hoặc số điện thoại của họ, được lưu trữ theo cách truyền thống trong trường "gecos" và được hiển thị bởi tiện ích "ngón tay".
Nhưng sau đó mọi người nhận ra rằng đây là một vấn đề bảo mật. Bất kỳ ai có đủ thời gian đều có thể thực hiện những gì được gọi là tấn công bruteforce , bằng cách lập trình tạo mật khẩu được mã hóa cho mọi mật khẩu có thể. Nếu kẻ tấn công đã làm điều đó mà không thực sự cố gắng đăng nhập thông qua telnethoặc ssh, hệ thống không thể biết rằng nó đang bị tấn công.
Vì vậy, mật khẩu được mã hóa đã được chuyển vào mới được tạo /etc/shadow, chỉ có thể đọc được bằng root.
Nó cũng chứa các thông tin khác mà /etc/passwdtệp không hỗ trợ liên quan đến tài khoản và mật khẩu của người dùng, ví dụ: khi mật khẩu được thay đổi lần cuối và khi nào nó sẽ hết hạn.
Xem man 5 shadow( phiên bản web ) để biết chi tiết đầy đủ về định dạng tệp.
Tôi không thể nói liệu nó có giống với SUSE hay không, mà không biết bạn đang xử lý phiên bản SUSE nào. Ví dụ: hệ thống SUSE của bạn có thể sử dụng Blowfish thay vì MD5.
Bạn cũng ngụ ý rằng bạn đã trộn /etc/shadowtệp của mình với một hệ thống chạy phân phối Linux khác, nhưng không cho biết phân phối khác là gì.
Xem các sự cố khi di chuyển tệp bóng từ SuSE 9.3 sang Ubuntu Server x86_64 chẳng hạn.
Để thử tìm hiểu nó, hãy mở ra /etc/shadowvà xem liệu trường mật khẩu được mã hóa bắt đầu bằng $1$hoặc $2$. Nếu nó chứa $1$, thì đó là MD5 và tương thích với hầu hết các bản phân phối khác. Nếu nó có chứa $2$, thì đó có lẽ là Blowfish theo các tệp bóng của blowfish trên Debian .
Nếu bạn đang sử dụng Ubuntu, kết quả tìm kiếm đầu tiên của Google cho Ubuntu blowfish có thể là một khởi đầu tốt.
Người dùng được liệt kê trong /etc/passwdtập tin. Tệp này chứa nhiều thông tin được sử dụng bởi hệ thống không chỉ cho phép người dùng đăng nhập.
Mỗi dòng tương ứng với một mục nhập của người dùng và các trường khác nhau được phân tách bằng dấu hai chấm. Các tập tin đầu tiên là đăng nhập, nó được theo sau bởi mật khẩu tương ứng.
Mật khẩu được mã hóa được sử dụng để được lưu trữ trong lĩnh vực này. Tuy nhiên, /etc/passwdmọi người trên hệ thống đều có thể đọc được tệp, vì vậy mã hóa không ngăn được các cuộc tấn công vũ phu, như đã nói bởi @Mikel. Giải pháp là di chuyển các mật khẩu được mã hóa này trong tệp chỉ đọc được gốc : /etc/shadow.
Do đó, /etc/shadowchứa mật khẩu được mã hóa của người dùng hệ thống. Hệ thống biết rằng nó phải kiểm tra mật khẩu trong tệp này khi các trường mật khẩu chỉ /etc/passwdchứa một x (có nghĩa là " vượt qua / etc / bóng")
/etc/passwd/ vẫn được băm theo cách chính xác giống như khi chúng ở trong đó /etc/shadow. Bạn không thực sự nói rằng mật khẩu trong /etc/passwdsẽ là văn bản gốc, nhưng sẽ dễ dàng cho một người không quen với việc xử lý mật khẩu * nix giải thích sai câu trả lời của bạn khi ngụ ý điều đó.
xthực sự có nghĩa là bất cứ điều gì. Đó chỉ là một hàm băm không hợp lệ (mật khẩu không khớp với bất kỳ mật khẩu nào). Một số hệ thống sử dụng !.
Hãy xem liệu tôi có thể nhận được tất cả các phiếu bầu trên thế giới hay không, vì tôi đã viết cái đã trở thành Bộ mật khẩu bóng tối của Linux trong '87;)
Tệp gốc /etc/passwdchứa hàm băm dựa trên mật khẩu đã được sửa đổi của mật khẩu Cleartext. Tại thời điểm crypt()chức năng được tạo, người ta tin rằng (và điều này đã được tuyên bố bởi những người tạo ra hệ điều hành UNIX) rằng các cuộc tấn công chống lại mật khẩu băm sẽ không thể thực hiện được, do số lượng mật khẩu có thể và việc sử dụng 12 bit (4.096 giá trị có thể) "muối". Mỗi mật khẩu Cleartext có thể có 4.096 giá trị băm có thể và với 64 bit kết quả được băm, điều đó đã tạo ra tổng cộng 2 ^ 72 băm mật khẩu có thể.
Như một poster khác đã đề cập, /etc/passwdcũng được sử dụng bởi các tiện ích khác nhau để ánh xạ giữa tên người dùng và giá trị UID ( /etc/grouptệp cung cấp chức năng tương tự cho các nhóm) và điều đó đòi hỏi nó phải dễ đọc trên thế giới.
Vào những năm 1980, rõ ràng là các cuộc tấn công từ điển chống lại mật khẩu băm được lưu trữ trong /etc/passwdtệp đã trở nên khả thi và /etc/shadowđã được giới thiệu cho AT & T UNIX trong một bản phát hành đầu tiên của System V. Tôi đã ghi lại những trang mà tôi đã sử dụng để viết thư viện Shadow gốc và tôi kể từ khi bị lãng quên, nhưng nó chắc chắn là một bản phát hành System V đầu tiên, có lẽ là SVR3.2.
Những gì AT & T đã làm và những gì tôi đã triển khai cho SCO Xenix (SCO Xenix ban đầu, không phải là SCO Xenix xấu xa sau này) trong '87 cuối cùng được sử dụng trên Linux, chỉ đơn giản là chuyển mật khẩu băm sang /etc/shadow. Điều này đã ngăn chặn cuộc tấn công bằng lái xe, nơi một người dùng không có đặc quyền có được một bản sao /etc/passwdvà thực hiện một cuộc tấn công chống lại nó. Nếu bạn quen thuộc với lý do tại sao tôi viết Shadow ở nơi đầu tiên, tôi đã có một người dùng tải xuống /etc/passwdtệp của mình qua UUCP vào thời mà chúng ta vẫn sử dụng UUCP cho mọi thứ.
Vào thời điểm Linux được tạo ra và được sử dụng rộng rãi, đã có một số lượng rất lớn các công cụ để tấn công băm mật khẩu. Việc triển khai lại hiệu suất cao crypt()là một con đường và các cuộc tấn công dựa trên từ điển thông qua các công cụ như Crack và libcrack là những cách khác. Cổng ban đầu được thực hiện bởi Nate Holloway và Floria La Roche (Tôi đã cho họ tín dụng, tôi không biết có ai làm việc đó trước họ không).
Cuối cùng, việc sử dụng crypt()băm dựa trên cơ sở, ngay cả trong một tệp được bảo vệ, không còn an toàn nữa và các MD5thay đổi băm dựa trên gốc đã được thực hiện. MD5cuối cùng được coi là quá yếu, và băm mới hơn được sử dụng.
Về lý thuyết, một hàm băm đủ mạnh có thể được lưu trữ trong /etc/passwd. Bảo mật hoạt động kém có nghĩa là nhiều hệ thống có /etc/shadowsẵn các tệp của chúng thông qua các vectơ tấn công khác nhau - "Tôi đã đánh cắp các tệp sao lưu" có lẽ là dễ nhất.