<?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: PostQuant</title>
    <description>The latest articles on DEV Community by PostQuant (@postquant).</description>
    <link>https://dev.to/postquant</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%2F3804821%2F2c313ea5-fb47-4dc0-9f05-469549339123.png</url>
      <title>DEV Community: PostQuant</title>
      <link>https://dev.to/postquant</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/postquant"/>
    <language>en</language>
    <item>
      <title>I scanned popular open source projects for quantum-vulnerable crypto. Here's what I found.</title>
      <dc:creator>PostQuant</dc:creator>
      <pubDate>Wed, 04 Mar 2026 19:13:54 +0000</pubDate>
      <link>https://dev.to/postquant/i-scanned-popular-open-source-projects-for-quantum-vulnerable-crypto-heres-what-i-found-4p87</link>
      <guid>https://dev.to/postquant/i-scanned-popular-open-source-projects-for-quantum-vulnerable-crypto-heres-what-i-found-4p87</guid>
      <description>&lt;p&gt;NIST is deprecating RSA, ECC, and other classical cryptographic algorithms by 2030 and disallowing them entirely by 2035. The reason: quantum computers will eventually break them.&lt;/p&gt;

&lt;p&gt;I wanted to know how exposed my own projects were. So I built &lt;strong&gt;PostQuant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://github.com/postquantdev/postquant" rel="noopener noreferrer"&gt;https://github.com/postquantdev/postquant&lt;/a&gt;), a CLI that scans TLS endpoints and source code for quantum-vulnerable cryptography and gives you a letter grade.&lt;/p&gt;

&lt;p&gt;Then I pointed it at some popular open source projects. The results were interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scan Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frameworks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Critical Findings&lt;/th&gt;
&lt;th&gt;What It Found&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Django&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;MD5 in auth hashers, SHA-1 in file uploads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;RSA in OAuth2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;JS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Various classical crypto in core&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go stdlib&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;F&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;161&lt;/td&gt;
&lt;td&gt;Classical crypto throughout standard library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Express&lt;/td&gt;
&lt;td&gt;JS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gin&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Clean&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  npm Packages
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Raw Findings&lt;/th&gt;
&lt;th&gt;After Context Analysis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;uuid&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 critical&lt;/td&gt;
&lt;td&gt;4 low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;express-session&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 critical&lt;/td&gt;
&lt;td&gt;2 low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node-forge&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;C+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 critical&lt;/td&gt;
&lt;td&gt;4 critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pg&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 critical&lt;/td&gt;
&lt;td&gt;4 critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ssh2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18 critical&lt;/td&gt;
&lt;td&gt;12 critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Python Packages
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Raw Findings&lt;/th&gt;
&lt;th&gt;After Context Analysis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;requests&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 critical&lt;/td&gt;
&lt;td&gt;3 low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boto3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 critical&lt;/td&gt;
&lt;td&gt;1 informational&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;django&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 critical&lt;/td&gt;
&lt;td&gt;2 critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;paramiko&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;D-&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 critical&lt;/td&gt;
&lt;td&gt;10 critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Context Matters
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most proud of. A naive scanner just greps for algorithm names and flags everything as critical. But not all crypto usage is equal.&lt;/p&gt;

&lt;p&gt;Take MD5. The &lt;code&gt;uuid&lt;/code&gt; package uses MD5 to generate RFC 4122 checksums. That's not a security function. It's a deterministic ID generator. Flagging it as critical is noise.&lt;/p&gt;

&lt;p&gt;But Django's &lt;code&gt;auth/hashers.py&lt;/code&gt; also uses MD5. For password hashing. That's a real vulnerability.&lt;/p&gt;

&lt;p&gt;PostQuant reads the surrounding code to tell the difference. Variable names like &lt;code&gt;password&lt;/code&gt; and &lt;code&gt;authenticate&lt;/code&gt; signal real security usage. Variable names like &lt;code&gt;checksum&lt;/code&gt; and &lt;code&gt;digest&lt;/code&gt; signal non-security usage. Same algorithm, different context, different grade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# With context analysis (default)&lt;/span&gt;
npx postquant analyze ./node_modules/uuid
&lt;span class="c"&gt;# Result: A (4 findings adjusted from critical to low)&lt;/span&gt;

&lt;span class="c"&gt;# Without context analysis&lt;/span&gt;
npx postquant analyze ./node_modules/uuid &lt;span class="nt"&gt;--no-context&lt;/span&gt;
&lt;span class="c"&gt;# Result: D+ (4 critical findings)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Scan Your Own Code
&lt;/h2&gt;

&lt;p&gt;No signup, no config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scan source code&lt;/span&gt;
npx postquant analyze &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Scan a TLS endpoint&lt;/span&gt;
npx postquant scan yoursite.com

&lt;span class="c"&gt;# Show everything including low-risk findings&lt;/span&gt;
npx postquant analyze &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--show-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It supports Python, JavaScript/TypeScript, Go, and Java. 54 detection patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add It to CI/CD
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PostQuant Scan&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;quantum-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;security-events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx postquant analyze . --format sarif &amp;gt; postquant.sarif&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postquant.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Findings show up in GitHub's Security tab alongside CodeQL results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Now
&lt;/h2&gt;

&lt;p&gt;"Quantum computers are decades away" is the common response. Maybe. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NIST has already published the replacement standards (ML-KEM, ML-DSA, SLH-DSA)&lt;/li&gt;
&lt;li&gt;The deprecation timeline is set: 2030 deprecate, 2035 disallow&lt;/li&gt;
&lt;li&gt;"Harvest now, decrypt later" attacks mean data encrypted today with RSA can be stored and cracked later&lt;/li&gt;
&lt;li&gt;Migration takes years for large codebases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question isn't whether to migrate. It's whether you know what needs migrating.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/postquantdev/postquant" rel="noopener noreferrer"&gt;PostQuant on GitHub&lt;/a&gt; — MIT licensed, contributions welcome.&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>cryptography</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
