<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FortSignal</title>
    <description>The latest articles on DEV Community by FortSignal (@fortsignal).</description>
    <link>https://dev.to/fortsignal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3896537%2Fc91b583b-8345-4df6-b82a-335d7ff4853c.png</url>
      <title>DEV Community: FortSignal</title>
      <link>https://dev.to/fortsignal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fortsignal"/>
    <language>en</language>
    <item>
      <title>Why Login Isn't Enough: Cryptographic Intent Verification for AI Agents</title>
      <dc:creator>FortSignal</dc:creator>
      <pubDate>Fri, 24 Apr 2026 18:40:47 +0000</pubDate>
      <link>https://dev.to/fortsignal/why-login-isnt-enough-cryptographic-intent-verification-for-ai-agents-1if3</link>
      <guid>https://dev.to/fortsignal/why-login-isnt-enough-cryptographic-intent-verification-for-ai-agents-1if3</guid>
      <description>&lt;p&gt;Most authentication systems solve the wrong problem.&lt;br&gt;&lt;br&gt;
                                                                                                                                                                                                                 They verify identity at login — "are you who you say you are?" — then trust every action that follows. That worked fine when humans were the only ones taking actions. It breaks down fast when AI agents are   involved.                                                                                                                                                                                                       &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap nobody talks about&lt;/strong&gt;                                                                                                                                                                                      &lt;/p&gt;

&lt;p&gt;An agent logs in with valid credentials. It has a valid session. It makes a request to transfer $50,000 to an external account. Every auth check passes. The action executes.                                   &lt;/p&gt;

&lt;p&gt;Was that supposed to happen? Nobody knows. There's no proof a human approved it. There's no record of what parameters were actually signed off on. There's no way to tell if the amount or recipient was&lt;br&gt;&lt;br&gt;
tampered with between when the action was initiated and when it executed.&lt;/p&gt;

&lt;p&gt;This is the intent gap — the space between "authenticated" and "authorized to do this specific thing right now."                                                                                                &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cryptographic intent verification&lt;/strong&gt;                                                                                                                                                                               &lt;/p&gt;

&lt;p&gt;FortSignal closes this gap. Before any sensitive action executes:                                                                                                                                               &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your backend calls /challenge/start with the exact action parameters — action, amount, recipient
&lt;/li&gt;
&lt;li&gt;FortSignal hashes those exact values into a challenge&lt;/li&gt;
&lt;li&gt;The user's hardware signs that challenge via WebAuthn (Face ID, Touch ID, security key)
&lt;/li&gt;
&lt;li&gt;/challenge/verify checks the signature and enforces your policy rules
&lt;/li&gt;
&lt;li&gt;Returns decision: allow or deny with a signed receipt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If anything changes between step 1 and step 4 — amount, recipient, anything — the hash won't match and it's a deny. Cryptographic proof, not just a checkbox.                                                   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For AI agents&lt;/strong&gt;                                                                                                                                                                                                   &lt;/p&gt;

&lt;p&gt;Agents don't use WebAuthn — there's no human present. Instead, agents sign with an Ed25519 private key on the server. A human pre-approves a delegation scope from the dashboard — allowed actions, max amount&lt;br&gt;&lt;br&gt;
per action, allowed recipients, expiry. The agent operates autonomously within those bounds.&lt;/p&gt;

&lt;p&gt;Every agent action is checked against:                                                                                                                                                                          &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Valid Ed25519 signature&lt;/li&gt;
&lt;li&gt;Within delegation scope approved by a human
&lt;/li&gt;
&lt;li&gt;Within policy constraints
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Revoke a delegation instantly. The agent's next action is denied — no waiting for a token to expire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two separate layers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Intent fields (action, amount, recipient) are per-request — what gets cryptographically signed. Policy is persistent rules you configure once in your dashboard. Both must pass for allow. A valid signature on a $1M transfer still gets denied if your policy caps actions at $5,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why now&lt;/strong&gt;         &lt;/p&gt;

&lt;p&gt;AI agents are being dropped into production apps right now. Developers don't have a good answer for "how do I make sure my agent doesn't do something it shouldn't?" Existing auth systems weren't built for this. WebAuthn alone doesn't solve it — you need parameter binding, policy enforcement, and agent delegation on top.&lt;/p&gt;

&lt;p&gt;npm install &lt;a class="mentioned-user" href="https://dev.to/fortsignal"&gt;@fortsignal&lt;/a&gt;/sdk                                                                                                                                                                                     &lt;/p&gt;

&lt;p&gt;Full docs at fortsignal.com/docs. Patent pending on the parameter binding system.                                                                                                                               &lt;/p&gt;

&lt;p&gt;Would love to hear how others are solving this problem — or if you're building something where this fits. &lt;br&gt;
&lt;a href="https://dev.tourl"&gt;fortsignal.com &lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
  </channel>
</rss>
