<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: dchest</title><link>https://news.ycombinator.com/user?id=dchest</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 21 Jun 2026 09:19:00 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=dchest" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by dchest in "Stop Using JWTs"]]></title><description><![CDATA[
<p>Being able to quickly reject invalid sessions identifiers is a useful property in some cases and is normally done by authenticating stateful session tokens with a MAC using a global app key. This can be used for DoS protection if the cost of a database lookup is more than the cost of MAC, and the complexity is justified. It ensures that the random numbers a user is trying to present as their session token are the numbers generated by the server if the key is not leaked.<p>Because you're trying to bolt things on top of JWT, you're creating a worse version of that stateful authentication pattern:<p>1. You lost the statelessness of JWT by making database queries. Your claim that "you  don't need to verify against user's secret immediately" is false, as you need to do that in all cases immediately after verifying the JWT signature to get the benefits of your system (token invalidation). Sure, you reject completely invalid tokens early, but you still need the statefulness to authenticate users properly (if your goal is to be able to invalidate tokens).<p>2. In your version, getting a read-only access to the user database (leaking per-user secrets) completely destroys token invalidation, and all your authentication now depends on one key. If, in addition to that, the JWT signing key leaks, user authentication is completely destroyed and can be bypassed by the attacker, who now can sign in as any user. (A common way to leak all this is by failing to properly secure backups).<p>Compared to a stateful session system with split-tokens, where the database stores tokenId => verifier, where verifier is Hash(randomToken), and user's token is id||randomToken, read-only access to the database doesn't let the attacker authenticate as any user. If the tokens that users presents are in the form of id||randomToken||HMAC(serverKey, id||randomToken) for early rejection as above, leaking serverKey still won't allow the attacker to authenticate as any user. The attacker needs write access.<p>> Is author's brain stateless -- my bad, I thought this was not reddit<p>I didn't realize that you were the author, I thought you were a reader who was misled by this blog post. Even better: you can go and edit it, removing "stateless" everywhere! It's fun to invent various protocols, but when someone points out the errors, surely you'd want to fix them -- no shame in making mistakes if you correct them.<p>Usually, when I think of a protocol, after writing down "Benefits" (as in your blog post), I write "Drawbacks" and then try to come up with downsides and compare it with existing protocols. I'd suggest you do the same.<p>PS. Find yourself in this picture: <a href="http://cryto.net/%7Ejoepie91/blog/2016/06/19/stop-using-jwt-for-sessions-part-2-why-your-solution-doesnt-work/" rel="nofollow">http://cryto.net/%7Ejoepie91/blog/2016/06/19/stop-using-jwt-...</a></p>
]]></description><pubDate>Wed, 17 Jun 2026 07:20:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48566932</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48566932</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48566932</guid></item><item><title><![CDATA[New comment by dchest in "Stop Using JWTs"]]></title><description><![CDATA[
<p>WTF:<p>> Each user has a secret: Stored securely in the database.<p>> Stateless Validation: The core validation remains stateless. We only need to consult the database for the user's secret, which we'd likely do anyway for authorization checks.<p>Is "stateless" the same as "serverless" now? Is author's brain stateless?</p>
]]></description><pubDate>Tue, 16 Jun 2026 22:23:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=48563046</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48563046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48563046</guid></item><item><title><![CDATA[New comment by dchest in "Stop Using JWTs"]]></title><description><![CDATA[
<p>Yeah, you made a revocation list but with time value instead of the token value.</p>
]]></description><pubDate>Tue, 16 Jun 2026 22:13:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=48562928</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48562928</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48562928</guid></item><item><title><![CDATA[New comment by dchest in "TIL: You can make HTTP requests without curl using Bash /dev/TCP"]]></title><description><![CDATA[
<p>It's interesting that most of the comments here are about using this feature to bypass security restrictions (whether valid or not). It says a lot about the attack surface of GNU utilities caused by featuritis.</p>
]]></description><pubDate>Tue, 16 Jun 2026 18:26:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48559768</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48559768</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48559768</guid></item><item><title><![CDATA[New comment by dchest in "Chopped, Stored, Secured – The Story of the Hash Function"]]></title><description><![CDATA[
<p>Oops, of course, thanks for correction!</p>
]]></description><pubDate>Mon, 15 Jun 2026 18:03:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48544918</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48544918</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48544918</guid></item><item><title><![CDATA[New comment by dchest in "Chopped, Stored, Secured – The Story of the Hash Function"]]></title><description><![CDATA[
<p>> just a block cipher in the category of endofunctors<p>A block cipher is just a keyed pseudorandom permutation! :)<p>Imagine that we have arranged all numbers from 0 to 115792089237316195423570985008687907853269984665640564039457584007913129639936 (2^256-1) in an array and then shuffled that array 115792089237316195423570985008687907853269984665640564039457584007913129639936 (2^256) times uniquely, each time recording the resulting shuffled array.<p>Here's the Go-like type:<p>var perm [115792089237316195423570985008687907853269984665640564039457584007913129639936]uint256<p>This is an unkeyed permutation (we can already build a secure hash function like SHA-3 from it, e.g. SHA-3 uses [2^1600]uint1600 permutation, while Ascon-Hash uses [2^320]uint320. The best we can do with ours is 2^127.5 collision security).<p>A keyed permutation takes 2^256 of these arrays, again shuffled differently and uniquely, so we have:<p>var keyedPerm [115792089237316195423570985008687907853269984665640564039457584007913129639936][115792089237316195423570985008687907853269984665640564039457584007913129639936]uint256<p>A block cipher is just P[k][p] where k and p are indexes into the arrays. Let's call <i>k</i> the key and <i>p</i> the plaintext — first we select one particular permutation using the key, and then select the resulting number (ciphertext) using the plaintext.<p>A simple hash function built from this keyed permutation splits the message into 256-bit numbers and then selects permutations using the message as k, and previous value as p and adds them together:<p><pre><code>   h = (some starting number called IV)
   h += keyedPerm[m[0]][h]
   h += keyedPerm[m[1]][h]
</code></pre>
This is SHA-2, SHA-1, MD5, etc, and with a slight variation and a larger block cipher, BLAKE(1,2,3).<p>Of course, it's physically impossible to have that much memory for the arrays and it's physically impossible to shuffle that many times, so a block cipher is an approximation of that by smashing and rearranging bits, hoping to cause diffusion and confusion.</p>
]]></description><pubDate>Mon, 15 Jun 2026 08:34:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48538328</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48538328</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48538328</guid></item><item><title><![CDATA[New comment by dchest in "macOS Container Machines"]]></title><description><![CDATA[
<p>Did you use their volumes for node_modules or a shared dir? I mounted the whole project directory (with node_modules) inside the container and it seems to work fine (MBA M1 8 GB RAM).</p>
]]></description><pubDate>Wed, 10 Jun 2026 06:37:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48472311</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48472311</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48472311</guid></item><item><title><![CDATA[New comment by dchest in "Apple reveals new AI architecture built around Google Gemini models"]]></title><description><![CDATA[
<p>The are not a "gatekeeper" under DMA (not enough users). Same as macOS.</p>
]]></description><pubDate>Mon, 08 Jun 2026 20:50:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48451804</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48451804</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48451804</guid></item><item><title><![CDATA[New comment by dchest in "Android will now warn you if a caller is impersonating someone you know"]]></title><description><![CDATA[
<p>That's almost what it does? It's in the article:<p>> "When a contact calls you and you're both using Phone by Google, their device sends a silent confirmation signal in real time to your device to verify the call is legitimate and truly coming from the contact's device," Google writes in a blog explaining the new feature. "Because this digital handshake uses end-to-end encrypted Rich Communication Services (RCS) technology, it is completely private."</p>
]]></description><pubDate>Tue, 02 Jun 2026 20:39:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=48375945</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48375945</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48375945</guid></item><item><title><![CDATA[New comment by dchest in "Cloudflare Turnstile requiring fingerprintable WebGL"]]></title><description><![CDATA[
<p>They'll just tell you to clear cookies and use Chrome.</p>
]]></description><pubDate>Mon, 01 Jun 2026 07:58:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48353851</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48353851</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48353851</guid></item><item><title><![CDATA[New comment by dchest in "Debian ZFS packaging team add warning, ZFS unsupported since Linux 6.12"]]></title><description><![CDATA[
<p>"RT kernels"</p>
]]></description><pubDate>Thu, 28 May 2026 12:30:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307994</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48307994</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307994</guid></item><item><title><![CDATA[New comment by dchest in "BBEdit 16"]]></title><description><![CDATA[
<p>Well, obviously, software can't do things that the author didn't write code for. But AppKit components do get updated with some new features even if the original software didn't have support for them originally.</p>
]]></description><pubDate>Fri, 22 May 2026 12:34:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=48235009</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48235009</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48235009</guid></item><item><title><![CDATA[New comment by dchest in "BBEdit 16"]]></title><description><![CDATA[
<p>> For instance, an app can't start using Apple Intelligence if it's compiled with an older version of the SDK that doesn't know that such a thing exists.<p>That's not true, it became available in all NSTextViews by default, although with a bit different look.</p>
]]></description><pubDate>Thu, 21 May 2026 23:48:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48230184</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48230184</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48230184</guid></item><item><title><![CDATA[New comment by dchest in "Native all the way, until you need text"]]></title><description><![CDATA[
<p>Fun fact: the original iPhone's UITextField and UITextView were backed by WebKit (<a href="https://x.com/kocienda/status/1400484168199401477" rel="nofollow">https://x.com/kocienda/status/1400484168199401477</a>)</p>
]]></description><pubDate>Mon, 18 May 2026 10:24:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48177560</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48177560</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48177560</guid></item><item><title><![CDATA[New comment by dchest in "Ask HN: We just had an actual UUID v4 collision..."]]></title><description><![CDATA[
<p>How does a high-reliability system have a broken /dev/random? You're better off fixing it rather than trying to fix every downstream component that uses it. You can put your AES-128 counter there if you can count reliably.</p>
]]></description><pubDate>Sat, 09 May 2026 12:57:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=48074631</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=48074631</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48074631</guid></item><item><title><![CDATA[New comment by dchest in "Ask.com has closed"]]></title><description><![CDATA[
<p>That was after IAC:<p>"Additional acquisitions in 2006 included ShoeBuy.com,[46] which the company later sold to Jet,[47] and Connected Ventures including CollegeHumor and Vimeo".</p>
]]></description><pubDate>Sat, 02 May 2026 07:38:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=47984262</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=47984262</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47984262</guid></item><item><title><![CDATA[New comment by dchest in "20 years on AWS and never not my job"]]></title><description><![CDATA[
<p>Colin, if I remember correctly, you first ran Tarsnap servers on Ubuntu before you made FreeBSD work on EC2. At what point were you confident enough to switch to FreeBSD?</p>
]]></description><pubDate>Sat, 11 Apr 2026 08:08:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=47728549</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=47728549</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47728549</guid></item><item><title><![CDATA[New comment by dchest in "OpenRouter Raises $120M at a $1.3B Valuation"]]></title><description><![CDATA[
<p>They are a marketplace for model providers, which is quite a nice business model.</p>
]]></description><pubDate>Sat, 04 Apr 2026 21:45:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=47643782</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=47643782</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47643782</guid></item><item><title><![CDATA[New comment by dchest in "Show HN: Apfel – The free AI already on your Mac"]]></title><description><![CDATA[
<p><a href="https://webmachinelearning.github.io/prompt-api/" rel="nofollow">https://webmachinelearning.github.io/prompt-api/</a><p>Already in Chrome as an origin trial: <a href="https://developer.chrome.com/docs/ai/prompt-api" rel="nofollow">https://developer.chrome.com/docs/ai/prompt-api</a></p>
]]></description><pubDate>Fri, 03 Apr 2026 13:38:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47626536</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=47626536</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47626536</guid></item><item><title><![CDATA[Show HN: ThreePointTwo – Utility-first inline attributes for the World Wide Web]]></title><description><![CDATA[
<p>Article URL: <a href="https://dchest.github.io/threepointtwo/">https://dchest.github.io/threepointtwo/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47599795">https://news.ycombinator.com/item?id=47599795</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 01 Apr 2026 12:13:01 +0000</pubDate><link>https://dchest.github.io/threepointtwo/</link><dc:creator>dchest</dc:creator><comments>https://news.ycombinator.com/item?id=47599795</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47599795</guid></item></channel></rss>