<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Yarmo - project</title>
    <subtitle>Blog of an Open Source developer</subtitle>
    <link rel="self" type="application/atom+xml" href="https://yarmo.eu/tags/project/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://yarmo.eu"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2020-07-01T12:00:00+00:00</updated>
    <id>https://yarmo.eu/tags/project/atom.xml</id>
    <entry xml:lang="en">
        <title>Launching Keyoxide.org</title>
        <published>2020-07-01T12:00:00+00:00</published>
        <updated>2020-07-01T12:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yarmo.eu/blog/keyoxide/"/>
        <id>https://yarmo.eu/blog/keyoxide/</id>
        
        <content type="html" xml:base="https://yarmo.eu/blog/keyoxide/">&lt;p&gt;Today, I&#x27;m excited to launch &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt;, the lightweight and FOSS solution to make basic cryptography operations accessible to regular humans.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;What_is_Keyoxide.org?&quot;&gt;What is Keyoxide.org?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; offers easy encryption, signature verification and decentralized identity proof verification based on PGP keys while demanding little in-depth knowledge about the underlying encryption program from its users.&lt;&#x2F;p&gt;
&lt;p&gt;This project aims to offer comparable functionality as services like &lt;a href=&quot;https:&#x2F;&#x2F;keybase.io&quot;&gt;Keybase&lt;&#x2F;a&gt; while reducing friction and being more open.&lt;&#x2F;p&gt;
&lt;p&gt;The project is MIT licensed, uses &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openpgpjs&#x2F;openpgpjs&quot;&gt;openpgpjs&lt;&#x2F;a&gt; and is hosted on &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;yarmo&#x2F;keyoxide&quot;&gt;Codeberg&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Why_only_encryption_and_signature_verification?&quot;&gt;Why only encryption and signature verification?&lt;&#x2F;h2&gt;
&lt;p&gt;These are the operations that are available when only having access to public keys instead of private keys. If you wish to decrypt messages and sign them, you need a keypair. If you have a keypair, you probably have the knowledge to use dedicated tools like the CLI or Kleopatra. And if you do, you probably won&#x27;t be using &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; directly yourself.&lt;&#x2F;p&gt;
&lt;p&gt;Indeed, if you possess a PGP keypair, &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; is the tool you send to others to interact with your public key more easily. Allow them to encrypt a message for you, to verify one of your signatures, to verify your online identities using decentralized proofs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;What_are_those_decentralized_identity_proofs_you_keep_mentioning?&quot;&gt;What are those decentralized identity proofs you keep mentioning?&lt;&#x2F;h2&gt;
&lt;p&gt;You know how Keybase allows you to prove you have control over accounts on certain websites and services? A great function! Fortunately for you, this function can be even better and more secure by using &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;openpgp-proofs&quot;&gt;decentralized OpenPGP identity proofs&lt;&#x2F;a&gt;. &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; will prove your identity on multiple platforms at the same time and yet, you are not required to make an account to use this function. How is that possible?&lt;&#x2F;p&gt;
&lt;p&gt;Well, it&#x27;s called &lt;em&gt;decentralized&lt;&#x2F;em&gt; for a reason: &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; doesn&#x27;t hold your proofs, your key does! Any software that can access your public key can verify these proofs for anyone. When better tooling comes around, you could verify those proofs using a mobile app, using a command-line utility, you name it. No single service holds your proof, only you do, stored inside your keypair.&lt;&#x2F;p&gt;
&lt;p&gt;I have written a &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&quot;&gt;guide&lt;&#x2F;a&gt; on how to add a proof for every platform currently supported by this website: &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;dns&quot;&gt;domains&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;lobsters&quot;&gt;Lobste.rs&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;twitter&quot;&gt;Twitter&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;github&quot;&gt;Github&lt;&#x2F;a&gt;, a &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&quot;&gt;bunch more&lt;&#x2F;a&gt; and work is in progress to support even more still. Is your beloved service not in the list? &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;yarmo&#x2F;keyoxide&quot;&gt;Open an issue or make a PR&lt;&#x2F;a&gt;! Free open-source software FTW!&lt;&#x2F;p&gt;
&lt;p&gt;Oh, that reminds me, any &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;mastodon&quot;&gt;Mastodon&lt;&#x2F;a&gt; instance can be used to prove your identity. Yes, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;keybase&#x2F;keybase-issues&#x2F;issues&#x2F;3385&quot;&gt;any&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;So_how_does_it_compare_to_Keybase?&quot;&gt;So how does it compare to Keybase?&lt;&#x2F;h2&gt;
&lt;p&gt;There&#x27;s a more complete &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;feature-comparison-keybase&quot;&gt;guide on the Keyoxide website&lt;&#x2F;a&gt;, but in a nutshell:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;more privacy-friendly by not forcing you to create an account and handing over data&lt;&#x2F;li&gt;
&lt;li&gt;more secure by not asking you to trust the service with your private keys&lt;&#x2F;li&gt;
&lt;li&gt;open-source servers (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;keybase&#x2F;client&#x2F;issues&#x2F;24105&quot;&gt;a must&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;encrypt&#x2F;verify with every public key accessible on the internet, not just those that have been uploaded to a proprietary server&lt;&#x2F;li&gt;
&lt;li&gt;almost all processing is done in the browser, no data is sent to servers*&lt;&#x2F;li&gt;
&lt;li&gt;no vendor lock-in&lt;&#x2F;li&gt;
&lt;li&gt;selfhostable&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;* Only exception is decentralized identity proof verification: some service providers do not have the correct CORS headers (like Reddit) or require APIs (like Twitter). In these rare cases, simple PHP scripts (also open-source) run the proof verification instead.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Can_I_get_an_account?&quot;&gt;Can I get an account?&lt;&#x2F;h2&gt;
&lt;p&gt;No. &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; doesn&#x27;t need your data on its servers. There are already several ways of exposing public keys on the internet, including &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;guides&#x2F;web-key-directory&quot;&gt;web key directory&lt;&#x2F;a&gt; (WKD) and dedicated servers like &lt;a href=&quot;https:&#x2F;&#x2F;keys.openpgp.org&quot;&gt;keys.openpgp.org&lt;&#x2F;a&gt;. Let&#x27;s use those instead of making yet another service where you need to upload your keys to.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Can_I_get_a_profile_page_then?&quot;&gt;Can I get a profile page then?&lt;&#x2F;h2&gt;
&lt;p&gt;Yes! Append your PGP fingerprint or WKD id to the URL and there it is!&lt;&#x2F;p&gt;
&lt;p&gt;Want an example? Here&#x27;s  my profile at&lt;br &#x2F;&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&#x2F;9f0048ac0b23301e1f77e994909f6bd6f80f485d&quot;&gt;https:&#x2F;&#x2F;keyoxide.org&#x2F;9f0048ac0b23301e1f77e994909f6bd6f80f485d&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Now you know what accounts on various services are mine, where to follow me if you wish to get updates on the project and if you wish to send me an encrypted message, that&#x27;s also just two clicks away.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;What_about_my_private_keys?&quot;&gt;What about my private keys?&lt;&#x2F;h2&gt;
&lt;p&gt;Don&#x27;t upload your private keys to the internet, period. If a service wants your private keys on their (proprietary) servers, say no.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;You_said_selfhostable?&quot;&gt;You said selfhostable?&lt;&#x2F;h2&gt;
&lt;p&gt;Well, yes! It&#x27;s not a fully supported use case just yet, but the browser does all the processing, the server is mostly just there to deliver the files to the user to perform the operations. &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;yarmo&#x2F;keyoxide&quot;&gt;Grab the code&lt;&#x2F;a&gt; and put it on your own PHP server!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Any_closing_words?&quot;&gt;Any closing words?&lt;&#x2F;h2&gt;
&lt;p&gt;I built this to provide better tooling around modern-day encryption programs and reduce the friction for less tech-savvy people when interacting with public keys.&lt;&#x2F;p&gt;
&lt;p&gt;For those who wish to use encryption programs beyond OpenPGP, &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;yarmo&#x2F;keyoxide&#x2F;issues&quot;&gt;let&#x27;s talk about this&lt;&#x2F;a&gt;. Keyoxide doesn&#x27;t have any reference to PGP in its name for a reason: it could serve as a platform for easy interaction with any public key, no matter the underlying encryption program.&lt;&#x2F;p&gt;
&lt;p&gt;And above all, I hope you see the same benefit and potential in &lt;a href=&quot;https:&#x2F;&#x2F;keyoxide.org&quot;&gt;Keyoxide.org&lt;&#x2F;a&gt; as I do and would like to see it grow as an open and accessible platform to push forward the democratization of online privacy and security.&lt;&#x2F;p&gt;
&lt;p&gt;Privacy is not a luxury.&lt;&#x2F;p&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;https:&#x2F;&#x2F;metacode.biz&#x2F;@wiktor&quot;&gt;Wiktor&lt;&#x2F;a&gt; for helping with the decentralized identity proofs.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OPSV: Open PGP Signature Verification</title>
        <published>2020-06-17T11:51:39+00:00</published>
        <updated>2020-06-17T11:51:39+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yarmo.eu/blog/opsv/"/>
        <id>https://yarmo.eu/blog/opsv/</id>
        
        <content type="html" xml:base="https://yarmo.eu/blog/opsv/">&lt;h1 id=&quot;Introduction_to_OPSV&quot;&gt;Introduction to OPSV&lt;&#x2F;h1&gt;
&lt;p&gt;I&#x27;d like to introduce a new project of mine named &lt;a href=&quot;https:&#x2F;&#x2F;opsv.foss.guru&quot;&gt;Open PGP Signature Verification&lt;&#x2F;a&gt; or OPSV, a FOSS solution for easy PGP signature verification. I have copy-pasted the README from the &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;yarmo&#x2F;opsv&quot;&gt;Codeberg repo&lt;&#x2F;a&gt; below and added a &amp;quot;Why make this project?&amp;quot; section containing opinions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;About&quot;&gt;About&lt;&#x2F;h2&gt;
&lt;p&gt;This project uses &lt;a href=&quot;https:&#x2F;&#x2F;openpgpjs.org&#x2F;&quot;&gt;openpgp.js&lt;&#x2F;a&gt; loaded in the browser, meaning all processing is done on the device itself and no data is ever sent to the server. It supports loading public keys directly through:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;plaintext input&lt;&#x2F;li&gt;
&lt;li&gt;web key directory (WKD)&lt;&#x2F;li&gt;
&lt;li&gt;HTTP Keyserver Protocol (HKP).&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;OPSV will always use the first input method it detects in the order described above.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s also possible to not provide a public key. Read more about this in the &lt;code&gt;Using no public key at all&lt;&#x2F;code&gt; section below.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Usage&quot;&gt;Usage&lt;&#x2F;h2&gt;
&lt;p&gt;Visit https:&#x2F;&#x2F;opsv.foss.guru&#x2F;. On this website, you can enter a signed message (see example below) and any of the three supported public key inputs to verify that the owner of that public key was indeed the person to have signed that message.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Example&quot;&gt;Example&lt;&#x2F;h2&gt;
&lt;p&gt;Let&#x27;s say I, Yarmo, would really like the world to know that I like pineapple. Using my private key, I&#x27;ve signed that statement so you can verify I wrote that message.&lt;&#x2F;p&gt;
&lt;p&gt;The signed statement:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#212733;color:#ccc9c2;&quot;&gt;&lt;code&gt;&lt;span&gt;-----BEGIN PGP SIGNED MESSAGE-----
&lt;&#x2F;span&gt;&lt;span&gt;Hash: SHA256
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;I like pineapple.
&lt;&#x2F;span&gt;&lt;span&gt;-----BEGIN PGP SIGNATURE-----
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;iQJDBAEBCAAtFiEEog&#x2F;Pt4tEmnyVrrtlNzZ&#x2F;SvQIetEFAl70mVUPHHlhcm1vQHlh
&lt;&#x2F;span&gt;&lt;span&gt;cm1vLmV1AAoJEDc2f0r0CHrRQXIP&#x2F;08uza9zOtmZXv5K+uPGVzDKwkgPgZJEezX7
&lt;&#x2F;span&gt;&lt;span&gt;6iQ358f1pjSRvYfQ5aB13k2epUHoqCKArMYu1zPqxhvLvvAvp8uOHABnr9NGL3El
&lt;&#x2F;span&gt;&lt;span&gt;u7UUgaeUNHkr0gxCKEq3p81abrrbbWveP8OBP4RyxmaFx13Xcj7mfDluiBHmjVvv
&lt;&#x2F;span&gt;&lt;span&gt;WU09EdH9VPlJ7WfZ+2G2ZZDHuE5XiaeP7ocugTxXXLkp33zwpDX0+ZuCIXM6fQGe
&lt;&#x2F;span&gt;&lt;span&gt;OccSffglFPdNBnfasuuxDWxTQPsEbWGOPJV+CAPmBDeApX+TBF9bovO3hw4Uozk2
&lt;&#x2F;span&gt;&lt;span&gt;VT7EAy8Hb0SOrUb3UNGxzoKv++5676IxyB4JXX0Tr9O4ZxhO8o9pEEHwirtn&#x2F;J1+
&lt;&#x2F;span&gt;&lt;span&gt;MWven4gVlWM&#x2F;6bMeUqx6ydyNc2nqF5059yfRmwGMlp09x82G4x1bcf6aDZ+5njDG
&lt;&#x2F;span&gt;&lt;span&gt;fS5T2OpXRIkZHJx8BhmZjsxiDR0KV44zwHpt06+96ef3EDWB0BcP6M+a5Rtc33zf
&lt;&#x2F;span&gt;&lt;span&gt;irRmQd2M6RLyXCYtdGIiiAFRuomw802U4F0P4LwVrZdbGA6ObqBv1k8BUFCMbMz8
&lt;&#x2F;span&gt;&lt;span&gt;Ab4hF7kO4z0Vh3JaKzcHey0pOzdNCPpAHZ51sAoAnFDM4PdMBgQxxVweCMu4KYMZ
&lt;&#x2F;span&gt;&lt;span&gt;FN8sNn42oY&#x2F;b7gDmwCelVhgD+rvUn&#x2F;a8+B7CDmCp+wIquyrjrTt00voATcb+ZPMJ
&lt;&#x2F;span&gt;&lt;span&gt;pTXJ&#x2F;NcM
&lt;&#x2F;span&gt;&lt;span&gt;=rqTX
&lt;&#x2F;span&gt;&lt;span&gt;-----END PGP SIGNATURE-----
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Use this as &amp;quot;Signature&amp;quot; on &lt;a href=&quot;https:&#x2F;&#x2F;opsv.foss.guru&#x2F;&quot;&gt;OPSV&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Using_plaintext_public_key&quot;&gt;Using plaintext public key&lt;&#x2F;h3&gt;
&lt;p&gt;Now, let&#x27;s check the signature. Go to &lt;a href=&quot;https:&#x2F;&#x2F;yarmo.eu&#x2F;pgp&quot;&gt;my personal website&lt;&#x2F;a&gt; and copy-paste the &amp;quot;plaintext&amp;quot; key in the &amp;quot;Public Key (1: plaintext)&amp;quot; field.&lt;&#x2F;p&gt;
&lt;p&gt;You will see a green message confirming that my key was used to sign this message. I really do like pineapple.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Using_web_key_directory_(WKD)&quot;&gt;Using web key directory (WKD)&lt;&#x2F;h3&gt;
&lt;p&gt;Remove the contents from the &amp;quot;Public Key (1: plaintext)&amp;quot; field. Now, in the &amp;quot;Public Key (2: web key directory)&amp;quot;, write &lt;code&gt;yarmo@yarmo.eu&lt;&#x2F;code&gt; and verify the signature again. It is still verified. Try using &lt;code&gt;jane@doe.org&lt;&#x2F;code&gt; or any other input, it won&#x27;t verify.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Using_HTTP_Keyserver_Protocol_(HKP)&quot;&gt;Using HTTP Keyserver Protocol (HKP)&lt;&#x2F;h3&gt;
&lt;p&gt;Remove the contents from the &amp;quot;Public Key (2: web key directory)&amp;quot; field. I uploaded my keys to the https:&#x2F;&#x2F;keys.openpgp.org&#x2F; HKP server, which is the default server used by OPSV. All you need to do is once again go to &lt;a href=&quot;https:&#x2F;&#x2F;yarmo.eu&#x2F;pgp&quot;&gt;my personal website&lt;&#x2F;a&gt; and copy-paste the &amp;quot;Fingerprint&amp;quot; in the &amp;quot;Public Key (3: HKP)&amp;quot; field (the second field!). Still verified!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Using_no_public_key_at_all&quot;&gt;Using no public key at all&lt;&#x2F;h3&gt;
&lt;p&gt;Wait, what? Then what am I verifying the signature against?&lt;&#x2F;p&gt;
&lt;p&gt;PGP signatures can contain the &lt;code&gt;userId&lt;&#x2F;code&gt; of the signer. If OPSV finds a &lt;code&gt;userId&lt;&#x2F;code&gt;, it will use it to perform a HKP lookup.&lt;&#x2F;p&gt;
&lt;p&gt;Remove the contents from the &amp;quot;Public Key (3: HKP)&amp;quot; field. It again verifies BUT against the information contained within the signature itself. You should carefully check the information OPSV returns. In this case, the authenticity is confirmed because the &lt;code&gt;userId&lt;&#x2F;code&gt; (yarmo@yarmo.eu) matches the one I use.&lt;&#x2F;p&gt;
&lt;p&gt;The signature below does not contain a &lt;code&gt;userId&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#212733;color:#ccc9c2;&quot;&gt;&lt;code&gt;&lt;span&gt;-----BEGIN PGP SIGNED MESSAGE-----
&lt;&#x2F;span&gt;&lt;span&gt;Hash: SHA256
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;I like pineapple.
&lt;&#x2F;span&gt;&lt;span&gt;-----BEGIN PGP SIGNATURE-----
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;iQIzBAEBCAAdFiEEog&#x2F;Pt4tEmnyVrrtlNzZ&#x2F;SvQIetEFAl70mT4ACgkQNzZ&#x2F;SvQI
&lt;&#x2F;span&gt;&lt;span&gt;etHUNBAAlswF4Q5IkPTsMELZPNHBps8CUJUeDWu3HlSz7c2U+4h2jJztHD0mDtxH
&lt;&#x2F;span&gt;&lt;span&gt;PqKzUnqQqNF1Bot&#x2F;&#x2F;5xoOcn+m6UaSCzDk1oQFwD6LlQA+ScnIXddoV3xLqzTRAMe
&lt;&#x2F;span&gt;&lt;span&gt;dyuqOoDzoVeD+fWlwisnGElYX5jHRX6tgyKNh0auR3&#x2F;crQUIJazAyeDwZFdJiwaL
&lt;&#x2F;span&gt;&lt;span&gt;ntd+d8T0BcVlVVPYN7RIp1hpT+PLIcwIsr64Myfy8SOa4cjVcQgnrhR&#x2F;Lfz9680T
&lt;&#x2F;span&gt;&lt;span&gt;LCpnSohHRiA82nMGRiapEv+s+zy1NUZnVYbU2Li+Q0nYdSoDFu0xEBYmLOxwS50H
&lt;&#x2F;span&gt;&lt;span&gt;j6kK0ZyRicNeq2T25aIlieliTmSFLHHpzi&#x2F;Zw8Yt1+FtZvWf4pstA19ahk7AQK5W
&lt;&#x2F;span&gt;&lt;span&gt;zYF2bMO2xn5D4&#x2F;pRz1P4e2NTWYeIK+ZHttc7T9ZSS9Ffo03fjcJXhson3WcQZKB5
&lt;&#x2F;span&gt;&lt;span&gt;VIGVVFnlWujNYYotmxys84OtE6ePfVRwHasIOLfknVq64RVo68Y1Pgw&#x2F;KPXSb1k6
&lt;&#x2F;span&gt;&lt;span&gt;3r+YD0mt5i&#x2F;NWpwm79G&#x2F;Aq54WI5JT905div88d0Bbpa3dScTZ2MiBJbP96pZBcKl
&lt;&#x2F;span&gt;&lt;span&gt;dpm3RnjsbCFgZqEpclrEh2SD1e8eCjrNcouWK3jIfOkaWB2xk1KvNmdyQQTs3dkP
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;CpKcCJiNVvY9ogWxg9aUuQZUn4WvCvaEkmP4dfkk9s8yAKPQf8=
&lt;&#x2F;span&gt;&lt;span&gt;=QqCq
&lt;&#x2F;span&gt;&lt;span&gt;-----END PGP SIGNATURE-----
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once again, the signature verifies. And again, it only verifies against the information contained within itself so &lt;strong&gt;that doesn&#x27;t prove anything about its authenticity&lt;&#x2F;strong&gt;. Anyone can write this and the signature will return verified.&lt;&#x2F;p&gt;
&lt;p&gt;Except now, there is no &lt;code&gt;userId&lt;&#x2F;code&gt; for easy manual verification. So, you need to either take the &lt;code&gt;keyId&lt;&#x2F;code&gt; or the &lt;code&gt;fingerprint&lt;&#x2F;code&gt; and find some other way of verifying it, for example by contacting the person who supposedly wrote the message.&lt;&#x2F;p&gt;
&lt;p&gt;In my case, you can simply visit &lt;a href=&quot;https:&#x2F;&#x2F;yarmo.eu&#x2F;pgp&quot;&gt;my personal website&lt;&#x2F;a&gt; and compare the &lt;code&gt;fingerprint&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;What_can_a_bad_actor_do?&quot;&gt;What can a bad actor do?&lt;&#x2F;h3&gt;
&lt;p&gt;One could not sign a statement with my private key: I, and only I, have access to it.&lt;&#x2F;p&gt;
&lt;p&gt;One could however simply take any of my signed messages and change the content. Like so:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#212733;color:#ccc9c2;&quot;&gt;&lt;code&gt;&lt;span&gt;-----BEGIN PGP SIGNED MESSAGE-----
&lt;&#x2F;span&gt;&lt;span&gt;Hash: SHA256
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;I like privacy invasion.
&lt;&#x2F;span&gt;&lt;span&gt;-----BEGIN PGP SIGNATURE-----
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;iQJDBAEBCAAtFiEEog&#x2F;Pt4tEmnyVrrtlNzZ&#x2F;SvQIetEFAl70la8PHHlhcm1vQHlh
&lt;&#x2F;span&gt;&lt;span&gt;cm1vLmV1AAoJEDc2f0r0CHrRDcYP&#x2F;R4Yo+xiBLHtrOEMAQQkwbxWyQgCbjS4h9iF
&lt;&#x2F;span&gt;&lt;span&gt;As86o9a+t5dKSsL4gSoB3sdNAL0a1ZOhaAU8kWaR6xN1RvCQjFr878hEf631yai6
&lt;&#x2F;span&gt;&lt;span&gt;DfF2eRZPEsjXkAzlOKlPrAvtrNwUUMSDk20rGa4A9HHdxpfrmDRIgVaz3uNr1qqc
&lt;&#x2F;span&gt;&lt;span&gt;N&#x2F;Ag3OK&#x2F;2l1pZFTqjPekqDnXwblLiuTTLFlMlS80LFKoa7zZLkE5SD5O6WQFpOK7
&lt;&#x2F;span&gt;&lt;span&gt;DwYJk1+UjWDgVugz8rSLWag0mag9Z815furPIkU9yRmE1tIjsgpCR+uJA&#x2F;e0I4bn
&lt;&#x2F;span&gt;&lt;span&gt;4Ei0M29df1QucDNv6q2WoW&#x2F;7rCMz1IY796TY&#x2F;BbdqbFk6vOUUHu596mQB+fJDNTX
&lt;&#x2F;span&gt;&lt;span&gt;jGC0SpJPhzhgoZICzK8yWJMJGoLXScYj95rCAqjYdnW&#x2F;LDdAgODCyjSOxnzdI1zi
&lt;&#x2F;span&gt;&lt;span&gt;prQf4OmayHzDjI8Bo4bl22toPdSIDt3r5MmSGXcmBrNU16ea7FC9MnR8dkKfHD55
&lt;&#x2F;span&gt;&lt;span&gt;tC3UL2Ps&#x2F;iU76kqzGAei1PKvaVqKogUGi&#x2F;kqWzfi2eg+useHRyZpJrJv3R2mE0Y2
&lt;&#x2F;span&gt;&lt;span&gt;eSLMMJ5cTuM60c0GSIPOxzBBsMRwa0HmEQ3HKgpnpkVYxoA00&#x2F;hq91kuNavqUqM+
&lt;&#x2F;span&gt;&lt;span&gt;OyOgbb21woPAG+S4OCHkOINEAooeCfhpSFtmpa87sUcfvDHUuX1ivL4rYoQO3cT2
&lt;&#x2F;span&gt;&lt;span&gt;gNfjdSiB
&lt;&#x2F;span&gt;&lt;span&gt;=tqZV
&lt;&#x2F;span&gt;&lt;span&gt;-----END PGP SIGNATURE-----
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Given the wording of the statement, you naturally doubt the origin of it being me. You run it through OPSV and indeed, this is not what I wrote!&lt;&#x2F;p&gt;
&lt;p&gt;You know me, &amp;quot;I despise privacy invasion.&amp;quot; (hint hint).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Why_make_this_project?_(with_opinions)&quot;&gt;Why make this project? (with opinions)&lt;&#x2F;h2&gt;
&lt;p&gt;This project directly targets a specific use-case of &lt;a href=&quot;https:&#x2F;&#x2F;keybase.io&quot;&gt;Keybase&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It is possible to upload your public key (don&#x27;t upload your private key…) to the Keybase servers. When you sign a message using your private key, anyone can verify that you wrote that message by simply using their &lt;a href=&quot;https:&#x2F;&#x2F;keybase.io&#x2F;verify&quot;&gt;verify page&lt;&#x2F;a&gt;. It&#x27;s really simple to use, but you&#x27;ll notice something is missing: a field asking you which key to use for the verification. What Keybase does is check the message against all of the keys it knows about and then let you know which of its users wrote and signed that message.&lt;&#x2F;p&gt;
&lt;p&gt;It is my humble opinion that this is an anti-pattern. By not being able to verify against a single key, you open the door to impersonation: I can make an account named &lt;code&gt;j0hn&lt;&#x2F;code&gt; and pretend to be &lt;code&gt;john&lt;&#x2F;code&gt;. If I write a false statement and sign it with &lt;code&gt;j0hn&lt;&#x2F;code&gt;&#x27;s key, Keybase will gladly tell you that the message is legit and signed: it is, but by the wrong person. It is up to the user to then investigate &lt;code&gt;j0hn&lt;&#x2F;code&gt;&#x27;s Keybase account and figure out if it belongs to &lt;code&gt;john&lt;&#x2F;code&gt; or some bad actor.&lt;&#x2F;p&gt;
&lt;p&gt;Considering recent events, namely Keybase&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;keybase.io&#x2F;blog&#x2F;keybase-joins-zoom&quot;&gt;acquihire by Zoom&lt;&#x2F;a&gt; and Zoom&#x27;s willingness to bend to &lt;a href=&quot;https:&#x2F;&#x2F;www.theguardian.com&#x2F;technology&#x2F;2020&#x2F;jun&#x2F;03&#x2F;zoom-privacy-law-enforcement-technology-yuan&quot;&gt;US law enforcement&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2020&#x2F;06&#x2F;11&#x2F;technology&#x2F;zoom-china-tiananmen-square.html&quot;&gt;Chinese&lt;&#x2F;a&gt; influence, combined with their &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;keybase&#x2F;client&#x2F;issues&#x2F;24105&quot;&gt;unwillingness to release the server source code&lt;&#x2F;a&gt;, I strongly urge all to &lt;a href=&quot;https:&#x2F;&#x2F;yarmo.eu&#x2F;notes&#x2F;deletekeybase&quot;&gt;#deletekeybase&lt;&#x2F;a&gt;. They are not worthy of your keys and your data. It is a mystery what happens to your keys once you give them to Keybase, and with their employers working for a company eager to please privacy-invading governments, why would you? Seriously, why would you ever give your valuable private keys to Keybase?&lt;&#x2F;p&gt;
&lt;p&gt;I was having this discussion on the fediverse recently and a privacy-minded individual still was forced to use Keybase for the simple reason it was the easiest and beginner-friendly way of verifying PGP signatures that didn&#x27;t involve installing complicated software and handling PGP keys.&lt;&#x2F;p&gt;
&lt;p&gt;Well now, there is &lt;a href=&quot;https:&#x2F;&#x2F;opsv.foss.guru&quot;&gt;OPSV&lt;&#x2F;a&gt;. It has the same intuitive copy-paste workflow as Keybase does, with the only additional step of having to copy-paste a plaintext key, email address or fingerprint (which, in my book, is a feature!). Processing is done client-side, so no data is sent to any server.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Why_include_privacy-friendly_plausible.io_stats?&quot;&gt;Why include privacy-friendly plausible.io stats?&lt;&#x2F;h3&gt;
&lt;p&gt;Well, without sounding cocky, I humbly believe this is the first project I made that could actually make a difference to people&#x27;s workflow on the internet. As such, if usage suddenly spikes, I need to know if the server can handle it.&lt;&#x2F;p&gt;
&lt;p&gt;Because asking users to accept website statistics is much in my opinion, I decided a nice compromise was to make the &lt;a href=&quot;https:&#x2F;&#x2F;plausible.io&#x2F;opsv.foss.guru&quot;&gt;statistics public&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If open statistics or any statistics at all is not to your liking, please do let me know by &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;yarmo&#x2F;opsv&#x2F;issues&quot;&gt;opening an issue&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Final_words&quot;&gt;Final words&lt;&#x2F;h2&gt;
&lt;p&gt;I hope you like this project, I know I do. OPSV allows me to use signed messages more and provide a simple and secure way to verify their authenticity without relying on big corporations. This is our web, so it&#x27;s also our duty to keep it secure.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;Update_1&quot;&gt;Update 1&lt;&#x2F;h2&gt;
&lt;p&gt;Added the &lt;code&gt;Using no public key at all&lt;&#x2F;code&gt; section.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Proposal for a Distributed Content Verification System</title>
        <published>2020-05-16T14:49:39+00:00</published>
        <updated>2020-05-16T14:49:39+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yarmo.eu/blog/dcvs-proposal/"/>
        <id>https://yarmo.eu/blog/dcvs-proposal/</id>
        
        <content type="html" xml:base="https://yarmo.eu/blog/dcvs-proposal/">&lt;p&gt;&lt;code&gt;#100DaysToOffload &amp;gt;&amp;gt; 2020-05-16 &amp;gt;&amp;gt; 018&#x2F;100&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Preamble&quot;&gt;Preamble&lt;&#x2F;h2&gt;
&lt;p&gt;This is going to be a long post. In it, I will describe a system that I have been thinking of for the last week. The way I see it, there are three possible outcomes: a) it&#x27;s genius, I&#x27;ve outdone myself and I should build it; b) it&#x27;s genius but other people have already solved this issue (perhaps in a different way); c) it&#x27;s a mediocre&#x2F;inadequate solution to a problem that doesn&#x27;t need solving. I need help in figuring out which description suits this idea the best. Let me know on the &lt;a href=&quot;https:&#x2F;&#x2F;fosstodon.org&#x2F;@yarmo&quot;&gt;fediverse&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Background&quot;&gt;Background&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;Story_1_-_Linux_Mint_hack&quot;&gt;Story 1 - Linux Mint hack&lt;&#x2F;h3&gt;
&lt;p&gt;Two short stories are required. The first is based around Linux Mint and &lt;a href=&quot;https:&#x2F;&#x2F;blog.linuxmint.com&#x2F;?p=2994&quot;&gt;what happened in 2016&lt;&#x2F;a&gt;. TLDR from the blog post: &amp;quot;Hackers made a modified Linux Mint ISO, with a backdoor in it, and managed to hack our website to point to it&amp;quot;. In addition to just linking to the modified ISO file, they also changed the MD5 hash to match their modified version.&lt;&#x2F;p&gt;
&lt;p&gt;The web is fragile. If you post MD5 hashes on your website so people can trust your software and your website gets hacked and the hashes changed, there&#x27;s no trust. This is not Linux Mint&#x27;s fault, this is the way the internet works. I have had hackers on my shared hosting servers who uploaded a whole bunch of suspicious files. Because of this, the fix was easy. But what if they just made a minor change in a single file? I would have been none the wiser.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Story_2_-_Keybase&quot;&gt;Story 2 - Keybase&lt;&#x2F;h3&gt;
&lt;p&gt;You need an external source of truth and this is what the second short story is about: Keybase. I verified my website and my accounts on various services through their website. If you know me through my fosstodon.org account, you could check if that Keybase account was really mine, and if so, you could verify that this website is really mine as well as some other accounts. A nifty solution for authenticity proof of my distributed online presence.&lt;&#x2F;p&gt;
&lt;p&gt;But there are drawbacks. The actual content on my website is not verified. The system is centralised and also not FOSS. Lastly, due to their recent acquiring, I will no longer be using Keybase.&lt;&#x2F;p&gt;
&lt;p&gt;So my new authenticity proof? My website. The links on my website are who I am on various online services. I curated those links. I checked for each one if they link to what I intended them to link to.&lt;&#x2F;p&gt;
&lt;p&gt;But that&#x27;s not enough. What if my website gets hacked? And a social link gets replaced? &amp;quot;Well, that doesn&#x27;t happen to me&amp;quot;, some might say. Fine, let&#x27;s look at a second example. Visit someone else&#x27;s personal site and click their social links. How do you know if you can trust those links? &amp;quot;So what&amp;quot;, you say? Let&#x27;s go further. You want to donate to someone using a cryptocurrency. They have their wallet on their website. Is that really their wallet though?&lt;&#x2F;p&gt;
&lt;p&gt;I think we can solve this issue the way we would want to: using a distributed system.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Proposal_for_a_Distributed_Content_Verification_System&quot;&gt;Proposal for a Distributed Content Verification System&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;Overview&quot;&gt;Overview&lt;&#x2F;h3&gt;
&lt;p&gt;The concept is based around a network of two different types of nodes: the &amp;quot;content&amp;quot; nodes and the &amp;quot;truth&amp;quot; nodes. The &amp;quot;content&amp;quot; nodes are websites with content that need to be verified. The &amp;quot;truth&amp;quot; nodes are servers that periodically check all known pages for changes.&lt;&#x2F;p&gt;
&lt;p&gt;The idea is that a hacker needs to obtain a developer&#x27;s cryptographic keypair and infiltrate both a &amp;quot;content&amp;quot; node and one or more &amp;quot;truth&amp;quot; nodes in order to get away with their malicious activity.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Step_1_-_Linking_a_&amp;quot;content&amp;quot;_node_to_a_&amp;quot;truth&amp;quot;_node&quot;&gt;Step 1 - Linking a &amp;quot;content&amp;quot; node to a &amp;quot;truth&amp;quot; node&lt;&#x2F;h3&gt;
&lt;p&gt;First, the website owner needs to make their website (&amp;quot;content&amp;quot; node) known to the network of &amp;quot;truth&amp;quot; nodes. This can either be done manually by asking someone they trust and owns a &amp;quot;truth&amp;quot; node, or &amp;quot;truth&amp;quot; nodes could implement some sort of registration form.&lt;&#x2F;p&gt;
&lt;p&gt;A valid contact method like an email address is mandatory to communicate irregularities to the website owner. A public cryptographic key is also required in order to check the signature of the hashes (see below).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Step_2_-_Updating_the_&amp;quot;truth&amp;quot;&quot;&gt;Step 2 - Updating the &amp;quot;truth&amp;quot;&lt;&#x2F;h3&gt;
&lt;p&gt;During the process of uploading the updated content of their website to their server, the website owner also sends the hashes of the updated files to the &amp;quot;truth&amp;quot; node they registered with. This could be done by using a command-line tool on the server, on the developer&#x27;s machine, it could even be part of the CI&#x2F;CD&#x2F;CD pipeline. Hashes are signed using a cryptographic keypair to make sure the website owner is the one who updated the content.&lt;&#x2F;p&gt;
&lt;p&gt;Alternatively, the &amp;quot;truth&amp;quot; node could have a web interface with a button to trigger the (near-)immediate download of the pages and computation of the hashes. However, this method does not easily allow for the cryptographic signing of the hashes and should therefore not be advised or even accepted.&lt;&#x2F;p&gt;
&lt;p&gt;Once updated, the &amp;quot;truth&amp;quot; nodes exchange the updated hashes with each other.&lt;&#x2F;p&gt;
&lt;p&gt;One thing to consider: websites can be dynamic, for example by including posts from social networks. HTML tags that contain dynamically generated content should get a specific tag so they get excluded from the hashing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Step_3_-_Verification_of_content&quot;&gt;Step 3 - Verification of content&lt;&#x2F;h3&gt;
&lt;p&gt;On a regular basis, the &amp;quot;truth&amp;quot; nodes download the pages and compute the hashes. If they match with the hashes in their database, all is well.&lt;&#x2F;p&gt;
&lt;p&gt;If a discrepancy is found, a &amp;quot;truth&amp;quot; node should ask other &amp;quot;truth&amp;quot; nodes if updates exist for this particular website and the updated hashes simply haven&#x27;t propagated yet. If so, fetch the new hashes and run this step again.&lt;&#x2F;p&gt;
&lt;p&gt;If no updated hashes are found or the new hashes still don&#x27;t match, contact the website owner and let them know something has changed on their website that they haven&#x27;t told the &amp;quot;truth&amp;quot; nodes about.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Optional_step_4_-_User_benefits&quot;&gt;Optional step 4 - User benefits&lt;&#x2F;h3&gt;
&lt;p&gt;In addition to the measures taken in step 3 when detecting anomalies, browser plugins could warn visitors of websites that the content they are seeing may not be what the website owner intended it to be.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Possible_attack_surfaces&quot;&gt;Possible attack surfaces&lt;&#x2F;h3&gt;
&lt;p&gt;If a &amp;quot;truth&amp;quot; node is hacked, hashes could easily be changed. However, signing the hashes using a cryptographic keypair should mitigate this problem. Other nodes will not trust the newly propagated hashes and will flag that &amp;quot;truth&amp;quot; node as corrupted.&lt;&#x2F;p&gt;
&lt;p&gt;If a &amp;quot;truth&amp;quot; node is hacked and the website owner&#x27;s credentials are changed, they would no longer receives notifications. Credentials should also be signed by the cryptographic keypair to make changes like these detectable.&lt;&#x2F;p&gt;
&lt;p&gt;If a &amp;quot;truth&amp;quot; node is hacked and the stored public key is modified, we have a problem. &amp;quot;Truth&amp;quot; nodes should verify each other as well to make sure no funny business like this happens.&lt;&#x2F;p&gt;
&lt;p&gt;If a &amp;quot;truth&amp;quot; node is hacked and the &amp;quot;content verification&amp;quot; code is changed, we have a problem. Again, some form of collaboration between &amp;quot;truth&amp;quot; nodes should prevent hacked &amp;quot;truth&amp;quot; nodes from doing harm to the system.&lt;&#x2F;p&gt;
&lt;p&gt;If a &amp;quot;content&amp;quot; node is hacked and new files are uploaded, the &amp;quot;truth&amp;quot; node will not be triggered as it won&#x27;t handle these files. But at least, the content displayed to visitors remains unchanged.&lt;&#x2F;p&gt;
&lt;p&gt;If a &amp;quot;content&amp;quot; node is hacked and existing files are modified, the &amp;quot;truth&amp;quot; nodes will be triggered and there&#x27;s no code on the &amp;quot;content&amp;quot; node that could prevent this from happening.&lt;&#x2F;p&gt;
&lt;p&gt;If a &amp;quot;content&amp;quot; node is hacked and existing files are modified in such a way that the hashes match, we have a problem. Proper research needs to be done to correctly implement cyptographic hashing functions to avoid this issue.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Things_that_need_to_be_worked_out&quot;&gt;Things that need to be worked out&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;How exactly does a new website enter the network?&lt;&#x2F;li&gt;
&lt;li&gt;How to coordinate page downloading and hash computation to avoid redundancy and load on the hosting server?&lt;&#x2F;li&gt;
&lt;li&gt;How to measure credibility among &amp;quot;truth&amp;quot; nodes and detect corruption of individual nodes?&lt;&#x2F;li&gt;
&lt;li&gt;How to prevent hash collision?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;Federated_AND_peer-to-peer&quot;&gt;Federated AND peer-to-peer&lt;&#x2F;h3&gt;
&lt;p&gt;The concept described above is technically based on federation. However, I initially imagined several websites hosting both their own websites and the hashes of websites they selected. This is still possible: the concept described above should support both a federated content verification system and a peer-to-peer content verification system.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
