<?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: ReplikanteK</title>
    <description>The latest articles on DEV Community by ReplikanteK (@securitool).</description>
    <link>https://dev.to/securitool</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%2F3948994%2F8b9949bd-cfae-4aa5-b119-eb3956d20e41.jpeg</url>
      <title>DEV Community: ReplikanteK</title>
      <link>https://dev.to/securitool</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/securitool"/>
    <language>en</language>
    <item>
      <title>What Is a JWT and How to Inspect Its Security Claims</title>
      <dc:creator>ReplikanteK</dc:creator>
      <pubDate>Sun, 31 May 2026 09:31:03 +0000</pubDate>
      <link>https://dev.to/securitool/what-is-a-jwt-and-how-to-inspect-its-security-claims-4p2h</link>
      <guid>https://dev.to/securitool/what-is-a-jwt-and-how-to-inspect-its-security-claims-4p2h</guid>
      <description>&lt;h1&gt;
  
  
  What Is a JWT and How to Inspect Its Security Claims
&lt;/h1&gt;

&lt;p&gt;May 31, 202610 min read&lt;/p&gt;

&lt;p&gt;JSON Web Tokens (JWTs) are everywhere — API authentication, single sign-on, session management. But most developers never look inside them. That is a mistake. A misconfigured JWT can give an attacker full access to any account, bypass signature verification entirely, or escalate privileges with a single header change.&lt;/p&gt;

&lt;p&gt;This guide explains what a JWT is, how to decode it, and what security claims to inspect. You will learn to spot the misconfigurations that matter — using the &lt;a href="//../tools/jwt-decoder.html"&gt;JWT Decoder&lt;/a&gt; from SecuriTool, all client-side.&lt;/p&gt;

&lt;p&gt;Open the JWT Decoder in another tab while you read:&lt;/p&gt;

&lt;p&gt;&lt;a href="//../tools/jwt-decoder.html"&gt;JWT Decoder →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a JWT?
&lt;/h2&gt;

&lt;p&gt;A JWT is a compact, URL-safe token format defined in &lt;a href="https://datatracker.ietf.org/doc/html/rfc7519" rel="noopener noreferrer"&gt;RFC 7519&lt;/a&gt;. It carries claims (statements) about an entity — typically a user — and is signed so the recipient can verify it was issued by a trusted source.&lt;/p&gt;

&lt;p&gt;A JWT looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three Base64-encoded parts separated by dots:&lt;/p&gt;

&lt;p&gt;PartContainsExample Content&lt;br&gt;
&lt;strong&gt;Header&lt;/strong&gt;Algorithm and token type&lt;code&gt;{"alg":"HS256","typ":"JWT"}&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Payload&lt;/strong&gt;Claims (user data, permissions, timestamps)&lt;code&gt;{"sub":"1234567890","admin":true}&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Signature&lt;/strong&gt;Cryptographic verificationHMAC-SHA256(header + payload, secret)&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Inspect JWT Security Claims?
&lt;/h2&gt;

&lt;p&gt;JWTs are only as secure as their configuration. The most common vulnerabilities come from the header and payload claims — not from broken cryptography. Security researchers look for:&lt;/p&gt;

&lt;p&gt;ClaimRisk if MisconfiguredImpact&lt;br&gt;
&lt;code&gt;alg&lt;/code&gt;&lt;code&gt;none&lt;/code&gt; bypasses signature verification entirelyFull authentication bypass&lt;br&gt;
&lt;code&gt;kid&lt;/code&gt;Path injection or SQL injection via key IDCode execution, data leak&lt;br&gt;
&lt;code&gt;jwk&lt;/code&gt; / &lt;code&gt;jku&lt;/code&gt;Attacker supplies their own signing keyToken forgery&lt;br&gt;
&lt;code&gt;exp&lt;/code&gt;Missing expiration = token valid foreverPermanent session hijack&lt;br&gt;
&lt;code&gt;iss&lt;/code&gt; / &lt;code&gt;aud&lt;/code&gt;Missing validation = cross-tenant token reuseAccount takeover across tenants&lt;br&gt;
&lt;code&gt;role&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;Server trusts client-provided privilege claimsPrivilege escalation&lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-Step: Decode a JWT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copy any JWT from an &lt;code&gt;Authorization: Bearer&lt;/code&gt; header, cookie, or URL parameter.&lt;/li&gt;
&lt;li&gt;Paste it into the &lt;a href="//../tools/jwt-decoder.html"&gt;JWT Decoder&lt;/a&gt; at securitool.js.org.&lt;/li&gt;
&lt;li&gt;Read the decoded header and payload instantly.&lt;/li&gt;
&lt;li&gt;Check the critical claims listed above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything happens client-side. No token data leaves your browser.&lt;/p&gt;
&lt;h2&gt;
  
  
  Header Claims: What to Check
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The &lt;code&gt;alg&lt;/code&gt; claim
&lt;/h3&gt;

&lt;p&gt;The algorithm claim tells the server how to verify the token. This is the most attacked JWT field.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typ"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JWT"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Red flags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;alg: "none"&lt;/code&gt; — Signature verification completely disabled. The server accepts any token without checking the signature. This is the most critical JWT vulnerability.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alg: "HS256"&lt;/code&gt; with a public key in &lt;code&gt;jwk&lt;/code&gt; — Algorithm confusion. The server expects RSA but the attacker signs with HMAC using the public key as the secret.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alg&lt;/code&gt; switches between RSA and HMAC across different endpoints — inconsistent verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;kid&lt;/code&gt; claim
&lt;/h3&gt;

&lt;p&gt;Key ID tells the server which key to use for verification. It is often used as a file path or database lookup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"key-2024"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Red flags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path traversal: &lt;code&gt;"kid": "../../dev/null"&lt;/code&gt; — trick the server into using &lt;code&gt;/dev/null&lt;/code&gt; (empty key) for verification.&lt;/li&gt;
&lt;li&gt;SQL injection: &lt;code&gt;"kid": "key' OR '1'='1"&lt;/code&gt; — manipulate the key lookup query.&lt;/li&gt;
&lt;li&gt;Command injection: &lt;code&gt;"kid": "|ls -la"&lt;/code&gt; — if the server passes kid to a shell command.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;jwk&lt;/code&gt; and &lt;code&gt;jku&lt;/code&gt; claims
&lt;/h3&gt;

&lt;p&gt;These claims tell the server where to find the signing key. An attacker can point them to their own key server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://attacker.com/keys.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Attack:&lt;/strong&gt; The server fetches the attacker's public key and uses it to verify the attacker's token — which was signed with the attacker's private key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payload Claims: What to Check
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Missing expiration (&lt;code&gt;exp&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1516239022&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there is no &lt;code&gt;exp&lt;/code&gt; claim, the token never expires. An attacker who steals it has permanent access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing issuer/audience validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John Doe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;iss&lt;/code&gt; (issuer) and &lt;code&gt;aud&lt;/code&gt; (audience), a token issued by Service A can be used to access Service B. This is critical in microservice architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Privilege claims
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"superadmin"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the server trusts these client-provided claims without checking its own database, an attacker can modify the payload and escalate privileges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common JWT Attack Patterns
&lt;/h3&gt;

&lt;p&gt;AttackHow It WorksDetection&lt;br&gt;
&lt;strong&gt;alg:none&lt;/strong&gt;Remove signature, set &lt;code&gt;alg: "none"&lt;/code&gt;Server accepts unsigned tokens&lt;br&gt;
&lt;strong&gt;Key confusion&lt;/strong&gt;Use RSA public key as HMAC secretAlgorithm switches between RSA and HMAC&lt;br&gt;
&lt;strong&gt;Kid injection&lt;/strong&gt;Path traversal in &lt;code&gt;kid&lt;/code&gt; parameterTest &lt;code&gt;../../etc/passwd&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Weak secret&lt;/strong&gt;Brute-force HMAC secret with wordlistsCommon passwords like &lt;code&gt;secret&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;JKU redirect&lt;/strong&gt;Point &lt;code&gt;jku&lt;/code&gt; to attacker-controlled URLServer fetches external key&lt;/p&gt;
&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;Decode this token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Header:&lt;/strong&gt; &lt;code&gt;{"alg":"none","typ":"JWT"}&lt;/code&gt; — the &lt;code&gt;none&lt;/code&gt; algorithm means no signature verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt; &lt;code&gt;{"sub":"1234567890","name":"John Doe","admin":true}&lt;/code&gt; — admin flag set to true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt; Empty string after the second dot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; This token bypasses all authentication. Any server that does not explicitly reject &lt;code&gt;alg: none&lt;/code&gt; will accept it as valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Tool Cannot Do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cannot verify signatures&lt;/strong&gt; — the decoder shows the decoded content but does not validate whether the signature is correct. You need the server's public key or secret for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cannot detect server-side misconfigurations&lt;/strong&gt; — if the server accepts &lt;code&gt;alg: none&lt;/code&gt;, you can only find out by testing against the actual API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cannot decrypt encrypted JWTs (JWE)&lt;/strong&gt; — JWE tokens are encrypted, not just signed. The decoder will show the encrypted envelope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;JWT security is not about broken cryptography — it is about misconfigured claims. A single missing &lt;code&gt;exp&lt;/code&gt; or a permissive &lt;code&gt;alg: none&lt;/code&gt; can compromise an entire authentication system.&lt;/p&gt;

&lt;p&gt;By decoding every JWT you encounter and checking the critical claims, you can spot vulnerabilities that most developers miss.&lt;/p&gt;

&lt;p&gt;Try it with your own tokens:&lt;/p&gt;

&lt;p&gt;Decode any JWT:&lt;/p&gt;

&lt;p&gt;&lt;a href="//../tools/jwt-decoder.html"&gt;JWT Decoder →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Test for attacks (alg:none, kid injection, secret cracking):&lt;/p&gt;

&lt;p&gt;&lt;a href="//../tools/jwt-attacker.html"&gt;JWT Attacker →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Published May 31, 2026 · Practical Guide · SecuriTool&lt;/p&gt;

</description>
      <category>security</category>
      <category>jwt</category>
      <category>authentication</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Identify Hash Types: A Step-by-Step Guide</title>
      <dc:creator>ReplikanteK</dc:creator>
      <pubDate>Thu, 28 May 2026 10:32:33 +0000</pubDate>
      <link>https://dev.to/securitool/how-to-identify-hash-types-a-step-by-step-guide-jjh</link>
      <guid>https://dev.to/securitool/how-to-identify-hash-types-a-step-by-step-guide-jjh</guid>
      <description>&lt;h1&gt;
  
  
  How to Identify Hash Types: A Step-by-Step Guide
&lt;/h1&gt;

&lt;h1&gt;How to Identify Hash Types: A Step-by-Step Guide&lt;/h1&gt;

&lt;p&gt;&lt;span&gt;May 28, 2026&lt;/span&gt;&lt;span&gt;8 min read&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;When you encounter an unfamiliar string of characters during a penetration test or a CTF challenge, the first question is always: &lt;em&gt;what type of hash is this?&lt;/em&gt; Identifying the hash type determines which cracking tool to use, what attack vectors apply, and how much effort it will take to reverse it.&lt;/p&gt;

&lt;p&gt;This guide shows you how to identify 40+ hash types by analyzing their length, character set, and prefix patterns using the &lt;a href="../tools/hash-identifier.html"&gt;Hash Identifier&lt;/a&gt; from SecuriTool — all in your browser, no data sent to any server.&lt;/p&gt;

&lt;p&gt;Open the Hash Identifier in another tab while you read:&lt;/p&gt;

&lt;p&gt;&lt;a href="../tools/hash-identifier.html"&gt;Hash Identifier →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;How Hash Identification Works&lt;/h2&gt;

&lt;p&gt;Hash identification relies on three characteristics:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Clue&lt;/th&gt;
&lt;th&gt;What It Tells You&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Length&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Number of characters in the hex/base64 string&lt;/td&gt;
&lt;td&gt;32 chars → MD4/MD5/NTLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Character set&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hex (0-9a-f), Base64 (A-Za-z0-9+/), or custom&lt;/td&gt;
&lt;td&gt;Hex 40 chars → SHA-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prefix / Format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Special markers like &lt;code&gt;$2y$&lt;/code&gt;, &lt;code&gt;$6$&lt;/code&gt;, &lt;code&gt;{SSHA}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$2y$&lt;/code&gt; → bcrypt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Hash Identifier applies pattern matching across all three dimensions and returns a confidence score for each possible match.&lt;/p&gt;

&lt;h2&gt;Step 1: Paste the Hash&lt;/h2&gt;

&lt;p&gt;Go to the &lt;a href="../tools/hash-identifier.html"&gt;Hash Identifier&lt;/a&gt; page. Paste your unknown string into the text area and click &lt;strong&gt;Identify&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The tool processes everything client-side — your hash never leaves your browser.&lt;/p&gt;

&lt;h2&gt;Step 2: Read the Results&lt;/h2&gt;

&lt;p&gt;The output lists possible matches sorted by confidence score, with a visual progress bar:&lt;/p&gt;

&lt;pre&gt;→ bcrypt (60 chars) ████████░░ 86%
  Unix SHA-512 (crypt) (106 chars) ██████░░░░ 62%
  SHA-512 (128 chars) █████░░░░░ 50%&lt;/pre&gt;

&lt;p&gt;The arrow marks the best match. The percentage reflects how well the hash matches all detection criteria (length, regex pattern, and prefix).&lt;/p&gt;

&lt;h2&gt;Step 3: Identify by Length&lt;/h2&gt;

&lt;p&gt;Hash length is the fastest way to narrow down possibilities. Here is a quick reference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Length (hex)&lt;/th&gt;
&lt;th&gt;Likely Hash Types&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CRC32, Adler32&lt;/td&gt;
&lt;td&gt;Checksums, error detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MySQL ≤ 4.1&lt;/td&gt;
&lt;td&gt;Legacy MySQL password hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MD4, MD5, NTLM, LM, RIPEMD-128&lt;/td&gt;
&lt;td&gt;Legacy auth, Windows passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SHA-1, RIPEMD-160, PBKDF2-HMAC-SHA1&lt;/td&gt;
&lt;td&gt;Git commits, SSL certs, legacy APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;56&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SHA-224, SHA3-224, SHA-512/224&lt;/td&gt;
&lt;td&gt;FIPS compliance, blockchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SHA-256, SHA3-256, RIPEMD-256, GOST 256, PBKDF2-HMAC-SHA256&lt;/td&gt;
&lt;td&gt;Modern applications, TLS, Bitcoin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;96&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SHA-384, SHA3-384&lt;/td&gt;
&lt;td&gt;High-security, gov standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;128&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SHA-512, SHA3-512, Whirlpool, GOST 512&lt;/td&gt;
&lt;td&gt;Maximum security, DNSSEC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Step 4: Identify by Prefix&lt;/h2&gt;

&lt;p&gt;Password hashing algorithms use distinctive prefixes that make them instantly recognizable:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Hash Type&lt;/th&gt;
&lt;th&gt;Format Example&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;$2y$&lt;/code&gt;, &lt;code&gt;$2a$&lt;/code&gt;, &lt;code&gt;$2b$&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;bcrypt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$6$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unix SHA-512 crypt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$6$rounds=1000$salt$hash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$5$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unix SHA-256 crypt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$5$rounds=5000$salt$hash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$1$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unix MD5 crypt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$1$salt$hash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$argon2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Argon2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$argon2id$v=19$m=65536,t=3,p=4$...$...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$SHA$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bcrypt (SHA-256 variant)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$SHA$salt$hash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scrypt:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;scrypt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;scrypt:16384:8:1$...$...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;*&lt;/code&gt; (leading asterisk)&lt;/td&gt;
&lt;td&gt;MySQL 5+&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ethereum address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Step 5: Read a Real-World Example&lt;/h2&gt;

&lt;p&gt;Let us identify this hash:&lt;/p&gt;

&lt;pre&gt;$2y$12$LJ3m4ys3Lk0TSwHnbfOMiOXPm1Qm0M0v0M.0M0M0M0M0M0M0M0M0M0&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Length is 60 characters — too short for SHA-512 (128), too long for MD5 (32).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Contains &lt;code&gt;$2y$&lt;/code&gt; prefix followed by two cost digits &lt;code&gt;12$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Uses &lt;code&gt;A-Za-z0-9./&lt;/code&gt; character set (Base64 variant).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; bcrypt with cost factor 12. Used by most modern web frameworks for password storage (Rails, Django, Node.js, PHP).&lt;/p&gt;

&lt;h3&gt;Quick Reference: Common Hash Patterns&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Password hashes (modern):&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;$2y$10$...&lt;/code&gt; → bcrypt · &lt;code&gt;$argon2id$...&lt;/code&gt; → Argon2id · &lt;code&gt;$6$...&lt;/code&gt; → SHA-512 crypt&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows authentication:&lt;/strong&gt;&lt;br&gt;
32-char hex → NTLM (&lt;code&gt;aad3b435b51404eeaad3b435b51404ee&lt;/code&gt;)&lt;br&gt;
32-char uppercase hex → LM hash&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web frameworks:&lt;/strong&gt;&lt;br&gt;
32-char hex → MD5 (WordPress, Joomla, vBulletin legacy)&lt;br&gt;
40-char hex → SHA-1 (GitHub, Docker hub)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchain / Crypto:&lt;/strong&gt;&lt;br&gt;
64-char hex → SHA-256 (Bitcoin)&lt;br&gt;
&lt;code&gt;1&lt;/code&gt; or &lt;code&gt;3&lt;/code&gt; followed by 25-34 chars → Bitcoin address&lt;br&gt;
&lt;code&gt;0x&lt;/code&gt; + 40 hex → Ethereum address&lt;/p&gt;

&lt;h2&gt;When Lengths Overlap&lt;/h2&gt;

&lt;p&gt;Some hash lengths map to multiple types. A 32-character hex string could be MD4, MD5, NTLM, LM, or RIPEMD-128. Here is how to disambiguate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MD5 vs NTLM:&lt;/strong&gt; Both are 32 hex chars. NTLM hashes are Windows domain hashes, typically extracted from a Domain Controller or SAM file. MD5 is used in Linux &lt;code&gt;/etc/shadow&lt;/code&gt; (old), WordPress, and Joomla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SHA-1 vs RIPEMD-160:&lt;/strong&gt; Both 40 hex chars. SHA-1 is far more common. RIPEMD-160 appears in Bitcoin address hashing (combined with SHA-256).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRC32 vs Adler32:&lt;/strong&gt; Both 8 hex chars. CRC32 is more common in ZIP files and network protocols. Adler32 appears in zlib compression.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Hash Identifier handles overlapping cases by scoring multiple factors: exact length match, regex pattern match, and a bonus for combined matching. The highest score is your best guess.&lt;/p&gt;

&lt;h2&gt;What the Tool Cannot Do&lt;/h2&gt;

&lt;p&gt;Hash identification is pattern-based, so there are limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Salted hashes&lt;/strong&gt; look identical to unsalted ones — the tool cannot detect if a salt was used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom algorithms&lt;/strong&gt; with no public pattern will not match any known type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encoded data&lt;/strong&gt; (Base64, hex) may match multiple generic patterns — context matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collisions&lt;/strong&gt;: an MD5 hash and an NTLM hash can be identical in format. The tool cannot distinguish them without knowing the source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always combine tool output with contextual knowledge: Where did you find the hash? What system generated it? What format does the application expect?&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Hash identification is a fundamental skill for security researchers, penetration testers, and CTF players. By analyzing length, prefix, and character set, you can narrow down 40+ hash types in seconds.&lt;/p&gt;

&lt;p&gt;The Hash Identifier gives you an instant, client-side match with confidence scoring — no data leaves your machine, no terminal commands needed.&lt;/p&gt;

&lt;p&gt;Try it with your own hashes:&lt;/p&gt;

&lt;p&gt;Identify any hash:&lt;/p&gt;

&lt;p&gt;&lt;a href="../tools/hash-identifier.html"&gt;Hash Identifier →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Published May 28, 2026 · Practical Guide · SecuriTool&lt;/p&gt;



</description>
      <category>security</category>
      <category>cryptography</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Check If Your Email Is Protected with SPF, DKIM and DMARC</title>
      <dc:creator>ReplikanteK</dc:creator>
      <pubDate>Sun, 24 May 2026 12:04:52 +0000</pubDate>
      <link>https://dev.to/securitool/como-comprobar-si-tu-email-esta-protegido-con-spf-dkim-y-dmarc-1c6</link>
      <guid>https://dev.to/securitool/como-comprobar-si-tu-email-esta-protegido-con-spf-dkim-y-dmarc-1c6</guid>
      <description>&lt;h1&gt;
  
  
  How to Check If Your Email Is Protected with SPF, DKIM and DMARC
&lt;/h1&gt;

&lt;h1&gt;How to Check If Your Email Is Protected with SPF, DKIM and DMARC&lt;/h1&gt;

&lt;p&gt;&lt;span&gt;May 24, 2026&lt;/span&gt;&lt;span&gt;8 min read&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;If you own a domain and use email, you need three DNS records to keep your messages out of spam folders and prevent impersonation: &lt;strong&gt;SPF, DKIM, and DMARC&lt;/strong&gt;. Without them, anyone can send forged emails from your domain (phishing, spoofing).&lt;/p&gt;

&lt;p&gt;This guide walks you through checking whether your domain has them configured correctly using the &lt;a href="../tools/email-security.html"&gt;Email Security Checker&lt;/a&gt; from SecuriTool, and how to interpret each result.&lt;/p&gt;

&lt;p&gt;✅ Open the checker in another tab while you read:&lt;/p&gt;

&lt;p&gt;&lt;a href="../tools/email-security.html"&gt;Email Security Checker →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;What Are SPF, DKIM, and DMARC?&lt;/h2&gt;

&lt;p&gt;These three email authentication mechanisms work together. None is sufficient on its own:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Record&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;What It Protects Against&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SPF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lists the servers authorized to send email for your domain&lt;/td&gt;
&lt;td&gt;Anyone sending from an unauthorized IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DKIM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Digitally signs emails with a public key in your DNS&lt;/td&gt;
&lt;td&gt;Message tampering in transit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DMARC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tells receivers what to do when SPF or DKIM fail (none/quarantine/reject)&lt;/td&gt;
&lt;td&gt;Direct domain spoofing and phishing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Step 1: Open the Email Security Checker&lt;/h2&gt;

&lt;p&gt;Navigate to the &lt;a href="../tools/email-security.html"&gt;Email Security Checker&lt;/a&gt;. You will see a single input field for a domain name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The entire analysis runs in your browser via DNS-over-HTTPS. No data is sent to any server — not your domain, not the results.&lt;/p&gt;

&lt;h2&gt;Step 2: Enter Your Domain&lt;/h2&gt;

&lt;p&gt;Type the domain you want to check (for example, &lt;code&gt;example.com&lt;/code&gt;) and click "Check". The tool queries DNS records and displays results within seconds.&lt;/p&gt;

&lt;h2&gt;Step 3: Interpret the Results&lt;/h2&gt;

&lt;h3&gt;SPF&lt;/h3&gt;

&lt;p&gt;A correct SPF record looks like this:&lt;/p&gt;

&lt;pre&gt;v=spf1 include:_spf.google.com ~all&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Pass:&lt;/strong&gt; A valid SPF record exists. You will see the list of authorized servers.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;SoftFail&lt;/strong&gt; or &lt;code&gt;~all&lt;/code&gt;: SPF exists but is not strict — unauthorized servers are marked as suspicious but not rejected.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Not found:&lt;/strong&gt; No SPF record. Your emails can be spoofed trivially.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Error:&lt;/strong&gt; Too many DNS lookups (exceeds 10). Many receivers will ignore the SPF entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;🔧 How to Fix SPF&lt;/h3&gt;

&lt;p&gt;For Google Workspace, add this TXT record to your DNS:&lt;/p&gt;

&lt;pre&gt;v=spf1 include:_spf.google.com ~all&lt;/pre&gt;

&lt;p&gt;For Microsoft 365:&lt;/p&gt;

&lt;pre&gt;v=spf1 include:spf.protection.outlook.com ~all&lt;/pre&gt;

&lt;p&gt;Once verified, change &lt;code&gt;~all&lt;/code&gt; to &lt;code&gt;-all&lt;/code&gt; to reject unauthorized senders.&lt;/p&gt;

&lt;h3&gt;DKIM&lt;/h3&gt;

&lt;p&gt;DKIM requires two parts: a public key in your DNS (generated by your email provider) and signing enabled on your mail server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Valid:&lt;/strong&gt; A DKIM key was found with correct format. The selector and key details are shown.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Weak:&lt;/strong&gt; The key uses RSA 1024-bit or less. Consider upgrading to 2048-bit.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Not found:&lt;/strong&gt; No DKIM record. Generate one from your email provider and add it to DNS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;🔧 How to Set Up DKIM&lt;/h3&gt;

&lt;p&gt;In Google Workspace: Admin → Apps → Gmail → Authenticate email → Generate new record. Copy the TXT record to your DNS.&lt;/p&gt;

&lt;p&gt;In Microsoft 365: Admin portal → Exchange → Protection → DKIM → Enable and rotate keys.&lt;/p&gt;

&lt;h3&gt;DMARC&lt;/h3&gt;

&lt;p&gt;DMARC is the policy that decides what happens when SPF or DKIM fail. Without DMARC, attackers can spoof your domain even if you have SPF and DKIM.&lt;/p&gt;

&lt;p&gt;A typical DMARC policy:&lt;/p&gt;

&lt;pre&gt;v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Pass:&lt;/strong&gt; DMARC is configured with a policy. The tool displays the active policy.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Monitoring&lt;/strong&gt; (&lt;code&gt;p=none&lt;/code&gt;): DMARC exists but enforces nothing. Useful for initial testing, but does not actively protect.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Not found:&lt;/strong&gt; No DMARC record. No spoofing protection.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Monitor only, no blocking&lt;/td&gt;
&lt;td&gt;First few days to ensure no false positives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=quarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Suspicious emails go to spam&lt;/td&gt;
&lt;td&gt;Transition phase after monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Emails failing SPF/DKIM are rejected&lt;/td&gt;
&lt;td&gt;Goal state. Full protection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;🔧 How to Implement DMARC Gradually&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Week 1:&lt;/strong&gt; &lt;code&gt;v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com&lt;/code&gt; — observe only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2:&lt;/strong&gt; Review DMARC reports (sent to the rua email). If clean, escalate to &lt;code&gt;p=quarantine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; Move to &lt;code&gt;p=reject&lt;/code&gt; — full spoofing protection&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;BIMI (Bonus)&lt;/h3&gt;

&lt;p&gt;BIMI displays your brand logo next to verified emails in Gmail and Apple Mail. The tool checks this too.&lt;/p&gt;

&lt;p&gt;Requirements for BIMI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DMARC set to &lt;code&gt;p=reject&lt;/code&gt; or &lt;code&gt;p=quarantine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Logo in SVG format hosted on your domain&lt;/li&gt;
&lt;li&gt;Optional VMC (Verified Mark Certificate)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Complete Example&lt;/h2&gt;

&lt;p&gt;Here is what results look like for a well-configured domain:&lt;/p&gt;

&lt;pre&gt;📧 Email Security Report — example.com

╔════════════════════════════════════╗
║ SPF:  ✅ Pass                      ║
║       v=spf1 include:_spf.google.com ~all ║
╠════════════════════════════════════╣
║ DKIM: ✅ Valid (selector: google)  ║
║       RSA 2048 bits                ║
╠════════════════════════════════════╣
║ DMARC: ✅ Pass (p=reject)          ║
║       rua: mailto:dmarc@example.com║
╠════════════════════════════════════╣
║ BIMI: ✅ Logo found                ║
║       selectors: google,_domainkey ║
╚════════════════════════════════════╝
📊 Grade: A+&lt;/pre&gt;

&lt;p&gt;The overall &lt;strong&gt;Grade&lt;/strong&gt; summarizes the state of all three mechanisms. An A or A+ means all three are properly configured.&lt;/p&gt;

&lt;h2&gt;FAQ&lt;/h2&gt;

&lt;h3&gt;How often should I check my configuration?&lt;/h3&gt;

&lt;p&gt;At least once a month. Email providers change their servers (Google, Microsoft) and your records may become outdated. Also check after changing email providers or hosting.&lt;/p&gt;

&lt;h3&gt;Can I have SPF without DMARC?&lt;/h3&gt;

&lt;p&gt;Yes, but it is not recommended. DMARC is the only mechanism that tells the receiver what to do when SPF or DKIM fails. Without it, each server decides independently — and many will still deliver fraudulent email.&lt;/p&gt;

&lt;h3&gt;What does "too many DNS lookups" mean in SPF?&lt;/h3&gt;

&lt;p&gt;The standard allows a maximum of 10 DNS lookups per SPF check. Each &lt;code&gt;include:&lt;/code&gt;, &lt;code&gt;redirect=&lt;/code&gt;, or &lt;code&gt;mx&lt;/code&gt; counts as one. If you exceed 10, servers may ignore your SPF entirely.&lt;/p&gt;

&lt;h3&gt;Does the checker store my domain?&lt;/h3&gt;

&lt;p&gt;No. All analysis runs in your browser via DNS-over-HTTPS. No data is sent to any server. Verify this by opening developer tools (F12 → Network tab) while running a check.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;SPF, DKIM, and DMARC are the foundation of email security. Configuring them correctly protects your domain against spoofing, improves deliverability, and is a requirement for any organization using professional email.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="../tools/email-security.html"&gt;Email Security Checker&lt;/a&gt; to test your domain now — it takes under a minute and is completely private.&lt;/p&gt;

&lt;p&gt;🔍 Check your domain now:&lt;/p&gt;

&lt;p&gt;&lt;a href="../tools/email-security.html"&gt;Email Security Checker →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Published May 24, 2026 · Practical Guide · SecuriTool&lt;/p&gt;



</description>
      <category>security</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
