Tiếng Việt

Công cụ dành cho nhà phát triển · Máy tính hàm băm SHA

Đánh địa chỉ nội dung: Cách Git, Docker và npm sử dụng SHA thông báo làm tên

· Lý lịch

sha-256 docker mật mã developer-workflow

Cam kết Git, lớp Docker và gói băm được xử lý bằng thông báo SHA-256 của chúng
Hình minh họa vector ToolAcre gốc

Các cam kết của Git, các bản tóm tắt hình ảnh vùng chứa và các chuỗi toàn vẹn của tệp khóa đều có cùng một ý tưởng: đặt tên dữ liệu theo hàm băm của nó. Bài đăng này giải thích việc giải quyết nội dung và những gì mỗi hệ sinh thái thu được từ nó.

Sha256: trong docker pull của bạn - chuỗi đó là gì và tại sao nó không bao giờ thay đổi đối với cùng một hình ảnh

Tất cả các hệ thống kiểm soát phiên bản, thời gian chạy vùng chứa và trình quản lý gói đều sử dụng cùng một ý tưởng đặt tên: một tệp hoặc một tập hợp byte được đặt tên theo thông báo SHA của nó. Trong Git, mã định danh 40 ký tự SHA-1 của một cam kết (hoặc 64 ký tự SHA-256 trong kho lưu trữ hiện đại) được tính toán từ nội dung của cam kết—cây, tác giả, dấu thời gian và thông báo. Thay đổi một byte đơn và SHA thay đổi. Trong Docker, mỗi thông báo lớp là hàm băm SHA-256 của nội dung của lớp và thông báo hình ảnh được tính toán từ tệp kê khai. Trong npm và các trình quản lý gói khác, các trường toàn vẹn lưu trữ SHA-512 bản tóm tắt tarball để xác minh các lượt tải xuống. Địa chỉ nội dung có nghĩa là tên chỉ phụ thuộc vào byte chứ không phụ thuộc vào cơ sở dữ liệu trung tâm hoặc dấu thời gian.

Lợi ích là tính bất biến trong mỗi hệ thống. Một git commit SHA-256:abc... sẽ luôn đề cập đến cùng một cây và thông báo vì hàm băm xác định danh tính. Nếu ai đó tuyên bố có một cam kết khác với cùng SHA, thì họ đang tuyên bố rằng các byte giống nhau sẽ tạo ra hai hàm băm khác nhau, điều này phá vỡ mật mã. Việc loại bỏ trùng lặp trở nên tự động: hai tệp có byte giống nhau sẽ tạo ra cùng một thông báo, do đó hệ thống lưu trữ có thể lưu trữ các byte một lần và tham chiếu chúng hai lần. Việc kiểm tra tính toàn vẹn trở nên đơn giản như việc tính toán lại bản tóm tắt và so sánh: nếu các byte bị sửa đổi trong quá trình truyền hoặc ở trạng thái nghỉ, thì bản tóm tắt đó không còn khớp nữa.

Đặt tên dữ liệu theo hàm băm của nó — ý tưởng đánh địa chỉ nội dung và lý do tại sao nó giúp loại bỏ sự trùng lặp và tính toàn vẹn

Git lưu trữ các đối tượng—cam kết, cây, đốm màu và thẻ—được khóa bằng thông báo SHA của chúng. Lệnh `git cat-file` lấy ID đối tượng và truy xuất byte. Kho đối tượng được định địa chỉ theo nội dung: bạn yêu cầu theo thông báo chứ không phải theo vị trí hoặc theo tên. Khi bạn sao chép một kho lưu trữ, git sẽ xác minh từng đối tượng bằng cách tính toán lại bản tóm tắt của nó và kiểm tra bản tóm tắt được đóng gói trong quá trình truyền. Quá trình chuyển đổi từ SHA-1 sang SHA-256 diễn ra dần dần; kho lưu trữ có thể hỗ trợ cả hai để tương thích. Định dạng trên đĩa lưu trữ loại đối tượng, kích thước và byte nén. Thông báo được tính toán theo dạng không nén chuẩn.

Các kho lưu trữ Git hiện đại có thể sử dụng SHA-256 và quá trình chuyển đổi đang diễn ra vì các xung đột SHA-1 hiện đã trở nên thực tế (được thể hiện trong 2017 và được tinh chỉnh trong 2020). Cam kết trong kho lưu trữ sử dụng SHA-256 có mã định danh hex gồm 64 ký tự thay vì 40. Lệnh `git hash-object` tính toán SHA của blob (nội dung tệp) mà không lưu trữ nó; `git commit-tree` tính toán SHA của cấu trúc cây và thông báo. Cả hai thao tác đều mang tính xác định: các byte giống nhau luôn tạo ra cùng một thông báo. Đây là cách GitHub và các công cụ giả mạo khác có thể hiển thị SHA cam kết một cách nhất quán—họ tính toán cùng một bản tóm tắt mà bản sao của tác giả đã tính toán.

Git sử dụng các đối tượng có địa chỉ nội dung và công cụ này có thể tái tạo các bản tóm tắt văn bản; chi tiết di chuyển yêu cầu nguồn dành riêng cho Git

Hình ảnh Docker được xây dựng theo lớp, trong đó mỗi lớp là một hệ thống tệp delta (thay đổi so với lớp trước). Thông số hình ảnh OCI xác định cách tính toán bản tóm tắt của một lớp và bản tóm tắt của tệp kê khai hình ảnh. Thông báo lớp là SHA-256 của tệp tar nén chứa các tệp lớp. Tệp kê khai là một lớp liệt kê tài liệu JSON, các bản tóm tắt và siêu dữ liệu của chúng. Thông báo hình ảnh là SHA-256 của chính tệp kê khai JSON. Khi bạn kéo một hình ảnh bằng thẻ như `latest`, cơ quan đăng ký sẽ tra cứu thẻ và trả về bản tóm tắt tệp kê khai. Sau đó, bạn có thể kéo theo thông báo trực tiếp, đảm bảo bạn nhận được chính xác các byte giống nhau—tất cả các lớp và siêu dữ liệu—mọi lúc.

Lệnh `docker inspect` trên hình ảnh cục bộ hiển thị thông báo của nó. Việc chạy cùng một hình ảnh từ cùng một thẻ trên hai máy sẽ tạo ra cùng một thông báo nếu cơ quan đăng ký vẫn giữ thẻ đó trỏ đến cùng một bảng kê khai. Việc đánh địa chỉ nội dung giúp chuỗi cung ứng hình ảnh có thể kiểm tra được: quy trình CI/CD có thể xác minh rằng hình ảnh mà nó triển khai khớp với thông báo trong nhật ký xây dựng và trình quét bảo mật có thể báo cáo về tất cả các hình ảnh được biết là có lỗ hổng cụ thể thông qua thông báo của chúng thay vì theo thẻ, thông báo này có thể di chuyển.

Vùng chứa — OCI bảng kê khai và thông báo lớp cũng như lý do thẻ có thể di chuyển nhưng thông báo không thể

Người quản lý gói sử dụng thông báo để xác minh các bản tải xuống chống giả mạo hoặc hỏng hóc. Trong npm, tệp `package-lock.json` bao gồm trường `integrity` cho mỗi phần phụ thuộc, chứa hàm băm (thường là SHA-512) và mã hóa (thường là base64). Khi npm tải tarball xuống, nó sẽ tính toán lại hàm băm và so sánh. Nếu giá trị băm không khớp thì quá trình cài đặt không thành công. Go sử dụng tệp `go.sum` có cấu trúc tương tự: đường dẫn mô-đun, phiên bản và SHA-256 của nguồn mô-đun. Hàng hóa sử dụng tổng kiểm tra trong `Cargo.lock`. Nguyên tắc giống hệt nhau: thông báo được tính toán một lần khi phần phụ thuộc được giải quyết lần đầu tiên và được kiểm tra trong mỗi lần cài đặt tiếp theo.

Kiểm tra tính toàn vẹn không yêu cầu tải gói lên cơ quan ký hoặc lưu trữ chữ ký riêng. Thông báo LÀ kiểm tra tính toàn vẹn. Để đảm bảo tối đa, các dự án sử dụng `go.sum` được hệ thống minh bạch của dự án Go ký hoặc tính toàn vẹn của npm kết hợp với xác minh khác, nhưng trường hợp cơ sở rất đơn giản: nhà xuất bản tính toán thông báo một lần, ghi lại vào tệp khóa và các công cụ ở phía người tiêu dùng xác minh rằng các byte đã tải xuống khớp.

Mã hóa tính toàn vẹn của gói khác nhau; chỉ các kết quả đầu ra SHA được hỗ trợ của máy tính này mới được xác nhận ở đây

Các byte giống nhau thông qua cùng một thuật toán luôn tạo ra cùng một thông báo, bất kể byte đến từ đâu. Bản dựng cam kết cục bộ của nhà phát triển tạo ra SHA-256 giống như hệ thống CI/CD đang kiểm tra cùng một bản sửa đổi từ cùng một kho lưu trữ. Khả năng tái tạo này là lý do tại sao việc đánh địa chỉ nội dung lại hiệu quả: bạn có thể xác minh một thành phần lạ mà không cần tin cậy vào cơ chế phân phối. Bản tóm tắt trở thành một cam kết mật mã: việc thay đổi dù chỉ một byte cũng sẽ làm nó mất hiệu lực.

Việc phân phối thông báo riêng biệt (trước khi phân phối hiện vật) sẽ bảo vệ khỏi việc sửa đổi trong quá trình bay. Một trang web được xuất bản trước khi phát hành có thể hiển thị "mong đợi SHA-256:abc..." và sau đó người dùng có thể xác minh các lượt tải xuống đối với trang đó. Cam kết git được xuất bản trong kho lưu trữ công cộng là cam kết đối với byte; bản tóm tắt chứng minh điều đó.

Ví dụ đã hoạt động - theo sau một đốm màu từ byte để phân loại thành tên mà một công cụ sử dụng cho nó

Các hệ thống khác nhau mã hóa thông báo của chúng một cách khác nhau. Git sử dụng hệ thập lục phân chữ thường theo mặc định (40 hoặc 64 ký tự thập lục phân). Docker sử dụng định dạng `sha256:` theo sau là hex. npm và Go sử dụng base64 trong các trường toàn vẹn. Các byte giống nhau; chỉ có sự đại diện khác nhau. Thông báo SHA-256 trên "abc" luôn giống 256 bits, nhưng bạn có thể xem nó dưới dạng chuỗi thập lục phân 64 ký tự, chuỗi cơ sở64 ký tự 44 hoặc nhãn như `sha256:` theo sau. Chuyển đổi giữa các bảng mã là không mất dữ liệu; thông báo có cùng giá trị trong mọi biểu diễn.

Hiểu các vấn đề về mã hóa khi so sánh các thông báo giữa các công cụ. Nếu Git in một bản tóm tắt hex và một công cụ hiển thị base64, bạn phải chuyển đổi cách trình bày này sang cách trình bày khác để xác minh chúng khớp với nhau. Công cụ tính hàm băm SHA của ToolAcre hiển thị cả hệ thập lục phân và cơ số 64 cho mỗi thông báo, giúp dễ dàng chuyển đổi hoặc tham chiếu chéo với các hệ thống khác.

Điều này không bao gồm những gì - mã hóa cụ thể mà mỗi công cụ sử dụng (hex so với base64), được trình bày trong một bài đăng riêng

Việc đánh địa chỉ nội dung không dành riêng cho mật mã, mặc dù hàm băm mật mã giúp nó an toàn. Tổng kiểm tra CRC32 cũng chứa dữ liệu địa chỉ nội dung, nhưng xung đột CRC32 là phổ biến và xung đột có thể được tạo ra; kho lưu trữ này không đánh dấu SHA-256 là bị hỏng, trong khi CRC32 không được cung cấp dưới dạng nguyên thủy toàn vẹn đối lập. Việc lựa chọn thuật toán băm có ý nghĩa quan trọng đối với vấn đề bảo mật: SHA-256 là tiêu chuẩn hiện đại cho các hệ thống cần bảo vệ tính toàn vẹn trước các đối thủ. SHA-1 chỉ là di sản (Git và những thứ khác đang di chuyển đi). Việc chọn thuật toán phù hợp là một quyết định riêng biệt với việc chọn địa chỉ nội dung làm sơ đồ đặt tên.

Địa chỉ nội dung kết hợp với băm mật mã là nền tảng của tính toàn vẹn chuỗi cung ứng trong phần mềm hiện đại. Mọi gói bạn cài đặt, mọi vùng chứa bạn chạy và mọi cam kết bạn kiểm tra đều có thể được xác minh là byte mà nhà xuất bản ban đầu dự định mà không cần dựa vào chuyển giao an toàn (mặc dù chuyển giao an toàn vẫn là một biện pháp tốt).

Bài học rút ra: hàm băm là danh tính — công cụ tính hàm băm ToolAcre SHA cho phép bạn tính toán các thông số tương tự mà các hệ thống này dựa vào

Địa chỉ nội dung độc lập với mã hóa, vị trí lưu trữ hoặc cơ chế truyền tải. Các byte giống nhau tạo ra cùng một thông báo cho dù được lưu trữ cục bộ, trong CDN, trong sổ đăng ký hay được truyền qua HTTP hoặc bảo mật HTTPS. Thông báo tóm tắt là một cam kết mã hóa đối với các byte và việc xác minh nó chỉ yêu cầu các byte và thuật toán chứ không phải bất kỳ dịch vụ bên ngoài nào. Đây là lý do tại sao việc đánh địa chỉ nội dung cho phép xác minh ngoại tuyến: bạn có thể tải xuống tệp qua kênh không đáng tin cậy, kiểm tra thông báo và biết liệu các byte có xác thực hay không.

Công cụ tính hàm băm ToolAcre SHA cho phép bạn tính toán các thông số tương tự mà các hệ thống này dựa vào. Dán một chuỗi hoặc xem một tệp, chạy máy tính và xem các bản tóm tắt SHA-256, SHA-384 và SHA-512 mà Docker, Git, npm và các công cụ khác sử dụng nội bộ. So sánh thông báo được tính toán của bạn với thông báo từ nguồn ban đầu để xác minh các byte chưa bị sửa đổi. Máy tính băm UTF-8 văn bản mà bạn dán; nó không băm các tệp hoặc tài liệu chính, vì vậy ranh giới giữa những gì nó có thể băm (nhập văn bản) và những gì nó không thể băm (tệp nhị phân, khóa mật mã ở dạng được mã hóa) rất rõ ràng và được ghi lại.