<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Chữ ký số · Phan Đức Trung (Trung Phan) | Học AI mỗi ngày</title><link>https://blog.phdtrung.com/tags/ch%E1%BB%AF-k%C3%BD-s%E1%BB%91/</link><description>Học AI mỗi ngày: tri thức là tay phải, AI là tay trái. Nhật ký AI-native về công nghệ, kinh tế, chính sách và đời sống.</description><generator>Hugo</generator><language>vi-VN</language><copyright>© 2026 Phan Đức Trung</copyright><lastBuildDate>Thu, 22 Oct 2026 14:00:00 +0700</lastBuildDate><atom:link href="https://blog.phdtrung.com/tags/ch%E1%BB%AF-k%C3%BD-s%E1%BB%91/index.xml" rel="self" type="application/rss+xml"/><item><title>Tôi tạo định danh phi tập trung cho blog: did:web là gì và chữ ký số trên bài viết chứng minh được gì?</title><link>https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/</link><pubDate>Thu, 22 Oct 2026 12:56:00 +0700</pubDate><dc:creator>Phan Đức Trung</dc:creator><guid isPermaLink="true">https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/</guid><category>Blockchain &amp; Tài sản số</category><description>Blog có định danh phi tập trung did:web và chữ ký số Ed25519 cho từng bài: DID là gì, cách công bố, cách tự kiểm chứng và điều chữ ký không chứng minh được.</description><enclosure url="https://blog.phdtrung.com/audio/did-web-dinh-danh-phi-tap-trung.mp3" length="3187399" type="audio/mpeg"/><content:encoded><![CDATA[<p>Trong bài <a href="https://blog.phdtrung.com/posts/bitcoin-chung-thuc-va-thua-hanh-vien/">Bitcoin và việc chứng thực tài liệu</a>, tôi tìm cách chứng minh một bài viết đã có từ <strong>khi nào</strong>. Bài này đi tiếp một câu hỏi khác: làm sao chứng minh bài viết là của <strong>ai</strong>?</p>
<p>Câu hỏi nghe đơn giản nhưng ngày càng khó. Ảnh chụp màn hình &ldquo;bài của Trung Phan&rdquo; có thể dựng trong vài giây. AI có thể viết một đoạn văn giống giọng tôi rồi gắn tên tôi vào. Một trang web giả giao diện blog này có thể nằm ở một tên miền na ná. Người đọc gần như không có cách tự kiểm tra.</p>
<p>Vì vậy tôi thử làm một việc nhỏ trên chính blog này: tạo cho mình một <strong>định danh phi tập trung</strong> (gọi tắt là DID) và dùng nó để <strong>ký số</strong> từng bài viết. Dưới đây là cách nó hoạt động, giải thích càng đơn giản càng tốt.</p>
<h2 id="1-hai-cách-để-biết-một-bài-viết-là-của-ai">1. Hai cách để biết một bài viết là của ai <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#1-hai-c%c3%a1ch-%c4%91%e1%bb%83-bi%e1%ba%bft-m%e1%bb%99t-b%c3%a0i-vi%e1%ba%bft-l%c3%a0-c%e1%bb%a7a-ai" aria-label="Link tới mục: 1. Hai cách để biết một bài viết là của ai"></a></h2>
<p>Hiện nay, hầu hết chúng ta chứng minh &ldquo;đây là tôi&rdquo; bằng <strong>tài khoản do nền tảng cấp</strong>: Facebook, LinkedIn, Gmail, X. Người đọc tin một bài là của tôi vì nền tảng hiển thị tên tôi bên cạnh.</p>
<p>Cách này tiện, nhưng mọi niềm tin dồn vào nền tảng:</p>
<ul>
<li>Tài khoản bị khóa, bị chiếm hay nền tảng đóng cửa thì &ldquo;tôi&rdquo; ở đó cũng mất.</li>
<li>Bài viết chép sang nơi khác thì không còn gì chứng minh tác giả.</li>
<li>Muốn kiểm tra, người đọc phải tin nền tảng, không tự kiểm được.</li>
</ul>
<p>Có một cách khác, đã có từ lâu trong mật mã học: <strong>chữ ký số</strong>. Người viết tự ký vào bài, người đọc tự kiểm chữ ký. Không cần ai đứng giữa.</p>
<figure class="diagram has-doc"><div class="dg-wide"><svg viewBox="0 0 560 308" role="img" aria-labelledby="dgd1-t dgd1-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd1-t">Hai cách để biết một bài viết là của ai</title>
<desc id="dgd1-d">Bên trái: tài khoản nền tảng. Trung đăng bài lên nền tảng, nền tảng giữ danh tính, người đọc tin vì nền tảng nói vậy. Bên phải: định danh DID. Trung ký bài bằng khóa riêng chỉ mình có, bài kèm chữ ký lưu hành ở bất kỳ đâu, người đọc tự kiểm bằng khóa công khai mà không cần hỏi ai.</desc>
<defs><marker id="dgd1-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="138" y="30" text-anchor="middle" class="dg-h">Tài khoản nền tảng</text>
<rect x="16" y="46" width="244" height="52" rx="10" class="dg-human"/>
<text x="138" y="69" text-anchor="middle" class="dg-t">Trung đăng bài</text>
<text x="138" y="88" text-anchor="middle" class="dg-s">trên Facebook, LinkedIn, X…</text>
<path d="M138 101V125" class="dg-arrow" marker-end="url(#dgd1-h)"/>
<rect x="16" y="128" width="244" height="69" rx="10" class="dg-soft"/>
<text x="138" y="151" text-anchor="middle" class="dg-t">Nền tảng</text>
<text x="138" y="170" text-anchor="middle" class="dg-s">giữ tài khoản, có thể khóa,</text>
<text x="138" y="187" text-anchor="middle" class="dg-s">có thể đóng cửa</text>
<path d="M138 200V224" class="dg-arrow" marker-end="url(#dgd1-h)"/>
<rect x="16" y="227" width="244" height="52" rx="10" class="dg-box"/>
<text x="138" y="250" text-anchor="middle" class="dg-t">Người đọc</text>
<text x="138" y="269" text-anchor="middle" class="dg-s">tin vì nền tảng nói vậy</text>
<text x="422" y="30" text-anchor="middle" class="dg-h">Định danh DID</text>
<rect x="300" y="46" width="244" height="52" rx="10" class="dg-human"/>
<text x="422" y="69" text-anchor="middle" class="dg-t">Trung ký bài</text>
<text x="422" y="88" text-anchor="middle" class="dg-s">bằng khóa riêng, chỉ Trung có</text>
<path d="M422 101V125" class="dg-arrow" marker-end="url(#dgd1-h)"/>
<rect x="300" y="128" width="244" height="69" rx="10" class="dg-soft"/>
<text x="422" y="151" text-anchor="middle" class="dg-t">Bài + chữ ký</text>
<text x="422" y="170" text-anchor="middle" class="dg-s">chép đi đâu cũng mang</text>
<text x="422" y="187" text-anchor="middle" class="dg-s">theo chữ ký</text>
<path d="M422 200V224" class="dg-arrow" marker-end="url(#dgd1-h)"/>
<rect x="300" y="227" width="244" height="69" rx="10" class="dg-ai"/>
<text x="422" y="250" text-anchor="middle" class="dg-t">Người đọc</text>
<text x="422" y="269" text-anchor="middle" class="dg-s">tự kiểm bằng khóa công khai,</text>
<text x="422" y="286" text-anchor="middle" class="dg-s">không cần hỏi ai</text>
</svg>
</div><div class="dg-doc"><svg viewBox="0 0 320 603" role="img" aria-labelledby="dgd1m-t dgd1m-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd1m-t">Hai cách để biết một bài viết là của ai</title>
<desc id="dgd1m-d">Bên trái: tài khoản nền tảng. Trung đăng bài lên nền tảng, nền tảng giữ danh tính, người đọc tin vì nền tảng nói vậy. Bên phải: định danh DID. Trung ký bài bằng khóa riêng chỉ mình có, bài kèm chữ ký lưu hành ở bất kỳ đâu, người đọc tự kiểm bằng khóa công khai mà không cần hỏi ai.</desc>
<defs><marker id="dgd1m-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="160" y="30" text-anchor="middle" class="dg-h">Tài khoản nền tảng</text>
<rect x="10" y="46" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="69" text-anchor="middle" class="dg-t">Trung đăng bài</text>
<text x="160" y="88" text-anchor="middle" class="dg-s">trên Facebook, LinkedIn, X…</text>
<path d="M160 101V125" class="dg-arrow" marker-end="url(#dgd1m-h)"/>
<rect x="10" y="128" width="300" height="69" rx="10" class="dg-soft"/>
<text x="160" y="151" text-anchor="middle" class="dg-t">Nền tảng</text>
<text x="160" y="170" text-anchor="middle" class="dg-s">giữ tài khoản, có thể khóa,</text>
<text x="160" y="187" text-anchor="middle" class="dg-s">có thể đóng cửa</text>
<path d="M160 200V224" class="dg-arrow" marker-end="url(#dgd1m-h)"/>
<rect x="10" y="227" width="300" height="52" rx="10" class="dg-box"/>
<text x="160" y="250" text-anchor="middle" class="dg-t">Người đọc</text>
<text x="160" y="269" text-anchor="middle" class="dg-s">tin vì nền tảng nói vậy</text>
<text x="160" y="325" text-anchor="middle" class="dg-h">Định danh DID</text>
<rect x="10" y="341" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="364" text-anchor="middle" class="dg-t">Trung ký bài</text>
<text x="160" y="383" text-anchor="middle" class="dg-s">bằng khóa riêng, chỉ Trung có</text>
<path d="M160 396V420" class="dg-arrow" marker-end="url(#dgd1m-h)"/>
<rect x="10" y="423" width="300" height="69" rx="10" class="dg-soft"/>
<text x="160" y="446" text-anchor="middle" class="dg-t">Bài + chữ ký</text>
<text x="160" y="465" text-anchor="middle" class="dg-s">chép đi đâu cũng mang</text>
<text x="160" y="482" text-anchor="middle" class="dg-s">theo chữ ký</text>
<path d="M160 495V519" class="dg-arrow" marker-end="url(#dgd1m-h)"/>
<rect x="10" y="522" width="300" height="69" rx="10" class="dg-ai"/>
<text x="160" y="545" text-anchor="middle" class="dg-t">Người đọc</text>
<text x="160" y="564" text-anchor="middle" class="dg-s">tự kiểm bằng khóa công khai,</text>
<text x="160" y="581" text-anchor="middle" class="dg-s">không cần hỏi ai</text>
</svg>
</div><figcaption>Bên trái: người đọc phải tin nền tảng. Bên phải: chữ ký đi theo bài viết, người đọc tự kiểm.</figcaption></figure>
<h2 id="2-chữ-ký-số-giống-mẫu-chữ-ký-ở-ngân-hàng">2. Chữ ký số giống mẫu chữ ký ở ngân hàng <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#2-ch%e1%bb%af-k%c3%bd-s%e1%bb%91-gi%e1%bb%91ng-m%e1%ba%abu-ch%e1%bb%af-k%c3%bd-%e1%bb%9f-ng%c3%a2n-h%c3%a0ng" aria-label="Link tới mục: 2. Chữ ký số giống mẫu chữ ký ở ngân hàng"></a></h2>
<p>Cách dễ hình dung nhất là nghĩ tới chữ ký tay ở ngân hàng.</p>
<ul>
<li>Khi mở tài khoản, bạn để lại <strong>mẫu chữ ký</strong>. Ngân hàng giữ mẫu này để đối chiếu.</li>
<li>Mỗi lần bạn ký giấy tờ, nhân viên so chữ ký với mẫu. Khớp thì đúng là bạn.</li>
</ul>
<p>Chữ ký số làm đúng như vậy, chỉ khác là dùng toán học thay cho mắt người:</p>
<ul>
<li><strong>Khóa riêng</strong> là &ldquo;cây bút&rdquo; chỉ mình bạn giữ. Ai có nó là ký được thay bạn, nên nó phải được cất kỹ.</li>
<li><strong>Khóa công khai</strong> là &ldquo;mẫu chữ ký&rdquo; bạn đưa cho mọi người. Nhìn vào nó, không ai đoán ra được khóa riêng.</li>
<li>Chữ ký tạo bằng khóa riêng chỉ khớp với đúng khóa công khai đi cặp với nó. Chừng nào khóa riêng còn được giữ kín thì không ai giả được chữ ký, và sửa nội dung dù chỉ một ký tự thì chữ ký không còn khớp.</li>
</ul>
<figure class="diagram has-doc"><div class="dg-wide"><svg viewBox="0 0 560 356" role="img" aria-labelledby="dgd4-t dgd4-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd4-t">Chữ ký số giống mẫu chữ ký ở ngân hàng</title>
<desc id="dgd4-d">Ở ngân hàng: bạn ký bằng tay của mình; ngân hàng giữ mẫu chữ ký; nhân viên so chữ ký với mẫu bằng mắt; khớp thì đúng là bạn. Chữ ký số: bạn ký bằng khóa riêng chỉ mình giữ; khóa công khai được công bố cho mọi người như mẫu chữ ký; máy kiểm bằng toán học; khớp thì đúng người ký và đúng nguyên văn, sửa một ký tự là không khớp.</desc>
<defs><marker id="dgd4-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="130" y="30" text-anchor="middle" class="dg-h">Ở ngân hàng</text>
<rect x="16" y="46" width="229" height="52" rx="10" class="dg-human"/>
<text x="130" y="69" text-anchor="middle" class="dg-t">Bạn ký tay</text>
<text x="130" y="88" text-anchor="middle" class="dg-s">nét chữ của riêng bạn</text>
<path d="M130 101V125" class="dg-arrow" marker-end="url(#dgd4-h)"/>
<rect x="16" y="128" width="229" height="52" rx="10" class="dg-soft"/>
<text x="130" y="151" text-anchor="middle" class="dg-t">Mẫu chữ ký</text>
<text x="130" y="170" text-anchor="middle" class="dg-s">ngân hàng giữ để đối chiếu</text>
<path d="M130 183V207" class="dg-arrow" marker-end="url(#dgd4-h)"/>
<rect x="16" y="210" width="229" height="52" rx="10" class="dg-box"/>
<text x="130" y="233" text-anchor="middle" class="dg-t">Nhân viên so bằng mắt</text>
<text x="130" y="252" text-anchor="middle" class="dg-s">chữ ký trên giấy với mẫu</text>
<path d="M130 265V289" class="dg-arrow" marker-end="url(#dgd4-h)"/>
<rect x="16" y="292" width="229" height="52" rx="10" class="dg-ai"/>
<text x="130" y="315" text-anchor="middle" class="dg-t">Khớp: đúng là bạn</text>
<text x="130" y="334" text-anchor="middle" class="dg-s">nhưng giấy sửa sau vẫn khó biết</text>
<text x="430" y="30" text-anchor="middle" class="dg-h">Chữ ký số</text>
<rect x="315" y="46" width="229" height="52" rx="10" class="dg-human"/>
<text x="430" y="69" text-anchor="middle" class="dg-t">Bạn ký bằng khóa riêng</text>
<text x="430" y="88" text-anchor="middle" class="dg-s">&quot;cây bút&quot; chỉ mình bạn giữ</text>
<path d="M430 101V125" class="dg-arrow" marker-end="url(#dgd4-h)"/>
<rect x="315" y="128" width="229" height="52" rx="10" class="dg-soft"/>
<text x="430" y="151" text-anchor="middle" class="dg-t">Khóa công khai</text>
<text x="430" y="170" text-anchor="middle" class="dg-s">mẫu chữ ký treo cho mọi người</text>
<path d="M430 183V207" class="dg-arrow" marker-end="url(#dgd4-h)"/>
<rect x="315" y="210" width="229" height="52" rx="10" class="dg-box"/>
<text x="430" y="233" text-anchor="middle" class="dg-t">Máy kiểm bằng toán học</text>
<text x="430" y="252" text-anchor="middle" class="dg-s">ai cũng kiểm được, không cần hỏi</text>
<path d="M430 265V289" class="dg-arrow" marker-end="url(#dgd4-h)"/>
<rect x="315" y="292" width="229" height="52" rx="10" class="dg-ai"/>
<text x="430" y="315" text-anchor="middle" class="dg-t">Khớp: đúng là bạn ký</text>
<text x="430" y="334" text-anchor="middle" class="dg-s">sửa một ký tự là không khớp</text>
<path d="M249 72H311" class="dg-dash"/>
<text x="280" y="65" text-anchor="middle" class="dg-s">giống</text>
<path d="M249 154H311" class="dg-dash"/>
<text x="280" y="147" text-anchor="middle" class="dg-s">giống</text>
<path d="M249 236H311" class="dg-dash"/>
<text x="280" y="229" text-anchor="middle" class="dg-s">giống</text>
<path d="M249 318H311" class="dg-dash"/>
<text x="280" y="311" text-anchor="middle" class="dg-s">giống</text>
</svg>
</div><div class="dg-doc"><svg viewBox="0 0 320 716" role="img" aria-labelledby="dgd4m-t dgd4m-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd4m-t">Chữ ký số giống mẫu chữ ký ở ngân hàng</title>
<desc id="dgd4m-d">Ở ngân hàng: bạn ký bằng tay của mình; ngân hàng giữ mẫu chữ ký; nhân viên so chữ ký với mẫu bằng mắt; khớp thì đúng là bạn. Chữ ký số: bạn ký bằng khóa riêng chỉ mình giữ; khóa công khai được công bố cho mọi người như mẫu chữ ký; máy kiểm bằng toán học; khớp thì đúng người ký và đúng nguyên văn, sửa một ký tự là không khớp.</desc>
<defs><marker id="dgd4m-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="160" y="30" text-anchor="middle" class="dg-h">Ở ngân hàng</text>
<rect x="10" y="46" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="69" text-anchor="middle" class="dg-t">Bạn ký tay</text>
<text x="160" y="88" text-anchor="middle" class="dg-s">nét chữ của riêng bạn</text>
<path d="M160 101V125" class="dg-arrow" marker-end="url(#dgd4m-h)"/>
<rect x="10" y="128" width="300" height="52" rx="10" class="dg-soft"/>
<text x="160" y="151" text-anchor="middle" class="dg-t">Mẫu chữ ký</text>
<text x="160" y="170" text-anchor="middle" class="dg-s">ngân hàng giữ để đối chiếu</text>
<path d="M160 183V207" class="dg-arrow" marker-end="url(#dgd4m-h)"/>
<rect x="10" y="210" width="300" height="52" rx="10" class="dg-box"/>
<text x="160" y="233" text-anchor="middle" class="dg-t">Nhân viên so bằng mắt</text>
<text x="160" y="252" text-anchor="middle" class="dg-s">chữ ký trên giấy với mẫu</text>
<path d="M160 265V289" class="dg-arrow" marker-end="url(#dgd4m-h)"/>
<rect x="10" y="292" width="300" height="52" rx="10" class="dg-ai"/>
<text x="160" y="315" text-anchor="middle" class="dg-t">Khớp: đúng là bạn</text>
<text x="160" y="334" text-anchor="middle" class="dg-s">nhưng giấy sửa sau vẫn khó biết</text>
<text x="160" y="390" text-anchor="middle" class="dg-h">Chữ ký số</text>
<rect x="10" y="406" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="429" text-anchor="middle" class="dg-t">Bạn ký bằng khóa riêng</text>
<text x="160" y="448" text-anchor="middle" class="dg-s">&quot;cây bút&quot; chỉ mình bạn giữ</text>
<path d="M160 461V485" class="dg-arrow" marker-end="url(#dgd4m-h)"/>
<rect x="10" y="488" width="300" height="52" rx="10" class="dg-soft"/>
<text x="160" y="511" text-anchor="middle" class="dg-t">Khóa công khai</text>
<text x="160" y="530" text-anchor="middle" class="dg-s">mẫu chữ ký treo cho mọi người</text>
<path d="M160 543V567" class="dg-arrow" marker-end="url(#dgd4m-h)"/>
<rect x="10" y="570" width="300" height="52" rx="10" class="dg-box"/>
<text x="160" y="593" text-anchor="middle" class="dg-t">Máy kiểm bằng toán học</text>
<text x="160" y="612" text-anchor="middle" class="dg-s">ai cũng kiểm được, không cần hỏi</text>
<path d="M160 625V649" class="dg-arrow" marker-end="url(#dgd4m-h)"/>
<rect x="10" y="652" width="300" height="52" rx="10" class="dg-ai"/>
<text x="160" y="675" text-anchor="middle" class="dg-t">Khớp: đúng là bạn ký</text>
<text x="160" y="694" text-anchor="middle" class="dg-s">sửa một ký tự là không khớp</text>
</svg>
</div><figcaption>Mỗi bước ở ngân hàng có một bước tương ứng trong chữ ký số; khác ở chỗ máy kiểm bằng toán học và ai cũng tự kiểm được.</figcaption></figure>
<p>Phần toán học này đã giải quyết xong từ lâu. Câu hỏi khó còn lại là: <strong>treo &ldquo;mẫu chữ ký&rdquo; ở đâu</strong> để người đọc tin rằng nó đúng là của tôi? Đó là việc của DID.</p>
<h2 id="3-did-là-gì">3. DID là gì? <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#3-did-l%c3%a0-g%c3%ac" aria-label="Link tới mục: 3. DID là gì?"></a></h2>
<p>DID (Decentralized Identifier, tức định danh phi tập trung) là một chuẩn quốc tế của W3C, tổ chức đặt chuẩn cho web. Chuẩn này chính thức được công bố ngày 19/7/2022.<sup id="fnref:1"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Một DID là một cái tên, có dạng:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>did:&lt;cách tra cứu&gt;:&lt;tên cụ thể&gt;
</span></span></code></pre></div><p>Mỗi DID trỏ tới một <strong>tài liệu DID</strong>: một tệp nhỏ ghi các khóa công khai của chủ nhân và mỗi khóa dùng vào việc gì. Nói theo ví dụ ngân hàng, tài liệu DID chính là <strong>tấm thẻ mẫu chữ ký</strong>, chỉ khác là treo công khai cho mọi người xem.</p>
<p>Khác biệt quan trọng nhất so với tài khoản nền tảng: <strong>không ai cấp DID cho tôi.</strong> Tôi tự tạo cặp khóa trên máy mình và tự công bố tài liệu DID. Người giữ khóa riêng là người làm chủ định danh.</p>
<p>Phần &ldquo;cách tra cứu&rdquo; quyết định tấm thẻ được treo ở đâu. Có cách ghi lên blockchain, có cách dùng mạng riêng. Tôi chọn cách đơn giản nhất: treo ngay trên blog.</p>
<h2 id="4-didweb-treo-mẫu-chữ-ký-trên-chính-blog">4. did:web: treo mẫu chữ ký trên chính blog <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#4-didweb-treo-m%e1%ba%abu-ch%e1%bb%af-k%c3%bd-tr%c3%aan-ch%c3%adnh-blog" aria-label="Link tới mục: 4. did:web: treo mẫu chữ ký trên chính blog"></a></h2>
<p>Định danh của tôi là:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>did:web:blog.phdtrung.com
</span></span></code></pre></div><p>Chữ <code>web</code> nghĩa là tài liệu DID nằm trên một website. Theo quy tắc của <code>did:web</code>, cái tên trên được đổi thành địa chỉ:<sup id="fnref:2"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>https://blog.phdtrung.com/.well-known/did.json
</span></span></code></pre></div><p>Ai mở địa chỉ đó cũng thấy khóa công khai của tôi, tên là <code>#key-1</code>. Khóa này dùng thuật toán chữ ký Ed25519<sup id="fnref:3"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> và được ghi theo định dạng Multikey của W3C.<sup id="fnref:4"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> Khóa riêng đi cặp với nó thì chỉ nằm trên máy tính của tôi.</p>
<figure class="diagram has-doc"><div class="dg-wide"><svg viewBox="0 0 560 390" role="img" aria-labelledby="dgd2-t dgd2-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd2-t">Định danh did:web của blog hoạt động thế nào</title>
<desc id="dgd2-d">Phần công khai: định danh did:web:blog.phdtrung.com được đổi thành địa chỉ blog.phdtrung.com/.well-known/did.json; tệp này chứa khóa công khai #key-1 mà ai cũng xem được. Phần bí mật: khóa riêng nằm trên máy của Trung, không rời máy, dùng để ký bài. Khóa riêng và khóa công khai là một cặp.</desc>
<defs><marker id="dgd2-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="130" y="30" text-anchor="middle" class="dg-h">Công khai trên blog</text>
<rect x="16" y="46" width="229" height="52" rx="10" class="dg-box"/>
<text x="130" y="69" text-anchor="middle" class="dg-t">did:web:blog.phdtrung.com</text>
<text x="130" y="88" text-anchor="middle" class="dg-s">định danh, như một cái tên</text>
<path d="M130 101V125" class="dg-arrow" marker-end="url(#dgd2-h)"/>
<text x="138" y="118" class="dg-s">đổi thành địa chỉ web</text>
<rect x="16" y="128" width="229" height="69" rx="10" class="dg-soft"/>
<text x="130" y="151" text-anchor="middle" class="dg-t">Tệp did.json</text>
<text x="130" y="170" text-anchor="middle" class="dg-s">blog.phdtrung.com/</text>
<text x="130" y="187" text-anchor="middle" class="dg-s">.well-known/did.json</text>
<path d="M130 200V224" class="dg-arrow" marker-end="url(#dgd2-h)"/>
<rect x="16" y="227" width="229" height="69" rx="10" class="dg-ai"/>
<text x="130" y="250" text-anchor="middle" class="dg-t">Khóa công khai #key-1</text>
<text x="130" y="269" text-anchor="middle" class="dg-s">như mẫu chữ ký: ai cũng</text>
<text x="130" y="286" text-anchor="middle" class="dg-s">xem và đối chiếu được</text>
<text x="430" y="211" text-anchor="middle" class="dg-h">Bí mật, chỉ trên máy Trung</text>
<rect x="315" y="227" width="229" height="69" rx="10" class="dg-warn"/>
<text x="430" y="250" text-anchor="middle" class="dg-t">Khóa riêng</text>
<text x="430" y="269" text-anchor="middle" class="dg-s">không rời máy, không lên mạng,</text>
<text x="430" y="286" text-anchor="middle" class="dg-s">AI không được đọc</text>
<path d="M430 299V323" class="dg-arrow" marker-end="url(#dgd2-h)"/>
<rect x="315" y="326" width="229" height="52" rx="10" class="dg-human"/>
<text x="430" y="349" text-anchor="middle" class="dg-t">Ký bài viết</text>
<text x="430" y="368" text-anchor="middle" class="dg-s">chỉ Trung tự chạy lệnh ký</text>
<path d="M248 262H311" class="dg-dash" marker-end="url(#dgd2-h)"/>
<text x="280" y="254" text-anchor="middle" class="dg-s">một cặp</text>
<text x="280" y="280" text-anchor="middle" class="dg-s">khóa</text>
</svg>
</div><div class="dg-doc"><svg viewBox="0 0 320 549" role="img" aria-labelledby="dgd2m-t dgd2m-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd2m-t">Định danh did:web của blog hoạt động thế nào</title>
<desc id="dgd2m-d">Phần công khai: định danh did:web:blog.phdtrung.com được đổi thành địa chỉ blog.phdtrung.com/.well-known/did.json; tệp này chứa khóa công khai #key-1 mà ai cũng xem được. Phần bí mật: khóa riêng nằm trên máy của Trung, không rời máy, dùng để ký bài. Khóa riêng và khóa công khai là một cặp.</desc>
<defs><marker id="dgd2m-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="160" y="30" text-anchor="middle" class="dg-h">Công khai trên blog</text>
<rect x="10" y="46" width="300" height="52" rx="10" class="dg-box"/>
<text x="160" y="69" text-anchor="middle" class="dg-t">did:web:blog.phdtrung.com</text>
<text x="160" y="88" text-anchor="middle" class="dg-s">định danh, như một cái tên</text>
<path d="M160 101V125" class="dg-arrow" marker-end="url(#dgd2m-h)"/>
<text x="168" y="118" class="dg-s">đổi thành địa chỉ web</text>
<rect x="10" y="128" width="300" height="69" rx="10" class="dg-soft"/>
<text x="160" y="151" text-anchor="middle" class="dg-t">Tệp did.json</text>
<text x="160" y="170" text-anchor="middle" class="dg-s">blog.phdtrung.com/</text>
<text x="160" y="187" text-anchor="middle" class="dg-s">.well-known/did.json</text>
<path d="M160 200V224" class="dg-arrow" marker-end="url(#dgd2m-h)"/>
<rect x="10" y="227" width="300" height="69" rx="10" class="dg-ai"/>
<text x="160" y="250" text-anchor="middle" class="dg-t">Khóa công khai #key-1</text>
<text x="160" y="269" text-anchor="middle" class="dg-s">như mẫu chữ ký: ai cũng</text>
<text x="160" y="286" text-anchor="middle" class="dg-s">xem và đối chiếu được</text>
<text x="160" y="370" text-anchor="middle" class="dg-h">Bí mật, chỉ trên máy Trung</text>
<rect x="10" y="386" width="300" height="69" rx="10" class="dg-warn"/>
<text x="160" y="409" text-anchor="middle" class="dg-t">Khóa riêng</text>
<text x="160" y="428" text-anchor="middle" class="dg-s">không rời máy, không lên mạng,</text>
<text x="160" y="445" text-anchor="middle" class="dg-s">AI không được đọc</text>
<path d="M160 458V482" class="dg-arrow" marker-end="url(#dgd2m-h)"/>
<rect x="10" y="485" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="508" text-anchor="middle" class="dg-t">Ký bài viết</text>
<text x="160" y="527" text-anchor="middle" class="dg-s">chỉ Trung tự chạy lệnh ký</text>
<path d="M160 299V350" class="dg-dash" marker-end="url(#dgd2m-h)"/>
<text x="168" y="316" class="dg-s">một cặp khóa</text>
</svg>
</div><figcaption>Phần công khai nằm trên blog cho ai cũng tra được; phần bí mật chỉ nằm trên máy tôi. Hai khóa là một cặp.</figcaption></figure>
<p>Tôi chọn <code>did:web</code> vì ba lý do:</p>
<ol>
<li><strong>Không cần blockchain, không tốn phí.</strong> Chỉ là một tệp nhỏ trên website tôi đã có.</li>
<li><strong>Dựa vào niềm tin sẵn có.</strong> Bạn đọc vốn đã biết <code>blog.phdtrung.com</code> là blog của tôi. Treo mẫu chữ ký ở đây là tận dụng đúng niềm tin đó.</li>
<li><strong>Đã được dùng thật.</strong> Ví dụ, AT Protocol, giao thức đứng sau mạng xã hội Bluesky, chấp nhận <code>did:web</code> làm định danh tài khoản.<sup id="fnref:5"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></li>
</ol>
<h2 id="5-ký-và-kiểm-một-bài-viết-diễn-ra-thế-nào">5. Ký và kiểm một bài viết diễn ra thế nào? <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#5-k%c3%bd-v%c3%a0-ki%e1%bb%83m-m%e1%bb%99t-b%c3%a0i-vi%e1%ba%bft-di%e1%bb%85n-ra-th%e1%ba%bf-n%c3%a0o" aria-label="Link tới mục: 5. Ký và kiểm một bài viết diễn ra thế nào?"></a></h2>
<p><strong>Khi ký</strong>, việc của tôi chỉ là chạy một lệnh. Máy làm ba bước:</p>
<ol>
<li>Lấy văn bản gốc của bài và tính <strong>mã băm SHA-256</strong>. Mã băm giống dấu vân tay của văn bản: mỗi văn bản cho một dấu vân tay riêng, đổi một dấu phẩy là dấu vân tay đổi hẳn.</li>
<li>Ghi một tờ khai ngắn: ai ký, bằng khóa nào, bài nào, dấu vân tay là gì, ký lúc nào.</li>
<li>Ký tờ khai đó bằng khóa riêng, đóng gói theo chuẩn JWS<sup id="fnref:6"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup> với thuật toán EdDSA,<sup id="fnref:7"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup> rồi công bố thành một tệp chữ ký trên blog.</li>
</ol>
<p><strong>Khi kiểm</strong>, người đọc làm ngược lại:</p>
<ol>
<li>Tải tệp chữ ký. Trong đó ghi bài được ký bằng khóa <code>did:web:blog.phdtrung.com#key-1</code>.</li>
<li>Tra tài liệu DID trên blog để lấy khóa công khai <code>#key-1</code>.</li>
<li>Dùng khóa công khai kiểm chữ ký, rồi tính lại dấu vân tay của bài để so.</li>
</ol>
<p>Khớp cả hai thì bài bạn đang đọc <strong>đúng nguyên văn</strong> bài mà người giữ khóa của blog đã ký.</p>
<figure class="diagram has-doc"><div class="dg-wide"><svg viewBox="0 0 560 602" role="img" aria-labelledby="dgd3-t dgd3-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd3-t">Ký một bài viết và kiểm chứng chữ ký</title>
<desc id="dgd3-d">Người viết: lấy thân bài, tính mã băm SHA-256, ký bằng khóa riêng, công bố tệp chữ ký trên blog. Người đọc: tải tệp chữ ký, đọc tên khóa #key-1, lấy khóa công khai từ did.json, kiểm chữ ký và mã băm; khớp nghĩa là bài đúng nguyên văn người giữ khóa đã ký.</desc>
<defs><marker id="dgd3-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="130" y="30" text-anchor="middle" class="dg-h">Trung ký (một lần)</text>
<rect x="16" y="46" width="229" height="52" rx="10" class="dg-box"/>
<text x="130" y="69" text-anchor="middle" class="dg-t">Thân bài</text>
<text x="130" y="88" text-anchor="middle" class="dg-s">văn bản gốc của bài viết</text>
<path d="M130 101V125" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<rect x="16" y="128" width="229" height="52" rx="10" class="dg-soft"/>
<text x="130" y="151" text-anchor="middle" class="dg-t">Mã băm SHA-256</text>
<text x="130" y="170" text-anchor="middle" class="dg-s">dấu vân tay của văn bản</text>
<path d="M130 183V207" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<rect x="16" y="210" width="229" height="52" rx="10" class="dg-human"/>
<text x="130" y="233" text-anchor="middle" class="dg-t">Ký bằng khóa riêng</text>
<text x="130" y="252" text-anchor="middle" class="dg-s">chữ ký Ed25519</text>
<path d="M130 265V289" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<rect x="16" y="292" width="229" height="52" rx="10" class="dg-soft"/>
<text x="130" y="315" text-anchor="middle" class="dg-t">Tệp chữ ký</text>
<text x="130" y="334" text-anchor="middle" class="dg-s">công bố ở /sig/&lt;tên-bài&gt;.json</text>
<text x="430" y="276" text-anchor="middle" class="dg-h">Người đọc kiểm (bất cứ lúc nào)</text>
<rect x="315" y="292" width="229" height="52" rx="10" class="dg-box"/>
<text x="430" y="315" text-anchor="middle" class="dg-t">Tải tệp chữ ký</text>
<text x="430" y="334" text-anchor="middle" class="dg-s">kèm nội dung đã ký</text>
<path d="M430 347V371" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<rect x="315" y="374" width="229" height="52" rx="10" class="dg-soft"/>
<text x="430" y="397" text-anchor="middle" class="dg-t">Lấy khóa công khai</text>
<text x="430" y="416" text-anchor="middle" class="dg-s">từ did.json theo tên #key-1</text>
<path d="M430 429V453" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<rect x="315" y="456" width="229" height="52" rx="10" class="dg-ai"/>
<text x="430" y="479" text-anchor="middle" class="dg-t">Kiểm chữ ký và mã băm</text>
<text x="430" y="498" text-anchor="middle" class="dg-s">bằng công cụ bất kỳ</text>
<path d="M430 511V535" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<rect x="315" y="538" width="229" height="52" rx="10" class="dg-human"/>
<text x="430" y="561" text-anchor="middle" class="dg-t">Khớp: đúng nguyên văn</text>
<text x="430" y="580" text-anchor="middle" class="dg-s">lệch một dấu phẩy là không khớp</text>
<path d="M248 318H311" class="dg-arrow" marker-end="url(#dgd3-h)"/>
<text x="280" y="311" text-anchor="middle" class="dg-s">công bố</text>
</svg>
</div><div class="dg-doc"><svg viewBox="0 0 320 744" role="img" aria-labelledby="dgd3m-t dgd3m-d" xmlns="http://www.w3.org/2000/svg">
<title id="dgd3m-t">Ký một bài viết và kiểm chứng chữ ký</title>
<desc id="dgd3m-d">Người viết: lấy thân bài, tính mã băm SHA-256, ký bằng khóa riêng, công bố tệp chữ ký trên blog. Người đọc: tải tệp chữ ký, đọc tên khóa #key-1, lấy khóa công khai từ did.json, kiểm chữ ký và mã băm; khớp nghĩa là bài đúng nguyên văn người giữ khóa đã ký.</desc>
<defs><marker id="dgd3m-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="160" y="30" text-anchor="middle" class="dg-h">Trung ký (một lần)</text>
<rect x="10" y="46" width="300" height="52" rx="10" class="dg-box"/>
<text x="160" y="69" text-anchor="middle" class="dg-t">Thân bài</text>
<text x="160" y="88" text-anchor="middle" class="dg-s">văn bản gốc của bài viết</text>
<path d="M160 101V125" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<rect x="10" y="128" width="300" height="52" rx="10" class="dg-soft"/>
<text x="160" y="151" text-anchor="middle" class="dg-t">Mã băm SHA-256</text>
<text x="160" y="170" text-anchor="middle" class="dg-s">dấu vân tay của văn bản</text>
<path d="M160 183V207" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<rect x="10" y="210" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="233" text-anchor="middle" class="dg-t">Ký bằng khóa riêng</text>
<text x="160" y="252" text-anchor="middle" class="dg-s">chữ ký Ed25519</text>
<path d="M160 265V289" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<rect x="10" y="292" width="300" height="52" rx="10" class="dg-soft"/>
<text x="160" y="315" text-anchor="middle" class="dg-t">Tệp chữ ký</text>
<text x="160" y="334" text-anchor="middle" class="dg-s">công bố ở /sig/&lt;tên-bài&gt;.json</text>
<text x="160" y="418" text-anchor="middle" class="dg-h">Người đọc kiểm (bất cứ lúc nào)</text>
<rect x="10" y="434" width="300" height="52" rx="10" class="dg-box"/>
<text x="160" y="457" text-anchor="middle" class="dg-t">Tải tệp chữ ký</text>
<text x="160" y="476" text-anchor="middle" class="dg-s">kèm nội dung đã ký</text>
<path d="M160 489V513" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<rect x="10" y="516" width="300" height="52" rx="10" class="dg-soft"/>
<text x="160" y="539" text-anchor="middle" class="dg-t">Lấy khóa công khai</text>
<text x="160" y="558" text-anchor="middle" class="dg-s">từ did.json theo tên #key-1</text>
<path d="M160 571V595" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<rect x="10" y="598" width="300" height="52" rx="10" class="dg-ai"/>
<text x="160" y="621" text-anchor="middle" class="dg-t">Kiểm chữ ký và mã băm</text>
<text x="160" y="640" text-anchor="middle" class="dg-s">bằng công cụ bất kỳ</text>
<path d="M160 653V677" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<rect x="10" y="680" width="300" height="52" rx="10" class="dg-human"/>
<text x="160" y="703" text-anchor="middle" class="dg-t">Khớp: đúng nguyên văn</text>
<text x="160" y="722" text-anchor="middle" class="dg-s">lệch một dấu phẩy là không khớp</text>
<path d="M160 347V398" class="dg-arrow" marker-end="url(#dgd3m-h)"/>
<text x="168" y="364" class="dg-s">công bố</text>
</svg>
</div><figcaption>Tôi ký một lần; bất kỳ ai, bất cứ lúc nào cũng kiểm được mà không cần hỏi tôi.</figcaption></figure>
<p>Bài nào đã ký sẽ có khối &ldquo;Chữ ký số&rdquo; ở cuối, kèm liên kết tới tệp chữ ký và tài liệu DID. Chính bài viết này cũng được ký. Ai biết dùng dòng lệnh có thể kiểm bằng công cụ của blog hoặc bất kỳ thư viện nào hỗ trợ chuẩn JWS. Không cần tài khoản, không cần hỏi tôi, không cần tin GitLab hay Cloudflare.</p>
<h2 id="6-chuyện-thật-trên-blog-này-khóa-cất-ở-đâu-ký-thế-nào">6. Chuyện thật trên blog này: khóa cất ở đâu, ký thế nào? <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#6-chuy%e1%bb%87n-th%e1%ba%adt-tr%c3%aan-blog-n%c3%a0y-kh%c3%b3a-c%e1%ba%a5t-%e1%bb%9f-%c4%91%c3%a2u-k%c3%bd-th%e1%ba%bf-n%c3%a0o" aria-label="Link tới mục: 6. Chuyện thật trên blog này: khóa cất ở đâu, ký thế nào?"></a></h2>
<p>Nghe &ldquo;khóa riêng&rdquo;, &ldquo;ký số&rdquo; thì dễ tưởng là thứ gì phức tạp lắm. Thực tế trên blog này đơn giản hơn nhiều.</p>
<h3 id="khóa-riêng-một-tệp-nhỏ-trên-máy-mac-của-tôi">Khóa riêng: một tệp nhỏ trên máy Mac của tôi <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#kh%c3%b3a-ri%c3%aang-m%e1%bb%99t-t%e1%bb%87p-nh%e1%bb%8f-tr%c3%aan-m%c3%a1y-mac-c%e1%bb%a7a-t%c3%b4i" aria-label="Link tới mục: Khóa riêng: một tệp nhỏ trên máy Mac của tôi"></a></h3>
<p>Khóa riêng của tôi là <strong>một tệp văn bản chỉ 3 dòng, nặng 119 byte</strong>, nằm trong một thư mục ẩn trên chiếc Mac tôi dùng hằng ngày. Không có thẻ cứng, không có thiết bị đặc biệt nào.</p>
<p>Tệp này được bảo vệ bằng ba lớp:</p>
<ul>
<li><strong>Quyền đọc:</strong> chỉ tài khoản máy tính của tôi mở được tệp. Tài khoản khác trên cùng máy cũng không đọc được.</li>
<li><strong>Mã hóa ổ đĩa:</strong> ổ đĩa của máy được mã hóa bằng FileVault. Máy bị mất cắp thì người lấy cũng không đọc được tệp nếu không có mật khẩu đăng nhập.</li>
<li><strong>Không bao giờ rời máy:</strong> tệp nằm ngoài thư mục mã nguồn của blog, nên không bị đưa lên GitLab, không gửi qua email hay chat, không đưa cho AI.</li>
</ul>
<p>Điểm yếu cũng cần nói rõ: mất tệp này (hỏng máy, xóa nhầm) là mất khả năng ký. Vì vậy khóa cần một bản sao lưu cất riêng, có mã hóa, ví dụ trên USB mã hóa hoặc trong trình quản lý mật khẩu. Còn nếu ai đó lấy được tệp, tôi phải đổi khóa ngay: treo khóa công khai mới lên blog và gỡ khóa cũ.</p>
<h3 id="mẫu-chữ-ký-một-tệp-công-khai-trên-blog">Mẫu chữ ký: một tệp công khai trên blog <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#m%e1%ba%abu-ch%e1%bb%af-k%c3%bd-m%e1%bb%99t-t%e1%bb%87p-c%c3%b4ng-khai-tr%c3%aan-blog" aria-label="Link tới mục: Mẫu chữ ký: một tệp công khai trên blog"></a></h3>
<p>Phần công khai thì ai cũng xem được tại <code>blog.phdtrung.com/.well-known/did.json</code>. Bỏ bớt các dòng kỹ thuật, nó trông như sau:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;did:web:blog.phdtrung.com&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;verificationMethod&#34;</span>: [{
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;did:web:blog.phdtrung.com#key-1&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;Multikey&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;publicKeyMultibase&#34;</span>: <span style="color:#e6db74">&#34;z6MkfqVrcqW8qHLSEfUKW64nowR6Jbi99bHfGGj4WChaZy6o&#34;</span>
</span></span><span style="display:flex;"><span>  }]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Chuỗi bắt đầu bằng <code>z6Mk…</code> chính là khóa công khai, tức &ldquo;mẫu chữ ký&rdquo;. Từ chuỗi này không ai suy ngược ra được tệp khóa riêng trên máy tôi.</p>
<h3 id="ký-một-bài-gõ-một-lệnh">Ký một bài: gõ một lệnh <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#k%c3%bd-m%e1%bb%99t-b%c3%a0i-g%c3%b5-m%e1%bb%99t-l%e1%bb%87nh" aria-label="Link tới mục: Ký một bài: gõ một lệnh"></a></h3>
<p>Khi một bài đã viết xong và tôi đã đọc duyệt lần cuối, tôi mở cửa sổ dòng lệnh trên Mac và gõ:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python3 scripts/did/sign_post.py content/posts/did-web-dinh-danh-phi-tap-trung.md
</span></span></code></pre></div><p>Trong vài giây, công cụ ký làm lần lượt:</p>
<ol>
<li>Kiểm tra tệp khóa vẫn đang được khóa quyền đọc như trên; nếu không thì dừng.</li>
<li>Đọc khóa riêng, suy ra khóa công khai và so với &ldquo;mẫu chữ ký&rdquo; đang treo trên blog. Nếu khác (ví dụ lấy nhầm khóa) thì dừng, không ký.</li>
<li>Tính dấu vân tay của bài, ghi tờ khai, ký tờ khai.</li>
<li>Ghi kết quả ra một tệp chữ ký nằm cạnh bài viết.</li>
</ol>
<p>Màn hình chỉ hiện ba dòng: địa chỉ bài, dấu vân tay và nơi lưu tệp chữ ký. Khóa riêng không bao giờ được in ra.</p>
<p>Ví dụ, tờ khai trong tệp chữ ký của lần ký đầu tiên bài này trông như sau (dấu vân tay rút gọn):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;did&#34;</span>: <span style="color:#e6db74">&#34;did:web:blog.phdtrung.com&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;kid&#34;</span>: <span style="color:#e6db74">&#34;did:web:blog.phdtrung.com#key-1&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;url&#34;</span>: <span style="color:#e6db74">&#34;https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;sha256&#34;</span>: <span style="color:#e6db74">&#34;6df08371…dae0b78&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;signedAt&#34;</span>: <span style="color:#e6db74">&#34;2026-10-22T12:54:02+07:00&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Kèm theo là chữ ký: một chuỗi khoảng 550 ký tự, chỉ khóa riêng của tôi tạo ra được.</p>
<h3 id="từ-máy-tôi-lên-blog">Từ máy tôi lên blog <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#t%e1%bb%ab-m%c3%a1y-t%c3%b4i-l%c3%aan-blog" aria-label="Link tới mục: Từ máy tôi lên blog"></a></h3>
<p>Tệp chữ ký đi lên blog theo đúng quy trình xuất bản thường ngày: lưu vào kho mã nguồn trên GitLab, mở yêu cầu hợp nhất (Merge Request), tôi duyệt, rồi hệ thống tự dựng lại trang. Trước khi đưa lên, hệ thống kiểm tra tự động còn so nội dung bài với dấu vân tay đã ký. Nếu ai sửa bài sau khi tôi ký, dù chỉ một chữ, bước kiểm tra sẽ chặn lại cho tới khi tôi ký lại.</p>
<p>Đoạn mô phỏng dưới đây tóm cả quá trình: ký trên máy tôi, kiểm trên trình duyệt của người đọc, và điều gì xảy ra khi có người sửa bài.</p>
<figure class="diagram has-doc"><div class="dg-wide"><svg viewBox="0 0 560 264" role="img" aria-labelledby="dgm-t dgm-d" class="dgm" xmlns="http://www.w3.org/2000/svg">
<title id="dgm-t">Mô phỏng: ký bài trên máy của Trung và kiểm chữ ký trên trình duyệt người đọc</title>
<desc id="dgm-d">Bên trái là cửa sổ dòng lệnh trên máy Mac: Trung gõ lệnh ký, công cụ in ra địa chỉ bài, mã băm và tệp chữ ký. Tệp chữ ký được công bố lên blog. Bên phải là trình duyệt người đọc: tải tệp chữ ký, lấy khóa #key-1 từ did.json, kiểm chữ ký Ed25519 và so mã băm, kết quả: chữ ký hợp lệ. Sau đó có người sửa một chữ trong bài, kiểm lại thì kết quả là không khớp.</desc>
<defs><marker id="dgm-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="4" y="22" class="dg-h">Máy của Trung</text>
<rect x="4" y="32" width="258" height="150" rx="10" class="dgm-term"/>
<circle cx="20" cy="46" r="4" class="dgm-dot1"/>
<circle cx="34" cy="46" r="4" class="dgm-dot2"/>
<circle cx="48" cy="46" r="4" class="dgm-dot3"/>
<text x="18" y="76" class="dg-mono dgm-s1">$ python3 sign_post.py bai.md</text>
<text x="18" y="98" class="dg-mono dgm-s2">Đã ký: …/posts/did-web-…/</text>
<text x="18" y="120" class="dg-mono dgm-s3">sha256: f98e18bb…71df42ce</text>
<text x="18" y="142" class="dg-mono dgm-s4">Tệp chữ ký: sig/….json</text>
<text x="18" y="164" class="dg-mono dgm-key">Khóa riêng không rời máy</text>
<path d="M266 107H308" pathLength="1" class="dg-arrow dgm-s5" marker-end="url(#dgm-h)"/>
<text x="288" y="99" text-anchor="middle" class="dg-s dgm-s5t">công bố</text>
<text x="314" y="22" class="dg-h">Trình duyệt người đọc</text>
<rect x="314" y="32" width="242" height="200" rx="10" class="dg-box"/>
<rect x="314" y="32" width="242" height="26" rx="10" class="dg-soft"/>
<text x="326" y="50" class="dg-s">blog.phdtrung.com/posts/did-web-…</text>
<text x="326" y="84" class="dg-s dgm-s6">1. Tải tệp chữ ký /sig/….json</text>
<text x="326" y="108" class="dg-s dgm-s7">2. Lấy khóa #key-1 từ did.json</text>
<text x="326" y="132" class="dg-s dgm-s8">3. Kiểm chữ ký Ed25519</text>
<text x="326" y="156" class="dg-s dgm-s9">4. So mã băm với bài đang đọc</text>
<g class="dgm-ok"><rect x="326" y="182" width="218" height="38" rx="8" class="dg-human"/><text x="435" y="206" text-anchor="middle" class="dg-t">✓ Chữ ký hợp lệ</text></g>
<g class="dgm-bad"><rect x="326" y="182" width="218" height="38" rx="8" class="dg-warn"/><text x="435" y="206" text-anchor="middle" class="dg-t">✗ Không khớp</text></g>
<text x="435" y="254" text-anchor="middle" class="dg-s dgm-note">Có người sửa một chữ trong bài…</text>
</svg>
</div><div class="dg-doc"><svg viewBox="0 0 320 478" role="img" aria-labelledby="dgmm-t dgmm-d" class="dgm" xmlns="http://www.w3.org/2000/svg">
<title id="dgmm-t">Mô phỏng: ký bài trên máy của Trung và kiểm chữ ký trên trình duyệt người đọc</title>
<desc id="dgmm-d">Bên trái là cửa sổ dòng lệnh trên máy Mac: Trung gõ lệnh ký, công cụ in ra địa chỉ bài, mã băm và tệp chữ ký. Tệp chữ ký được công bố lên blog. Bên phải là trình duyệt người đọc: tải tệp chữ ký, lấy khóa #key-1 từ did.json, kiểm chữ ký Ed25519 và so mã băm, kết quả: chữ ký hợp lệ. Sau đó có người sửa một chữ trong bài, kiểm lại thì kết quả là không khớp.</desc>
<defs><marker id="dgmm-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0L10 5L0 10z" class="dg-head"/></marker></defs>
<text x="10" y="22" class="dg-h">Máy của Trung</text>
<rect x="10" y="32" width="300" height="150" rx="10" class="dgm-term"/>
<circle cx="26" cy="46" r="4" class="dgm-dot1"/>
<circle cx="40" cy="46" r="4" class="dgm-dot2"/>
<circle cx="54" cy="46" r="4" class="dgm-dot3"/>
<text x="24" y="76" class="dg-mono dgm-s1">$ python3 sign_post.py bai.md</text>
<text x="24" y="98" class="dg-mono dgm-s2">Đã ký: …/posts/did-web-…/</text>
<text x="24" y="120" class="dg-mono dgm-s3">sha256: f98e18bb…71df42ce</text>
<text x="24" y="142" class="dg-mono dgm-s4">Tệp chữ ký: sig/….json</text>
<text x="24" y="164" class="dg-mono dgm-key">Khóa riêng không rời máy</text>
<path d="M160 186V218" pathLength="1" class="dg-arrow dgm-s5" marker-end="url(#dgmm-h)"/>
<text x="168" y="206" class="dg-s dgm-s5t">công bố lên blog</text>
<text x="10" y="236" class="dg-h">Trình duyệt người đọc</text>
<rect x="10" y="246" width="300" height="200" rx="10" class="dg-box"/>
<rect x="10" y="246" width="300" height="26" rx="10" class="dg-soft"/>
<text x="22" y="264" class="dg-s">blog.phdtrung.com/posts/did-web-…</text>
<text x="22" y="298" class="dg-s dgm-s6">1. Tải tệp chữ ký /sig/….json</text>
<text x="22" y="322" class="dg-s dgm-s7">2. Lấy khóa #key-1 từ did.json</text>
<text x="22" y="346" class="dg-s dgm-s8">3. Kiểm chữ ký Ed25519</text>
<text x="22" y="370" class="dg-s dgm-s9">4. So mã băm với bài đang đọc</text>
<g class="dgm-ok"><rect x="22" y="396" width="276" height="38" rx="8" class="dg-human"/><text x="160" y="420" text-anchor="middle" class="dg-t">✓ Chữ ký hợp lệ</text></g>
<g class="dgm-bad"><rect x="22" y="396" width="276" height="38" rx="8" class="dg-warn"/><text x="160" y="420" text-anchor="middle" class="dg-t">✗ Không khớp</text></g>
<text x="160" y="468" text-anchor="middle" class="dg-s dgm-note">Có người sửa một chữ trong bài…</text>
</svg>
</div><figcaption>Mô phỏng, lặp lại mỗi 14 giây: ký bằng một lệnh, công bố tệp chữ ký, người đọc tự kiểm; sửa một chữ là chữ ký không còn khớp.</figcaption></figure>
<h3 id="ranh-giới-với-ai">Ranh giới với AI <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#ranh-gi%e1%bb%9bi-v%e1%bb%9bi-ai" aria-label="Link tới mục: Ranh giới với AI"></a></h3>
<p>Blog này được vận hành cùng AI, nên tôi viết thành quy tắc bắt buộc cho mọi trợ lý AI làm việc với blog: <strong>không in, không đọc, không lưu khóa riêng; không tự chạy lệnh ký.</strong> AI được giúp viết bài, viết công cụ ký và công cụ kiểm, chuẩn bị mọi thứ, nhưng bước ký cuối cùng luôn do tôi tự gõ lệnh. Chữ ký có giá trị chính vì chỉ tôi tạo ra được nó.</p>
<h2 id="7-chữ-ký-chứng-minh-được-gì-không-chứng-minh-được-gì">7. Chữ ký chứng minh được gì, không chứng minh được gì? <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#7-ch%e1%bb%af-k%c3%bd-ch%e1%bb%a9ng-minh-%c4%91%c6%b0%e1%bb%a3c-g%c3%ac-kh%c3%b4ng-ch%e1%bb%a9ng-minh-%c4%91%c6%b0%e1%bb%a3c-g%c3%ac" aria-label="Link tới mục: 7. Chữ ký chứng minh được gì, không chứng minh được gì?"></a></h2>
<p>Công nghệ mới rất dễ bị hiểu quá lên, nên phần này tôi nói thẳng.</p>
<p><strong>Chữ ký chứng minh được:</strong></p>
<ul>
<li>Bài được ký bằng khóa đang treo trên <code>blog.phdtrung.com</code>.</li>
<li>Bài <strong>không bị sửa</strong> sau khi ký.</li>
<li>Bản sao của bài ở nơi khác, nếu kèm tệp chữ ký, thì người đọc tự kiểm được có đúng nguyên văn hay không.</li>
</ul>
<p><strong>Chữ ký không chứng minh được:</strong></p>
<ul>
<li><strong>Thời điểm viết.</strong> Giờ ký do máy tôi tự ghi. Muốn chứng minh &ldquo;đã có từ khi nào&rdquo; thì cần một nguồn độc lập, như dấu thời gian OpenTimestamps trên Bitcoin trong bài trước.</li>
<li><strong>Nội dung là đúng.</strong> Chữ ký chỉ nói &ldquo;tôi viết đoạn này và chịu trách nhiệm về nó&rdquo;, không nói đoạn này đúng.</li>
<li><strong>Tôi là ai ngoài đời.</strong> <code>did:web</code> chỉ chứng minh quyền kiểm soát một tên miền và một khóa, không gắn với căn cước công dân của tôi.</li>
</ul>
<p><strong>Điểm yếu của <code>did:web</code>:</strong></p>
<ul>
<li><strong>Chỉ an toàn bằng tên miền.</strong> Ai chiếm được tên miền hay quyền sửa blog thì có thể thay &ldquo;mẫu chữ ký&rdquo;. Chính đặc tả <code>did:web</code> thừa nhận nhiều hướng tấn công đến từ hệ thống tên miền (DNS).<sup id="fnref1:2"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
<li><strong>Không lưu lịch sử.</strong> Tệp <code>did.json</code> chỉ có phiên bản hiện tại. Khi đổi khóa, muốn kiểm các chữ ký cũ thì phải giữ khóa cũ trong tệp một thời gian, hoặc tra lịch sử của kho mã nguồn.</li>
<li><strong>Chưa phải chuẩn W3C chính thức.</strong> <code>did:web</code> do một nhóm cộng đồng của W3C soạn. Chuẩn DID nói chung thì đã chính thức.</li>
</ul>
<p><strong>Về pháp lý:</strong> chữ ký này <strong>không phải</strong> chữ ký số theo nghĩa của pháp luật Việt Nam. Luật Giao dịch điện tử yêu cầu chữ ký số phải được bảo đảm bởi chứng thư chữ ký số; với chữ ký số công cộng, chứng thư đó do tổ chức cung cấp dịch vụ chứng thực chữ ký số công cộng cấp.<sup id="fnref:8"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:8" class="footnote-ref" role="doc-noteref">8</a></sup> Chữ ký trên blog chỉ là công cụ kỹ thuật để người đọc tự kiểm, không dùng thay chữ ký số trong hợp đồng, giao dịch hay hồ sơ hành chính. (Nhận định này chỉ để tham khảo, không phải tư vấn pháp lý.)</p>
<h2 id="8-bước-tiếp-theo-từ-định-danh-đến-chứng-nhận">8. Bước tiếp theo: từ định danh đến chứng nhận <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#8-b%c6%b0%e1%bb%9bc-ti%e1%ba%bfp-theo-t%e1%bb%ab-%c4%91%e1%bb%8bnh-danh-%c4%91%e1%ba%bfn-ch%e1%bb%a9ng-nh%e1%ba%adn" aria-label="Link tới mục: 8. Bước tiếp theo: từ định danh đến chứng nhận"></a></h2>
<p>Định danh và chữ ký bài viết mới là bước đầu. Bước tiếp theo trong cùng họ chuẩn là <strong>chứng nhận có thể kiểm chứng</strong> (Verifiable Credentials), được W3C công bố chính thức ngày 15/5/2025.<sup id="fnref:9"><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fn:9" class="footnote-ref" role="doc-noteref">9</a></sup></p>
<p>Ví dụ, với định danh này tôi có thể cấp:</p>
<ul>
<li>Giấy xác nhận một người đã tham gia buổi chia sẻ hay khóa học do tôi hướng dẫn.</li>
<li>Thư giới thiệu mà người nhận tự mang đi trình, bên nhận tự kiểm chứng mà không cần gọi hỏi tôi.</li>
</ul>
<p>Tôi chưa làm phần này. Trước khi cấp chứng nhận cho người khác, tôi muốn tự dùng định danh và cách giữ khóa của mình một thời gian, xem nó có đứng vững không.</p>
<h2 id="thay-lời-kết">Thay lời kết <a class="h-anchor" href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#thay-l%e1%bb%9di-k%e1%ba%bft" aria-label="Link tới mục: Thay lời kết"></a></h2>
<p>Thử nghiệm này không giải quyết bài toán danh tính trên Internet. Nó chỉ chuyển một phần niềm tin từ &ldquo;tin vào nơi bạn thấy bài&rdquo; sang &ldquo;tự kiểm được bài có đúng nguyên văn hay không&rdquo;.</p>
<p>Ghép với dấu thời gian trên Bitcoin, một bài viết có thể mang theo hai bằng chứng độc lập: <strong>ai viết</strong> và <strong>viết từ khi nào</strong>. Cả hai đều kiểm được mà không cần hỏi tôi, cũng không cần tin bất kỳ nền tảng nào.</p>
<p>Khi nội dung giả rẻ hơn bao giờ hết, tôi nghĩ người viết nên bắt đầu ký tên mình theo cách mà máy tính cũng kiểm được.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>W3C, <a href="https://www.w3.org/TR/did-1.0/">Decentralized Identifiers (DIDs) v1.0</a>, W3C Recommendation ngày 19/7/2022.&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>W3C Credentials Community Group, <a href="https://w3c-ccg.github.io/did-method-web/">did:web Method Specification</a>: định danh không có đường dẫn được đổi thành <code>https://&lt;tên miền&gt;/.well-known/did.json</code>; mục bảo mật nêu rủi ro DNS và việc đặc tả không quy định cơ chế xác thực khi ghi tài liệu DID.&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref1:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Thuật toán chữ ký Ed25519 được chuẩn hóa trong <a href="https://www.rfc-editor.org/rfc/rfc8032">RFC 8032</a> (IETF, tháng 1/2017).&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>W3C, <a href="https://www.w3.org/TR/cid-1.0/">Controlled Identifiers v1.0</a>, W3C Recommendation ngày 15/5/2025, định nghĩa kiểu khóa <code>Multikey</code> và trường <code>publicKeyMultibase</code>.&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>AT Protocol, <a href="https://atproto.com/specs/did">DID specification</a>: giao thức hỗ trợ hai phương thức <code>did:plc</code> và <code>did:web</code>.&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>JSON Web Signature (JWS) được chuẩn hóa trong <a href="https://www.rfc-editor.org/rfc/rfc7515">RFC 7515</a> (IETF, tháng 5/2015).&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:7">
<p>Thuật toán <code>EdDSA</code> cho JOSE/JWS được định nghĩa trong <a href="https://www.rfc-editor.org/rfc/rfc8037">RFC 8037</a> (IETF, tháng 1/2017).&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:8">
<p><a href="https://vanban.chinhphu.vn/?pageid=27160&amp;docid=208421">Luật Giao dịch điện tử số 20/2023/QH15</a>, hiệu lực từ 01/7/2024. Điều 22 khoản 3: chữ ký số phải được bảo đảm bởi chứng thư chữ ký số; chữ ký số công cộng phải được bảo đảm bởi chứng thư chữ ký số của tổ chức cung cấp dịch vụ chứng thực chữ ký số công cộng.&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:8" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:9">
<p>W3C, <a href="https://www.w3.org/TR/vc-data-model-2.0/">Verifiable Credentials Data Model v2.0</a>, W3C Recommendation ngày 15/5/2025.&#160;<a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/#fnref:9" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
<p><a href="https://blog.phdtrung.com/posts/did-web-dinh-danh-phi-tap-trung/">Đọc bài trên blog</a></p>]]></content:encoded></item></channel></rss>