<?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: Sanjoy Karmakar</title>
    <description>The latest articles on DEV Community by Sanjoy Karmakar (@sanjoy_karmakar_044).</description>
    <link>https://dev.to/sanjoy_karmakar_044</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4020553%2F5443de49-3715-4f4a-9e26-61f35e7b0655.png</url>
      <title>DEV Community: Sanjoy Karmakar</title>
      <link>https://dev.to/sanjoy_karmakar_044</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanjoy_karmakar_044"/>
    <language>en</language>
    <item>
      <title>What is data classification, and why should you do it before you share a file?</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Thu, 20 Aug 2026 11:17:29 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/what-is-data-classification-and-why-should-you-do-it-before-you-share-a-file-2fce</link>
      <guid>https://dev.to/sanjoy_karmakar_044/what-is-data-classification-and-why-should-you-do-it-before-you-share-a-file-2fce</guid>
      <description>&lt;p&gt;Before you send a file, there's a question worth asking that most people skip: how sensitive is this, actually? &lt;strong&gt;Data classification&lt;/strong&gt; is the practice of answering that question systematically — sorting a document into a sensitivity tier (typically Public, Internal, Confidential, or Restricted) so the handling matches the risk. A price list and a spreadsheet of customer card numbers shouldn't travel the same way, and classification is what tells you which is which before you hit send.&lt;/p&gt;

&lt;p&gt;Frameworks like ISO/IEC 27001 (Annex A, information classification) and NIST's guidance on categorizing information sensitivity both build on this same idea: not all data deserves the same protection, so label it first and let the label drive the controls — encrypt this, restrict access to that, delete the other thing on a schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually gets checked
&lt;/h2&gt;

&lt;p&gt;Classifying a document by hand means reading it and judging what's inside — slow, and easy to miss something in a long file. A faster starting point is pattern matching: scan the text for the kinds of data that &lt;em&gt;always&lt;/em&gt; raise the sensitivity level if present, regardless of context.&lt;/p&gt;

&lt;p&gt;FileX's &lt;a href="https://files.cybxsan.com/tools/data-classification-tagger/" rel="noopener noreferrer"&gt;Data Classification Tagger&lt;/a&gt; does exactly this, entirely in your browser. It reuses the same detector set as the &lt;a href="https://files.cybxsan.com/tools/anonymize-personal-data/" rel="noopener noreferrer"&gt;Anonymize tool&lt;/a&gt; — emails, phone numbers, dates of birth, IP addresses, and financial or government-ID identifiers — but instead of redacting what it finds, it counts and categorizes it to suggest a level:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Triggered by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Restricted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A financial account or government-ID pattern: card numbers, IBAN, SSN, PAN, Aadhaar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Confidential&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Personal contact information: email, phone, date of birth, IP address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Internal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Something else the detectors flagged (e.g. a bare URL), but nothing in the two tiers above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No built-in pattern matched anything&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The financial and government-ID identifiers aren't matched by shape alone. Card numbers are checked with a Luhn checksum, Aadhaar numbers with a Verhoeff checksum, and IBANs with the mod-97 check the IBAN standard itself defines — the same validation math banks and payment systems use to reject a mistyped number. That cuts down on a plain 16-digit string in a log file getting flagged as a card just because it happens to be the right length.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it won't catch
&lt;/h2&gt;

&lt;p&gt;This is pattern matching, not comprehension. It can't tell that a paragraph describes an unannounced acquisition, that a spreadsheet of employee names is sensitive even with no email or phone number attached, or that a photo shows something confidential in the background. Nothing that isn't a recognizable, checksummable pattern will trip a detector — and a tool that only looks for pattern matches can't have an opinion about context, tone, or intent.&lt;/p&gt;

&lt;p&gt;That's why FileX describes the result as a &lt;em&gt;suggested&lt;/em&gt; classification, not a certified one. It's a fast triage pass for a document you're about to send: if it comes back Restricted, you know to stop and think before it goes anywhere. If it comes back Public, that's a reasonable starting signal, not a legal guarantee — you still know your own document better than a regex does, and the tool's report says so explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  From classification to action
&lt;/h2&gt;

&lt;p&gt;A level only matters if it changes what you do next. A practical mapping:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Restricted&lt;/strong&gt; — encrypt before sending. FileX's &lt;a href="https://files.cybxsan.com/tools/encrypt-files-in-browser/" rel="noopener noreferrer"&gt;Encrypt tool&lt;/a&gt; locks any file behind a password with AES-256-GCM before it leaves your device; think about whether the recipient needs the raw identifiers at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidential&lt;/strong&gt; — same instinct, lighter touch: encryption in transit, and consider whether personal details need to be there before sharing more broadly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal&lt;/strong&gt; — fine for internal channels, not for a public link or an open bucket.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public&lt;/strong&gt; — nothing here should surprise you if it leaked, but it's worth having checked rather than assumed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a file needs to go out with names, card numbers, or contact details stripped rather than just protected, that's a different job: the &lt;a href="https://files.cybxsan.com/tools/anonymize-personal-data/" rel="noopener noreferrer"&gt;Anonymize tool&lt;/a&gt; redacts, masks, or pseudonymizes the same categories of data the classifier flags, so you can hand over a version that no longer carries the sensitive fields at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it before you send
&lt;/h2&gt;

&lt;p&gt;Classification is a five-second check that catches the fifteen-minute-later "wait, did that file have customer data in it?" moment. Drop a document into the &lt;a href="https://files.cybxsan.com/tools/data-classification-tagger/" rel="noopener noreferrer"&gt;Data Classification Tagger&lt;/a&gt; — it reads the file locally, never uploads it, and tells you in seconds what it found and what tier it suggests.&lt;/p&gt;

</description>
      <category>dataclassification</category>
      <category>pii</category>
      <category>compliance</category>
    </item>
    <item>
      <title>How to build a data retention schedule (without inventing the periods yourself)</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Thu, 20 Aug 2026 11:17:27 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/how-to-build-a-data-retention-schedule-without-inventing-the-periods-yourself-29i4</link>
      <guid>https://dev.to/sanjoy_karmakar_044/how-to-build-a-data-retention-schedule-without-inventing-the-periods-yourself-29i4</guid>
      <description>&lt;p&gt;Most "data retention policy" documents fail for the same reason: someone typed in a period that sounded reasonable — "keep for 7 years," "delete after 90 days" — without it actually coming from anywhere. A retention schedule is only as good as the periods in it, and no software can tell you what those periods should be. What software &lt;em&gt;can&lt;/em&gt; do is take the periods you already know and turn them into something concrete: a document, and a set of dates you'll actually see again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the one thing a tool can't give you: the periods
&lt;/h2&gt;

&lt;p&gt;A data retention schedule needs three things per category of data: how long to keep it, what starts the clock, and why. The "why" — the legal or business basis — is what makes the period defensible instead of arbitrary. Tax records might follow a statute of limitations. Support tickets might follow an internal policy. Marketing data you collected with consent might follow whatever you told people in your consent notice.&lt;/p&gt;

&lt;p&gt;None of that comes from a calculator. It comes from your legal or compliance advisor, the specific law that applies to your jurisdiction and industry, or a documented internal decision. If you don't have those periods yet, get them before you build the schedule — a schedule full of guessed numbers is worse than no schedule, because it looks authoritative.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a retention schedule actually needs to record
&lt;/h2&gt;

&lt;p&gt;Once you have the periods, each line in the schedule needs five things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data category&lt;/strong&gt; — specific enough to be useful ("customer support tickets," not "data")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retention period&lt;/strong&gt; — a duration, like 3 years or 90 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger&lt;/strong&gt; — the event the clock starts from: date collected, last activity, contract or relationship end, account closure, or something else you specify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start date&lt;/strong&gt; — the day that trigger actually happened, if it already has&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basis&lt;/strong&gt; — the law, contract clause, or internal policy that justifies the period&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That structure matters because of a distinction that is easy to get backwards. The question isn't &lt;em&gt;which&lt;/em&gt; trigger a row uses — it's whether that trigger has already happened. A contract that ended last June is a known date, just as much as data collected on a known day, and both give you a review date you can compute right now. What you genuinely cannot compute is a trigger still in the future: a contract that hasn't ended, an account still open. Nobody knows those dates yet, because they depend on when the event actually happens. A schedule that pretends otherwise is fabricating a date it can't back up.&lt;/p&gt;

&lt;p&gt;FileX's &lt;a href="https://files.cybxsan.com/tools/retention-policy-calculator/" rel="noopener noreferrer"&gt;Retention Policy Calculator&lt;/a&gt; is built around that distinction directly, and it's worth being precise about what the tool does and doesn't do: it holds &lt;strong&gt;no retention periods, no legal defaults, and no jurisdiction-specific rules of its own.&lt;/strong&gt; Every period, trigger, start date, and basis on the schedule is something you typed in. The tool's job is arithmetic and assembly — give any row a start date and it works out the review/delete date from your period, then formats the whole set of categories into a readable document. Leave the start date blank on a row whose trigger hasn't happened yet and it records the rule without pretending to know the date, and says so. It's also explicit about the difference between a date you supplied and one it assumed: a row marked "date collected" with no start date is read as collected today, and its date is labelled an example rather than presented as fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning the schedule into reminders you'll actually see
&lt;/h2&gt;

&lt;p&gt;A retention schedule that lives in a document nobody reopens doesn't get enforced — it gets forgotten until an audit or a breach notification forces someone to go looking. The Retention Policy Calculator addresses that with a downloadable &lt;code&gt;.ics&lt;/code&gt; calendar file: one reminder event per category, but only for rows where a review date could actually be calculated (a start date plus a valid period). Import it into whatever calendar you already use, and the review date shows up as a real appointment with a one-day-ahead alarm, not a line in a PDF you'll have to remember to check.&lt;/p&gt;

&lt;p&gt;Categories whose trigger hasn't happened yet still appear in the schedule text — they're just not on the calendar, because there's no date yet to put there. When that event does happen (the contract ends, the account closes), that's your cue to come back, fill in the start date, and let the tool calculate the real review date from the rule you already recorded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where retention fits with what you've already told people
&lt;/h2&gt;

&lt;p&gt;If you collect personal data from users, your retention period isn't a private decision — it's something you likely already disclosed. FileX's &lt;a href="https://files.cybxsan.com/tools/consent-notice-generator/" rel="noopener noreferrer"&gt;Consent Notice Generator&lt;/a&gt; includes a retention field in the notice it produces, precisely because "how long do you keep this" is a question a consent notice is expected to answer. Keeping the two in sync matters: a retention schedule that keeps customer data for 5 years while your public notice says 2 years is a discrepancy someone will eventually notice, and it undermines both documents.&lt;/p&gt;

&lt;p&gt;The practical order is: decide the periods with your legal or compliance advisor first, state them consistently in your consent notice, then build the schedule from the same numbers. A tool can keep those two documents structurally aligned; it can't make the underlying decision for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest limits, stated plainly
&lt;/h2&gt;

&lt;p&gt;A generated retention schedule is a formatting and date-arithmetic aid, not a compliance certification. It won't tell you that a period is legally correct, and it won't catch a period that's wrong for your jurisdiction. What it will do is turn periods you already know into a document with correctly computed dates, and turn every row whose trigger has already happened into a calendar reminder you're actually likely to see. That's a real, bounded piece of the work — not the legal judgment part, which stays yours.&lt;/p&gt;

&lt;p&gt;Try the &lt;a href="https://files.cybxsan.com/tools/retention-policy-calculator/" rel="noopener noreferrer"&gt;Retention Policy Calculator&lt;/a&gt; with your own categories and periods — nothing is uploaded, the schedule and the calendar file are both built entirely in your browser.&lt;/p&gt;

</description>
      <category>retentionpolicy</category>
      <category>compliance</category>
      <category>consent</category>
    </item>
    <item>
      <title>What makes a file-handling report "audit-ready"?</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Tue, 11 Aug 2026 14:49:22 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/what-makes-a-file-handling-report-audit-ready-1kc4</link>
      <guid>https://dev.to/sanjoy_karmakar_044/what-makes-a-file-handling-report-audit-ready-1kc4</guid>
      <description>&lt;p&gt;"We anonymized the file, then encrypted it" is a sentence. Written in an email or a shared doc, it's a claim a reviewer either trusts or doesn't — there's nothing stopping someone from editing it after the fact, or writing it before the work was ever done. Calling that record "audit-ready" doesn't change what it is.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;audit-ready report&lt;/strong&gt;, as FileX builds it, is different in one specific, checkable way: it's &lt;strong&gt;tamper-evident&lt;/strong&gt;. Understanding exactly what that does and doesn't prove is the difference between using it well and overselling it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the report actually is: an attestation, not a verification
&lt;/h2&gt;

&lt;p&gt;FileX's &lt;a href="https://files.cybxsan.com/tools/audit-ready-report-generator/" rel="noopener noreferrer"&gt;Audit-Ready Report tool&lt;/a&gt; lets you record what was done to a file — classified, anonymized, metadata-scrubbed, encrypted, password-protected, watermarked, securely erased, or another action you specify — along with when it happened and any notes. It's important to be precise about what this is: &lt;strong&gt;it's an attestation the operator builds, not an independent audit.&lt;/strong&gt; FileX doesn't watch you do the work and verify each action actually happened. It records what you entered. The report's disclaimer says this directly: it "attests to actions the operator recorded for this file... it is not an independent audit and not a compliance certification — it is only as accurate as what was entered."&lt;/p&gt;

&lt;p&gt;That's not a limitation to hide — it's the honest boundary of what a client-side tool can promise. FileX never sees your infrastructure, your ticketing system, or your actual workflow. It can't independently confirm a file was really encrypted somewhere else. What it &lt;em&gt;can&lt;/em&gt; do is turn your attestation into something that can't be silently edited later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the actual value is: the integrity hash, and the optional signature
&lt;/h2&gt;

&lt;p&gt;The report does one more thing on top of your attestation: at generation time, FileX scans supported text files (plain text, and text extracted from PDF and Word documents, entirely in your browser) using the same detectors as the &lt;a href="https://files.cybxsan.com/tools/data-classification-tagger/" rel="noopener noreferrer"&gt;Data Classification tool&lt;/a&gt; — patterns for emails, phone numbers, card numbers, and other personal or financial data — and attaches a suggested sensitivity level to the record.&lt;/p&gt;

&lt;p&gt;Then the whole record — your recorded actions, the file's SHA-256, the classification scan, your notes — gets hashed with SHA-256 into an &lt;strong&gt;integrity hash&lt;/strong&gt;. Recompute that hash later over the same data and compare it to the one in the report: if they match, nothing has been altered since the report was generated. That check needs no key, no server, and no trust in FileX itself — anyone can redo the arithmetic.&lt;/p&gt;

&lt;p&gt;Signing is a separate, optional layer on top. You can sign the report's integrity hash with your &lt;a href="https://files.cybxsan.com/tools/create-a-filex-id/" rel="noopener noreferrer"&gt;FileX ID&lt;/a&gt; using &lt;strong&gt;ML-DSA-65&lt;/strong&gt;, the same NIST-standardized (FIPS 204) post-quantum signature algorithm FileX uses for its erasure certificates — a fixed context string keeps the two signature types from being interchangeable. An unsigned report is still fully tamper-evident — the hash check works regardless. Signing adds attribution: proof of &lt;em&gt;who&lt;/em&gt; generated the report, tied to a specific FileX ID, verifiable independent of FileX's own systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading a report
&lt;/h2&gt;

&lt;p&gt;Each report bundles a few things: a plain-text summary, the machine-readable JSON record, and a formatted HTML or PDF version with the same data embedded so it stays independently verifiable — open the HTML report and the underlying JSON is right there to re-check. The report lists your file's name, size, and SHA-256; your recorded actions; the classification scan (if one ran); your notes; and finally the integrity hash and signature status.&lt;/p&gt;

&lt;p&gt;That structure is deliberate. It separates "what the operator says happened" (the actions and notes — trust these the same way you'd trust any human-entered record) from "what can be mathematically checked" (the hash, and the signature if present). A reviewer who understands that split gets real information out of the report instead of false confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this is worth using
&lt;/h2&gt;

&lt;p&gt;If you're the only one who'll ever see the record, a plain note is fine. An audit-ready report earns its place when the record needs to survive contact with someone else — a client, an auditor, a compliance reviewer, or your future self trying to reconstruct what happened to a file six months later. The tamper-evidence means the report can't be quietly edited after review without the hash breaking; the optional signature means it can be traced to a specific identity years later, even against a future with quantum computers capable of breaking today's non-post-quantum signatures.&lt;/p&gt;

&lt;p&gt;Try the &lt;a href="https://files.cybxsan.com/tools/audit-ready-report-generator/" rel="noopener noreferrer"&gt;Audit-Ready Report Generator&lt;/a&gt; on a file — nothing is uploaded, the classification scan and the report itself run entirely in your browser.&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>audit</category>
      <category>signedevidence</category>
    </item>
    <item>
      <title>What is a signed erasure certificate, and why does it matter?</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Tue, 11 Aug 2026 14:49:20 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/what-is-a-signed-erasure-certificate-and-why-does-it-matter-57de</link>
      <guid>https://dev.to/sanjoy_karmakar_044/what-is-a-signed-erasure-certificate-and-why-does-it-matter-57de</guid>
      <description>&lt;p&gt;A spreadsheet that says "wiped: yes" proves nothing. Anyone with edit access can change "yes" after the fact, or write it before the wipe ever ran. If a compliance reviewer, a client, or an auditor has to take that row on faith, it isn't evidence — it's a claim.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;signed erasure certificate&lt;/strong&gt; is different: it's built so that any change to it is detectable, and — optionally — so that the party who issued it can be cryptographically tied to it. Here's what those two guarantees actually rest on, and how to check one yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two separate claims, two separate mechanisms
&lt;/h2&gt;

&lt;p&gt;A trustworthy erasure record has to answer two different questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Has this record been altered since it was issued?&lt;/strong&gt; (tamper-evidence)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who issued it?&lt;/strong&gt; (attribution)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FileX's certificate format answers the first one always, and the second one only if the person generating it chooses to sign. They're independent layers, and conflating them is the most common way "signed certificate" claims get oversold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer one: the integrity hash (always present, no key required)
&lt;/h2&gt;

&lt;p&gt;Every certificate — from the in-browser &lt;a href="https://files.cybxsan.com/tools/securely-erase-files/" rel="noopener noreferrer"&gt;Eraser tool&lt;/a&gt; or the downloadable FileX Eraser Tool CLI — is a JSON record: an operation ID, a timestamp, the erasure method used, the list of items and their status, and a plain-language disclaimer about what the method does and doesn't guarantee.&lt;/p&gt;

&lt;p&gt;To make that record tamper-evident, FileX serializes it with a &lt;strong&gt;canonical form&lt;/strong&gt; — object keys sorted recursively, then compact JSON — and hashes that with SHA-256. The result is stored on the record itself as &lt;code&gt;integritySha256&lt;/code&gt;. Anyone can recompute the hash over the same canonical form and compare it to what's stored: if a single byte of the operation details changed after the fact, the hash won't match.&lt;/p&gt;

&lt;p&gt;This costs nothing to check — no key, no trust in FileX, no network call. It's the same reason a checksum can prove a download wasn't corrupted; here it proves an erasure record wasn't edited after it was generated. (If checksums are new to you, see &lt;a href="https://files.cybxsan.com/blog/file-checksum-sha256-how-to-verify/" rel="noopener noreferrer"&gt;how SHA-256 verification works&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;What the hash alone &lt;em&gt;doesn't&lt;/em&gt; prove is who generated the record. Anyone can run the eraser and get a validly-hashed certificate — the hash says "unaltered," not "issued by a specific person or organization."&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer two: the signature (optional, proves who)
&lt;/h2&gt;

&lt;p&gt;For that, FileX offers an &lt;strong&gt;optional&lt;/strong&gt; digital signature using &lt;strong&gt;ML-DSA-65&lt;/strong&gt;, a post-quantum signature algorithm standardized as FIPS 204. When you sign a certificate, FileX signs the certificate's &lt;code&gt;integritySha256&lt;/code&gt; digest with your &lt;strong&gt;FileX ID&lt;/strong&gt; — the same identity used elsewhere in FileX for quantum-safe encryption — and attaches the signature alongside a &lt;code&gt;kid&lt;/code&gt; (a short fingerprint of your FileX ID's public keys) and the public key needed to verify it.&lt;/p&gt;

&lt;p&gt;Two details matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The signature covers the &lt;em&gt;hash&lt;/em&gt;, which already commits to the entire canonical record — so signing the hash is equivalent to signing the whole certificate.&lt;/li&gt;
&lt;li&gt;The signing context string is domain-separated (&lt;code&gt;FileX-cert-sig-v1&lt;/code&gt;) from FileX's other ML-DSA uses, like signed audit reports or signed FXQ files. A signature made for one purpose can't be replayed as proof for another.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because signing is tied to your FileX ID's &lt;code&gt;kid&lt;/code&gt;, a recipient who already recognizes that fingerprint — say, from a past encrypted exchange — has a second, independent reason to trust the signer, not just the hash.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;unsigned&lt;/strong&gt; certificate is still fully tamper-evident; it's just not attributable to anyone in particular. Whether you need the signature depends on whether the person receiving the certificate needs to know it was &lt;em&gt;you specifically&lt;/em&gt; who ran the wipe, versus just that the record wasn't altered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying one yourself
&lt;/h2&gt;

&lt;p&gt;You don't need FileX's servers to check a certificate — there aren't any in this flow, and there's nothing to trust but math. The &lt;a href="https://files.cybxsan.com/tools/verify-erasure-certificate/" rel="noopener noreferrer"&gt;Verify Certificate tool&lt;/a&gt; takes a certificate JSON file, recomputes the canonical hash locally, and reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the hash matches (tamper-evidence intact or broken)&lt;/li&gt;
&lt;li&gt;if a signature is present, whether it verifies against the embedded public key, and the signer's &lt;code&gt;kid&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recomputing happens entirely in your browser. Nothing about the certificate you're checking gets uploaded anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the guarantee stops
&lt;/h2&gt;

&lt;p&gt;A signed certificate proves the record wasn't altered, and optionally who signed it. It does &lt;strong&gt;not&lt;/strong&gt; upgrade what the underlying erasure method actually achieved. The certificate's own disclaimer says this plainly: the in-browser Eraser performs a best-effort &lt;strong&gt;logical&lt;/strong&gt; wipe — overwrite, then delete — which is &lt;a href="https://csrc.nist.gov/pubs/sp/800/88/r1/final" rel="noopener noreferrer"&gt;NIST SP 800-88&lt;/a&gt; "Clear." On SSD and flash media, wear-leveling can leave the original data in cells the software overwrite never reached, so this isn't a forensic destruction guarantee. For NIST 800-88 "Purge" — cryptographic erase or a drive's native secure-erase command — you need the downloadable FileX Eraser Tool, which can also produce a certificate in the exact same format.&lt;/p&gt;

&lt;p&gt;That "exact same format" detail is deliberate: the browser tool and the desktop CLI hash their certificates identically, byte for byte, so a certificate from either one verifies the same way and neither format needs its own tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;A deletion log is a claim. A hashed record is tamper-evident. A signed record is tamper-evident &lt;em&gt;and&lt;/em&gt; attributable. Know which one you're holding, and don't assume a "certificate" implies more than its own disclaimer states.&lt;/p&gt;

&lt;p&gt;Run an erasure with the &lt;a href="https://files.cybxsan.com/tools/securely-erase-files/" rel="noopener noreferrer"&gt;in-browser Eraser tool&lt;/a&gt;, optionally sign it with your FileX ID, and check the result with the &lt;a href="https://files.cybxsan.com/tools/verify-erasure-certificate/" rel="noopener noreferrer"&gt;Verify Certificate tool&lt;/a&gt; — all locally, nothing uploaded.&lt;/p&gt;

</description>
      <category>erasure</category>
      <category>signatures</category>
      <category>compliance</category>
    </item>
    <item>
      <title>What is post-quantum encryption, and does your data need it yet?</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Tue, 11 Aug 2026 12:53:29 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/what-is-post-quantum-encryption-and-does-your-data-need-it-yet-3f16</link>
      <guid>https://dev.to/sanjoy_karmakar_044/what-is-post-quantum-encryption-and-does-your-data-need-it-yet-3f16</guid>
      <description>&lt;p&gt;"Post-quantum" gets used as a catch-all scare word, which makes it easy to assume every kind of encryption needs replacing before quantum computers arrive. That's not quite right. Post-quantum file encryption is really about one specific weak point — how two parties agree on a secret key in the first place — not about the cipher that scrambles your file bytes. Here's the actual distinction, why it matters today rather than someday, and how FileX applies it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attack that matters today: harvest now, decrypt later
&lt;/h2&gt;

&lt;p&gt;No quantum computer today can break modern encryption. The risk isn't that your files are readable now — it's that an adversary can copy encrypted data today and simply hold onto it, betting that a future quantum computer will be able to unlock it. CISA, the NSA, and NIST jointly warned about exactly this in their &lt;a href="https://www.nccoe.nist.gov/sites/default/files/2023-08/quantum-readiness-fact-sheet.pdf" rel="noopener noreferrer"&gt;Quantum-Readiness fact sheet&lt;/a&gt;: adversaries are already collecting encrypted data with the intent to decrypt it once a sufficiently powerful quantum computer exists. This is why "does your data need post-quantum protection yet?" is the wrong question if the data needs to stay confidential for years. The attack against it may already be underway; only the decryption is scheduled for later.&lt;/p&gt;

&lt;h2&gt;
  
  
  AES-256 doesn't need a fix
&lt;/h2&gt;

&lt;p&gt;Start with what's &lt;em&gt;not&lt;/em&gt; the problem. FileX encrypts your file bytes with AES-256-GCM — a symmetric cipher, meaning the same key both locks and unlocks the data. The best-known quantum attack against a symmetric cipher is Grover's algorithm, which speeds up brute-force key search quadratically, not exponentially. Against a 256-bit AES key, that leaves roughly 128 bits of effective security against a quantum attacker — still astronomically out of reach. AES-256 does not need a post-quantum replacement. If you see a product claiming to have "quantum-proofed" its symmetric cipher, be skeptical of what problem it's actually solving.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real threat: asymmetric key exchange
&lt;/h2&gt;

&lt;p&gt;The threat is to &lt;em&gt;asymmetric&lt;/em&gt; cryptography — the algorithms that let two parties who've never met establish a shared secret over an open channel, like X25519 (Elliptic Curve Diffie-Hellman, &lt;a href="https://www.rfc-editor.org/rfc/rfc7748" rel="noopener noreferrer"&gt;RFC 7748&lt;/a&gt;) or RSA. Their security rests on math problems — the elliptic-curve discrete-log problem, integer factorization — that a sufficiently large quantum computer running Shor's algorithm could solve outright, not just weaken. That's a full break, not a strength cut in half. Any file encrypted today to a recipient using only classical key exchange is exactly the kind of data a "harvest now, decrypt later" adversary would want copied and shelved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid encryption: secure if either half holds
&lt;/h2&gt;

&lt;p&gt;The practical defense NIST settled on isn't to abandon classical key exchange — it's to combine it with a quantum-resistant algorithm, so the combined result stays secure as long as &lt;em&gt;at least one&lt;/em&gt; of the two remains unbroken. In August 2024 NIST finalized the first Federal Information Processing Standards for this: &lt;a href="https://csrc.nist.gov/pubs/fips/203/final" rel="noopener noreferrer"&gt;FIPS 203&lt;/a&gt; standardizes &lt;strong&gt;ML-KEM&lt;/strong&gt; (Module-Lattice-Based Key-Encapsulation Mechanism, derived from CRYSTALS-Kyber) for key exchange, and &lt;a href="https://csrc.nist.gov/pubs/fips/204/final" rel="noopener noreferrer"&gt;FIPS 204&lt;/a&gt; standardizes &lt;strong&gt;ML-DSA&lt;/strong&gt; (derived from CRYSTALS-Dilithium) for digital signatures. Both are believed secure even against an adversary holding a large-scale quantum computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How FileX applies this: the FileX ID
&lt;/h2&gt;

&lt;p&gt;When you &lt;a href="https://files.cybxsan.com/tools/create-a-filex-id/" rel="noopener noreferrer"&gt;create a FileX ID&lt;/a&gt;, FileX generates a hybrid keypair entirely in your browser: an X25519 keypair alongside an ML-KEM-768 keypair, plus an ML-DSA-65 keypair for signing. The private keys never leave your device. When someone &lt;a href="https://files.cybxsan.com/tools/encrypt-to-a-filex-id/" rel="noopener noreferrer"&gt;encrypts a file to your FileX ID&lt;/a&gt;, FileX's &lt;code&gt;hybrid.js&lt;/code&gt; module runs both key agreements and combines the results rather than picking one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ss_ec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;X25519&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ephemeral_priv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;your_x25519_pub&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ss_pq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ML&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;KEM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;768.&lt;/span&gt;&lt;span class="nc"&gt;Encapsulate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;your_mlkem_pub&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;KEK&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HKDF&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SHA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss_ec&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ss_pq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transcript&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file's actual encryption key is then wrapped under that combined &lt;code&gt;KEK&lt;/code&gt; with AES-256-GCM. Because the key-encapsulation key is derived from &lt;em&gt;both&lt;/em&gt; shared secrets concatenated together, an attacker has to break both X25519 &lt;em&gt;and&lt;/em&gt; ML-KEM-768 to recover it — breaking only one gets them nothing. That's the concrete meaning of "quantum-safe" here: it isn't that AES got upgraded, it's that the key delivered to AES can no longer be exposed by breaking just the classical half.&lt;/p&gt;

&lt;p&gt;Signatures follow the same logic in one layer, not two: when you tick "sign" while encrypting, FileX signs with ML-DSA-65 so the recipient can verify the file came from your FileX ID and wasn't altered — the same post-quantum signature standard also signs FileX's &lt;a href="https://files.cybxsan.com/tools/securely-erase-files/" rel="noopener noreferrer"&gt;erasure certificates&lt;/a&gt;, independent of file encryption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does your data need this yet?
&lt;/h2&gt;

&lt;p&gt;If a file only needs to stay confidential for a few days or weeks, the classical-only risk window is small. But for anything with a long confidentiality shelf life — legal records, medical data, source code, anything embarrassing or regulated for years to come — "harvest now, decrypt later" means the exposure window opened the moment it was encrypted with classical-only key exchange, not the moment a quantum computer arrives. Password-based encryption (FileX's &lt;code&gt;FXQ1&lt;/code&gt; container, derived with Argon2id) is a separate case: it isn't vulnerable to Shor's algorithm at all, since there's no asymmetric key exchange to attack — a strong, unique password remains the deciding factor there.&lt;/p&gt;

&lt;p&gt;The recipient-encryption case is where the asymmetric key-exchange question actually applies, and it's where hybrid key exchange earns its keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Post-quantum protection is about &lt;strong&gt;asymmetric key exchange&lt;/strong&gt;, not about swapping out AES — AES-256 already resists quantum attacks with a comfortable margin.&lt;/li&gt;
&lt;li&gt;The real-world risk today is "harvest now, decrypt later": encrypted data copied now to be decrypted once quantum computers are strong enough.&lt;/li&gt;
&lt;li&gt;FileX's &lt;a href="https://files.cybxsan.com/tools/create-a-filex-id/" rel="noopener noreferrer"&gt;FileX ID&lt;/a&gt; combines classical X25519 with post-quantum ML-KEM-768 via HKDF, so security holds even if one algorithm is later broken.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://files.cybxsan.com/tools/encrypt-to-a-filex-id/" rel="noopener noreferrer"&gt;Encrypt a file to a FileX ID&lt;/a&gt; to try it — nothing is uploaded, and only the recipient's private key, never generated or seen by any server, can open it.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postquantum</category>
      <category>encryption</category>
      <category>quantumsafe</category>
    </item>
    <item>
      <title>Is it safe to send files with a link? What the server actually sees</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:46:50 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/is-it-safe-to-send-files-with-a-link-what-the-server-actually-sees-d4l</link>
      <guid>https://dev.to/sanjoy_karmakar_044/is-it-safe-to-send-files-with-a-link-what-the-server-actually-sees-d4l</guid>
      <description>&lt;p&gt;You drop a file into a "share a link" tool, get a URL back, and send it along. Is it safe to send files with a link? It depends entirely on one question most people never ask: what does the server hosting that link actually have access to? For most link-based transfer tools, the honest answer is "your file, in plaintext, sitting on someone else's storage." Here's what that risk looks like in practice, and what changes when the file is encrypted before it ever leaves your device.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a typical file-link service actually holds
&lt;/h2&gt;

&lt;p&gt;A conventional "send a file, get a link" service works by uploading your file as-is. The server receives the plaintext bytes, stores them, and hands out a link that lets anyone with the URL fetch them back. That means the provider — and anyone who compromises the provider, or is legally compelled to hand over data, or simply mis-configures a storage bucket — has the same access to your file that you do. The link itself is usually just an opaque ID; it doesn't protect the contents, because nothing about the file was ever hidden from the server that's serving it.&lt;/p&gt;

&lt;p&gt;This is the same category of risk covered in &lt;a href="https://files.cybxsan.com/blog/is-it-safe-to-use-online-pdf-tools/" rel="noopener noreferrer"&gt;is it safe to use online PDF tools&lt;/a&gt;: once a file is uploaded to a server you don't control, its confidentiality rests entirely on that server's security practices, retention policy, and legal exposure — not on anything you did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one FileX tool that isn't fully local — and why
&lt;/h2&gt;

&lt;p&gt;Every other tool in FileX runs 100% in your browser: nothing is ever uploaded, full stop. &lt;a href="https://files.cybxsan.com/tools/send-a-file-securely/" rel="noopener noreferrer"&gt;FileX Send&lt;/a&gt; is the deliberate exception, because a link that works later — potentially from a different device — has to hold the file &lt;em&gt;somewhere&lt;/em&gt; in between. Rather than pretend otherwise, FileX documents exactly what that costs you on a dedicated &lt;a href="https://files.cybxsan.com/filex-send-threat-model/" rel="noopener noreferrer"&gt;Send threat model page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The design minimizes what the server ever gets to see:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your browser generates a random encryption key locally.&lt;/li&gt;
&lt;li&gt;The file is encrypted with that key — AES-256-GCM, the same authenticated cipher used everywhere else in FileX — before a single byte is uploaded.&lt;/li&gt;
&lt;li&gt;Only the ciphertext goes to the server.&lt;/li&gt;
&lt;li&gt;The key never travels with the upload request. It's appended to the share link after a &lt;code&gt;#&lt;/code&gt;, a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/URI/Fragment" rel="noopener noreferrer"&gt;URL fragment&lt;/a&gt; — a client-side-only part of the URL that browsers never send in an HTTP request. So the server storing your ciphertext never receives the key that unlocks it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FileX Send's Team tier adds a second layer: an optional password. When set, the actual file key isn't the link key alone — it's derived by combining the link key with the password through HKDF, a standard key-derivation function (&lt;a href="https://www.rfc-editor.org/rfc/rfc5869" rel="noopener noreferrer"&gt;RFC 5869&lt;/a&gt;), the same construction FileX's hybrid encryption already relies on elsewhere. That means possessing the link alone isn't enough to decrypt a Team file — the password has to reach the recipient through a separate channel, the same "don't send the key with the message" principle covered in &lt;a href="https://files.cybxsan.com/blog/how-to-send-a-password-securely/" rel="noopener noreferrer"&gt;how to send a password securely&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the server can see — and what it can't
&lt;/h2&gt;

&lt;p&gt;Being upfront about this is the point. FileX Send's server side can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ciphertext bytes and their size.&lt;/li&gt;
&lt;li&gt;A routing ID — an opaque key with no information about the file itself.&lt;/li&gt;
&lt;li&gt;The link's expiry time and how many times it's been downloaded.&lt;/li&gt;
&lt;li&gt;Which pricing tier the sender is on, but only if a license key was attached to the upload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can never see: the encryption key, the Team password, the plaintext file contents, or the original filename — which also travels only in the link fragment, never in the request.&lt;/p&gt;

&lt;p&gt;Links don't sit around indefinitely, either, and the limits are enforced server-side rather than just suggested by the UI. They vary by tier and do change as the product evolves, so check the &lt;a href="https://files.cybxsan.com/tools/send-a-file-securely/" rel="noopener noreferrer"&gt;Send tool&lt;/a&gt; page for current numbers rather than trusting an old post. Free-tier links expire fastest and self-destruct after a single download; paid tiers get longer-lived links with higher size caps and unlimited downloads until expiry; Team links add the password requirement above. Once a link expires or hits its download limit, both the encrypted object and its metadata are deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  So — is it safe?
&lt;/h2&gt;

&lt;p&gt;"Safe" depends on what you're protecting against. Encrypting client-side before upload closes off the biggest risk in ordinary link-sharing services: a server operator, or anyone who breaches that server, reading your file. With FileX Send, they'd get ciphertext and nothing to decrypt it with. What client-side encryption doesn't change is availability — the encrypted blob still has to exist somewhere until the recipient downloads it, and its size and rough timing are visible to whoever hosts it. If even that tradeoff isn't one you're willing to make — ciphertext held temporarily, in exchange for a link that works without both people online at once — keeping the file off any server entirely is still an option: &lt;a href="https://files.cybxsan.com/tools/encrypt-to-a-filex-id/" rel="noopener noreferrer"&gt;encrypt a file to a FileX ID&lt;/a&gt; so only one recipient's private key can ever open it, and hand it over however you like.&lt;/p&gt;

&lt;p&gt;For most people sharing a document or photo with someone who isn't ready to receive it in the next five minutes, a link where the host only ever holds ciphertext is a meaningfully safer proposition than one where it holds your file in the clear.&lt;/p&gt;

&lt;p&gt;Ready to try it? &lt;a href="https://files.cybxsan.com/tools/send-a-file-securely/" rel="noopener noreferrer"&gt;Send a file securely&lt;/a&gt; — your file is encrypted before it leaves your browser, and you can read exactly what the server does and doesn't see on the &lt;a href="https://files.cybxsan.com/filex-send-threat-model/" rel="noopener noreferrer"&gt;threat model page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>filetransfer</category>
      <category>encryption</category>
      <category>filexsend</category>
    </item>
    <item>
      <title>What is a SHA-256 checksum and how do you verify a download?</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:31:52 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/what-is-a-sha-256-checksum-and-how-do-you-verify-a-download-1d8f</link>
      <guid>https://dev.to/sanjoy_karmakar_044/what-is-a-sha-256-checksum-and-how-do-you-verify-a-download-1d8f</guid>
      <description>&lt;p&gt;A software vendor posts a download link next to a string like &lt;code&gt;a94a8fe5ccb19ba61c4c0873d391e987982fbbd3&lt;/code&gt;. That string is a checksum — and if you've ever wondered whether you're supposed to do anything with it, the answer is yes. Here's what a SHA-256 checksum actually is, when checking one matters, and how to verify a download's checksum in your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a checksum actually is
&lt;/h2&gt;

&lt;p&gt;A checksum (also called a hash or digest) is the output of a cryptographic hash function run over a file's bytes. SHA-256 — part of the SHA-2 family, published by NIST — always produces the same 256-bit (64 hex character) output for the same input, and a single changed byte anywhere in the file produces a completely different output. That's what makes it useful for verification: it's not a summary of the file, it's a fingerprint of every byte in it.&lt;/p&gt;

&lt;p&gt;Two properties matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic.&lt;/strong&gt; The same file, hashed twice, always produces the same digest — on any machine, in any browser, with any implementation, because the algorithm is a fixed public specification, not something proprietary to one tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collision-resistant.&lt;/strong&gt; Finding two different files that produce the same SHA-256 digest is, as far as anyone has publicly demonstrated, computationally infeasible. So a matching digest is strong evidence the bytes are identical, not just similar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A checksum doesn't tell you a file is &lt;em&gt;safe&lt;/em&gt; — malware can ship with a perfectly valid checksum for its own bytes. What it tells you is that the file you have is &lt;strong&gt;the exact file the checksum was computed from&lt;/strong&gt;: nothing added, removed, or flipped in transit.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to actually check one
&lt;/h2&gt;

&lt;p&gt;Most downloads, most of the time, you don't bother. Checking a checksum earns its keep in a few specific situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installers and firmware.&lt;/strong&gt; A corrupted download of an OS installer or a firmware image can brick a device or fail installation halfway through in a way that's hard to diagnose. Confirming the checksum before you run it catches that up front.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large file transfers.&lt;/strong&gt; The bigger the file, the more likely a partial download or flaky connection leaves you with a truncated or corrupted copy. A checksum mismatch tells you immediately, instead of discovering it when the file won't open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifying nothing changed.&lt;/strong&gt; If you need to prove a document or dataset is identical to a version you fingerprinted earlier — for an audit trail, a compliance record, or just your own peace of mind — comparing checksums over time does that without needing to diff the whole file by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirming a publisher's signature.&lt;/strong&gt; Many open-source projects publish a &lt;code&gt;SHA256SUMS&lt;/code&gt; file alongside their releases specifically so downloaders can verify integrity independently of the download mirror they used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the checksum you compute doesn't match the one the publisher listed, don't run the file. A mismatch means the bytes differ from what was published — from ordinary network corruption at best, to a tampered file at worst. Either way, re-download from the source rather than trusting it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to verify a checksum in your browser
&lt;/h2&gt;

&lt;p&gt;FileX's &lt;a href="https://files.cybxsan.com/tools/verify-file-integrity-checksum/" rel="noopener noreferrer"&gt;file integrity tool&lt;/a&gt; computes cryptographic digests entirely client-side, using the browser's built-in &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest" rel="noopener noreferrer"&gt;Web Crypto API&lt;/a&gt; (&lt;code&gt;crypto.subtle.digest&lt;/code&gt;) — the file is read locally and never uploaded anywhere:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://files.cybxsan.com/tools/verify-file-integrity-checksum/" rel="noopener noreferrer"&gt;integrity tool&lt;/a&gt; and drop in the file you downloaded.&lt;/li&gt;
&lt;li&gt;Pick an algorithm. SHA-256 is the most common for public checksums; SHA-384 and SHA-512 are also available for cases that call for a longer digest, and SHA-1 is offered only for comparing against older, legacy-published checksums — it's cryptographically broken for anything security-sensitive and shouldn't be trusted to detect deliberate tampering.&lt;/li&gt;
&lt;li&gt;Paste the checksum the publisher listed into the "compare against" field, and hit compute. FileX hashes the file locally and tells you outright whether it matches — no eyeballing a 64-character hex string for a typo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you need to fingerprint several files at once — say, an entire release directory — the tool's Manifest mode hashes every file you drop in and produces a downloadable &lt;code&gt;SHA256SUMS&lt;/code&gt;-style checksum list in one pass, matching the format most open-source projects already publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checksum vs. HMAC: when you need a shared key
&lt;/h2&gt;

&lt;p&gt;A plain checksum verifies integrity — that the bytes weren't altered — but anyone can compute a SHA-256 digest of a file, including whoever might have tampered with it and then republished a matching checksum alongside it. If you need to prove the digest itself couldn't have been forged by someone without a shared secret, that's what HMAC (keyed-hash message authentication) is for.&lt;/p&gt;

&lt;p&gt;FileX's integrity tool includes an HMAC mode: you supply a secret key alongside the file, and it computes a keyed digest via &lt;code&gt;crypto.subtle.sign('HMAC', ...)&lt;/code&gt;. Anyone verifying the HMAC needs the same key — so unlike a plain checksum, a valid HMAC also proves the digest came from someone who holds that key, not just from someone recomputing a hash after the fact. This is the same authenticated pattern that underlies &lt;a href="https://files.cybxsan.com/blog/how-aes-256-gcm-encryption-protects-your-files/" rel="noopener noreferrer"&gt;how AES-256-GCM protects your files&lt;/a&gt;: encryption alone tells you a file is confidential, but an authentication tag (or here, an HMAC) is what tells you it hasn't been altered by someone without the key.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A SHA-256 checksum is a deterministic fingerprint of a file's exact bytes — matching digests mean identical files, a mismatch means something changed.&lt;/li&gt;
&lt;li&gt;Check checksums for installers, firmware, large transfers, and anything you need to later prove wasn't altered.&lt;/li&gt;
&lt;li&gt;Use HMAC instead of a plain checksum when you need to prove the digest came from someone holding a shared key, not just anyone who recomputed a hash.&lt;/li&gt;
&lt;li&gt;FileX computes SHA-1/256/384/512 digests and HMACs entirely in your browser via the Web Crypto API — the file is read locally and never uploaded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have a download to verify? &lt;a href="https://files.cybxsan.com/tools/verify-file-integrity-checksum/" rel="noopener noreferrer"&gt;Compute its checksum now&lt;/a&gt; — nothing leaves your browser, and the live monitor on the page shows exactly zero bytes uploaded.&lt;/p&gt;

</description>
      <category>sha256</category>
      <category>checksum</category>
      <category>integrity</category>
    </item>
    <item>
      <title>How to send a password securely (stop pasting it in chat)</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Fri, 24 Jul 2026 10:10:00 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/how-to-send-a-password-securely-stop-pasting-it-in-chat-5ahn</link>
      <guid>https://dev.to/sanjoy_karmakar_044/how-to-send-a-password-securely-stop-pasting-it-in-chat-5ahn</guid>
      <description>&lt;p&gt;You just reset a shared account's password, or you're handing a Wi-Fi key to a houseguest, or a client needs a login for a portal. The easy move is to paste it straight into Slack, WhatsApp, or an email. The problem: that message doesn't disappear. It sits in your chat history, the recipient's chat history, both parties' cloud backups, and any device either of you is signed into, indefinitely — in plain text, readable by anyone who later gets into any one of those places.&lt;/p&gt;

&lt;p&gt;Here's how to send a password securely instead: encrypt it before it touches a chat or email thread, and split it from its own decryption channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pasting it in chat is the weak point
&lt;/h2&gt;

&lt;p&gt;A password typed into a messaging app isn't "sent and gone." It's stored, usually more than once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chat history&lt;/strong&gt;, searchable by anyone who later gains access to either account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud backups&lt;/strong&gt; of that chat, often kept far longer than the conversation itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification previews&lt;/strong&gt;, which can flash the password on a lock screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-side logs&lt;/strong&gt;, if the tool routes messages through a provider you don't control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that requires anyone to "hack" anything — it just requires someone who already has access to one of those places, at any point in the future. The fix isn't a better messaging app. It's not leaving a readable secret in any of those places to begin with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encrypt the secret, then send the encrypted version
&lt;/h2&gt;

&lt;p&gt;FileX's &lt;a href="https://files.cybxsan.com/tools/encrypted-secret-note/" rel="noopener noreferrer"&gt;Secret Note tool&lt;/a&gt; turns your message into ciphertext before it ever leaves your device:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://files.cybxsan.com/tools/encrypted-secret-note/" rel="noopener noreferrer"&gt;Secret Note tool&lt;/a&gt; and type or paste the password (or address, or message) into it.&lt;/li&gt;
&lt;li&gt;Set a password to protect it. This encrypts the text locally with &lt;strong&gt;AES-256-GCM&lt;/strong&gt;, the same authenticated cipher FileX uses for file encryption — the key is derived from your password with &lt;strong&gt;PBKDF2-HMAC-SHA256&lt;/strong&gt; and a random salt, run entirely in your browser.&lt;/li&gt;
&lt;li&gt;Copy the output. It's a plain-text block — &lt;code&gt;----- BEGIN FILEX NOTE -----&lt;/code&gt; … &lt;code&gt;----- END FILEX NOTE -----&lt;/code&gt; — that pastes cleanly into any chat app, email, or ticket, because it &lt;em&gt;is&lt;/em&gt; just text, base64-encoded.&lt;/li&gt;
&lt;li&gt;Send that block over whatever channel you'd already planned to use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing about this step touches a server. The note is encrypted on your device and never uploaded — you can check the "nothing uploaded" monitor on the page while you do it.&lt;/p&gt;

&lt;p&gt;To read it back, the recipient pastes the block into the same tool's Decrypt mode and enters the password. If the password is wrong, or the block was altered in transit, decryption fails outright rather than returning garbled text — that's the authentication tag in AES-GCM doing its job, the same mechanism covered in &lt;a href="https://files.cybxsan.com/blog/how-aes-256-gcm-encryption-protects-your-files/" rel="noopener noreferrer"&gt;how AES-256-GCM keeps your files safe&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that actually matters: use a second channel
&lt;/h2&gt;

&lt;p&gt;Encrypting the note only helps if the password protecting it doesn't travel the same path as the note itself. If you encrypt a secret and then send both the encrypted block &lt;em&gt;and&lt;/em&gt; its password down the same Slack thread, you've just moved the plaintext-in-chat problem one message later — anyone who can read that thread can decrypt the note too.&lt;/p&gt;

&lt;p&gt;Split it instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send the encrypted note by chat, email, or a shared doc.&lt;/li&gt;
&lt;li&gt;Deliver the password by a &lt;strong&gt;different&lt;/strong&gt; channel — a phone call, an SMS, in person, or a separate app entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An attacker (or a future account compromise) now has to control &lt;em&gt;two&lt;/em&gt; channels, not one, to reconstruct the secret. That's the entire value of encrypting it in the first place — don't undo it by keeping the password on the same thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't reuse a weak password for the wrapper either
&lt;/h2&gt;

&lt;p&gt;The password protecting your note is doing real cryptographic work — it's the input to the key derivation, and a short or guessable one narrows the search space an attacker has to try. Don't reuse an existing account password as the wrapper; generate a fresh one for this purpose with FileX's &lt;a href="https://files.cybxsan.com/tools/generate-strong-passwords/" rel="noopener noreferrer"&gt;password generator&lt;/a&gt;, which draws randomness from your browser's CSPRNG (&lt;code&gt;crypto.getRandomValues&lt;/code&gt;, never &lt;code&gt;Math.random&lt;/code&gt;) rather than anything predictable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;random password&lt;/strong&gt; (8–64 characters, with toggles for lowercase, uppercase, digits, and symbols) — every character sampled with unbiased rejection sampling, one character guaranteed from each class you select.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;diceware-style passphrase&lt;/strong&gt; (3–10 words from a 7,776-word list, optionally capitalized or suffixed with a number) — easier to read aloud over that phone call than a random string, and just as calculable: each word contributes about 12.9 bits of entropy, so a 5-word passphrase lands around 65 bits before any added number.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, the generator shows you the resulting entropy so you're not guessing at strength.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don't paste a password directly into chat, email, or a ticket — it lives on in history and backups long after you've forgotten it.&lt;/li&gt;
&lt;li&gt;Encrypt it first with the &lt;a href="https://files.cybxsan.com/tools/encrypted-secret-note/" rel="noopener noreferrer"&gt;Secret Note tool&lt;/a&gt;: AES-256-GCM, PBKDF2-derived key, nothing uploaded.&lt;/li&gt;
&lt;li&gt;Send the encrypted block and the password over &lt;strong&gt;separate channels&lt;/strong&gt; — that split is what actually protects the secret.&lt;/li&gt;
&lt;li&gt;Generate the wrapper password with a &lt;a href="https://files.cybxsan.com/tools/generate-strong-passwords/" rel="noopener noreferrer"&gt;CSPRNG-based password generator&lt;/a&gt; rather than reusing one you already know.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready to send one? &lt;a href="https://files.cybxsan.com/tools/encrypted-secret-note/" rel="noopener noreferrer"&gt;Encrypt your secret note now&lt;/a&gt; — it runs entirely in your browser, and the live monitor on the page shows exactly zero bytes leaving it.&lt;/p&gt;

</description>
      <category>passwords</category>
      <category>secretsharing</category>
      <category>encryption</category>
    </item>
    <item>
      <title>How to redact a PDF properly (black boxes aren't enough)</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Fri, 24 Jul 2026 10:09:59 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/how-to-redact-a-pdf-properly-black-boxes-arent-enough-433m</link>
      <guid>https://dev.to/sanjoy_karmakar_044/how-to-redact-a-pdf-properly-black-boxes-arent-enough-433m</guid>
      <description>&lt;p&gt;If you've ever learned &lt;strong&gt;how to redact a PDF&lt;/strong&gt; by drawing a black rectangle over the sensitive part, you should know: in most tools, that rectangle is decoration. The text underneath is still there, and it usually takes nothing more than a copy-paste or a drag of the shape to get it back. Real redaction means the underlying content is gone — not covered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a black box usually isn't redaction
&lt;/h2&gt;

&lt;p&gt;A PDF page isn't a flat picture by default — it's a set of objects: text runs, positions, fonts, images, all still readable by software even when something visually sits on top of them. Drop a black rectangle over a paragraph in a word processor, export to PDF, and you've added one more object to the stack. The paragraph is still in the file underneath it.&lt;/p&gt;

&lt;p&gt;That gap has caused real, public leaks. Redactions have been reversed by selecting and copying the "hidden" text, by deleting the covering shape in a PDF editor, or by extracting the underlying text layer with any PDF parser. None of that requires special tools — just the willingness to try.&lt;/p&gt;

&lt;h2&gt;
  
  
  What real redaction requires
&lt;/h2&gt;

&lt;p&gt;Genuine redaction has one job: make sure the sensitive content cannot be recovered from the file you hand out, by any method. That means the original text and image data covered by a redaction has to be &lt;strong&gt;destroyed&lt;/strong&gt;, not layered over. A tool that draws a shape and calls it done hasn't done the job — the safe assumption for anyone downstream is that a redaction is real only if the file's underlying structure no longer contains what it's hiding.&lt;/p&gt;

&lt;h2&gt;
  
  
  How FileX redacts a PDF
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://files.cybxsan.com/tools/redact-pdf/" rel="noopener noreferrer"&gt;Redact a PDF tool&lt;/a&gt; (part of the FileX PDF Editor, a Pro feature) handles this by rasterizing, not overlaying. When you mark an area for redaction and export the document, any page that has a redaction on it is rendered to a flattened image — the original text, fonts, and vector objects on that page are replaced entirely by that image, with your black boxes baked directly into the pixels. There's no text layer left to copy, no hidden object to peel away, and no shape you can nudge aside — because there's no shape at all in the output, just a picture. Pages you didn't redact keep their original, unmodified content, so you only lose text-selectability on the pages that actually needed it.&lt;/p&gt;

&lt;p&gt;As with every FileX tool, this happens entirely in your browser — the document is never uploaded to redact it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redaction isn't metadata removal
&lt;/h2&gt;

&lt;p&gt;These solve two different problems, and it's easy to fix one while forgetting the other:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it removes&lt;/th&gt;
&lt;th&gt;What it leaves alone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redaction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visible content on the page (text, images)&lt;/td&gt;
&lt;td&gt;Document properties (author, software, timestamps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://files.cybxsan.com/tools/remove-metadata-from-pdf/" rel="noopener noreferrer"&gt;Metadata removal&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Author, producer, creation/modification dates, title, keywords&lt;/td&gt;
&lt;td&gt;The visible page content&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A PDF you've redacted can still name you as the author in its document properties. If you're sending a document out and you want both — no visible sensitive content &lt;em&gt;and&lt;/em&gt; no author fingerprint — run it through both tools: redact first, then &lt;a href="https://files.cybxsan.com/tools/remove-metadata-from-pdf/" rel="noopener noreferrer"&gt;clear the metadata&lt;/a&gt;. We cover the metadata side in more depth in &lt;a href="https://files.cybxsan.com/blog/hidden-metadata-your-photos-and-pdfs-leak/" rel="noopener noreferrer"&gt;the hidden metadata your photos and PDFs leak&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you send it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't rely on a black box drawn in a word processor or a basic PDF viewer.&lt;/strong&gt; If the shape can be deleted or the text can be copy-pasted, it isn't redaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cover the area completely.&lt;/strong&gt; A redaction that clips the edge of a word can leave a legible fragment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the metadata separately.&lt;/strong&gt; Redacting content doesn't clear the author or producer fields — that's a separate step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm you can't select the "hidden" text in the exported file.&lt;/strong&gt; If you can highlight it with your cursor, it wasn't redacted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redacting properly costs you one thing: the redacted page becomes an image, so its text is no longer selectable or searchable — that's the trade-off for the content actually being gone. For a document you're about to share outside your organization, it's the right trade to make. Try the &lt;a href="https://files.cybxsan.com/tools/redact-pdf/" rel="noopener noreferrer"&gt;PDF Editor's Redact mode&lt;/a&gt; — the file stays on your device the entire time, redaction included.&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>redaction</category>
      <category>privacy</category>
    </item>
    <item>
      <title>What is EXIF data, and how do you remove it from a photo?</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:56:08 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/what-is-exif-data-and-how-do-you-remove-it-from-a-photo-1mbh</link>
      <guid>https://dev.to/sanjoy_karmakar_044/what-is-exif-data-and-how-do-you-remove-it-from-a-photo-1mbh</guid>
      <description>&lt;p&gt;Every photo your phone or camera takes carries an invisible passenger: &lt;strong&gt;EXIF data&lt;/strong&gt;. It rides along inside the file, adds nothing to what you see on screen, and can quietly tell a stranger where you were standing when you took the picture. Here's what EXIF data actually is, what it can reveal, and how to strip it before you share a photo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is EXIF data, exactly?
&lt;/h2&gt;

&lt;p&gt;EXIF stands for &lt;strong&gt;Exchangeable Image File Format&lt;/strong&gt; — a standard, maintained by the Camera &amp;amp; Imaging Products Association (CIPA), for embedding a block of metadata inside a JPEG photo. When a digital camera or phone saves a JPEG, it writes a small binary block right after the start of the file (technically, an &lt;code&gt;APP1&lt;/code&gt; segment structured like a miniature TIFF file) containing tags about the shot: not the pixels, but facts &lt;em&gt;about&lt;/em&gt; the pixels.&lt;/p&gt;

&lt;p&gt;It's not a hack or a leak in the traditional sense — EXIF was designed to be there. The problem is that almost nobody ever looks at it before hitting send.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually inside an EXIF block
&lt;/h2&gt;

&lt;p&gt;A camera can write dozens of EXIF fields, but the ones that matter for privacy are a short list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it reveals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Make&lt;/code&gt; / &lt;code&gt;Model&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The exact phone or camera model that took the photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Software&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The app or firmware version used to process it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;DateTime&lt;/code&gt; / &lt;code&gt;DateTimeOriginal&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;When the photo was taken and last saved, to the second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Artist&lt;/code&gt; / &lt;code&gt;Copyright&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A name, if the device or app was configured with one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Orientation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which way to rotate the image for display&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ExposureTime&lt;/code&gt; / &lt;code&gt;FocalLength&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Camera settings — not private, but confirms real gear was used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GPSLatitude&lt;/code&gt; / &lt;code&gt;GPSLongitude&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The exact location the photo was taken, often to within a few metres&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last one is the field that actually causes harm. GPS coordinates baked into a photo are precise enough to point at a front door, a workplace, or a child's school — from a single JPEG, with no other information needed.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Orientation&lt;/code&gt; tag is worth a specific mention because it's the one EXIF field browsers already act on: the CSS &lt;code&gt;image-orientation&lt;/code&gt; property's default value, &lt;code&gt;from-image&lt;/code&gt;, tells the browser to auto-rotate a JPEG using this exact tag — proof that EXIF isn't some obscure forensic curiosity, it's live metadata your own browser reads today.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to see what your photo is carrying
&lt;/h2&gt;

&lt;p&gt;You don't have to take any of this on faith — you can look. FileX's &lt;a href="https://files.cybxsan.com/tools/inspect-file-metadata/" rel="noopener noreferrer"&gt;Inspect tool&lt;/a&gt; reads a JPEG's EXIF block and lists every tag it finds, including a specific warning if GPS coordinates are present, before you decide to share anything. It's read-only: nothing is written back to the file, and because it runs entirely in your browser, the photo itself never leaves your device just to be checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to remove EXIF data from a photo
&lt;/h2&gt;

&lt;p&gt;Once you know what's there, removing it is one step: FileX's &lt;a href="https://files.cybxsan.com/tools/remove-exif-metadata-from-photos/" rel="noopener noreferrer"&gt;Scrub tool&lt;/a&gt; takes a JPG or PNG and re-encodes it as a fresh JPEG at 95% quality, using the browser's &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; element. That re-encode is the whole mechanism — a canvas only ever knows about pixels, so when it redraws your photo it has no way to carry the old EXIF block along. The output is visually identical, full resolution, same content — just without the metadata that came in.&lt;/p&gt;

&lt;p&gt;Two things worth knowing about that process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It always produces a JPEG, even if you dropped in a PNG. If your source was a PNG with embedded metadata, re-encoding still discards it.&lt;/li&gt;
&lt;li&gt;Because it's a genuine re-encode at high quality (not a lossless strip), there's no meaningful visible quality loss, but it isn't a bit-for-bit copy of the original either.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Does resizing or cropping remove EXIF automatically?
&lt;/h2&gt;

&lt;p&gt;Not necessarily — plenty of photo editors preserve the EXIF block when they resize or crop, because they write the new pixels back into the same container without touching the metadata section. The only way to be sure is to either check with a tool like Inspect, or use a tool that explicitly re-encodes through a metadata-blind path like canvas — which is exactly what removes it here.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick before-you-send checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Selling something online?&lt;/strong&gt; Product photos taken at home routinely carry GPS. Scrub before you post the listing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing photos from an event or trip?&lt;/strong&gt; Timestamps and device model are low-risk alone, but combined with GPS they build a fuller picture than most people intend to share.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sending a photo to someone you don't fully trust?&lt;/strong&gt; Inspect first — it takes seconds and costs nothing to know.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EXIF is only half the metadata story — PDFs and other documents carry their own hidden properties (author names, software fingerprints, timestamps), which works a little differently. The &lt;a href="https://files.cybxsan.com/blog/hidden-metadata-your-photos-and-pdfs-leak/" rel="noopener noreferrer"&gt;deeper look at hidden metadata&lt;/a&gt; covers both photos and documents side by side if you want the fuller picture.&lt;/p&gt;

&lt;p&gt;Curious what your own photos are carrying? Drop one into the &lt;a href="https://files.cybxsan.com/tools/inspect-file-metadata/" rel="noopener noreferrer"&gt;Inspect tool&lt;/a&gt; — it's free, read-only, and nothing is uploaded.&lt;/p&gt;

</description>
      <category>exif</category>
      <category>metadata</category>
      <category>privacy</category>
    </item>
    <item>
      <title>How to securely erase an SSD (and why overwriting isn't enough)</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Fri, 10 Jul 2026 09:35:35 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/how-to-securely-erase-an-ssd-and-why-overwriting-isnt-enough-3d05</link>
      <guid>https://dev.to/sanjoy_karmakar_044/how-to-securely-erase-an-ssd-and-why-overwriting-isnt-enough-3d05</guid>
      <description>&lt;p&gt;If you're about to sell, return, or recycle a laptop, the instinct is to delete your files, maybe run an overwrite tool, and call it done. On a spinning hard drive that instinct is basically correct. On a solid-state drive (SSD) — which is what's inside almost every laptop sold today — it isn't. &lt;strong&gt;You can securely erase an SSD, but not by overwriting files in place.&lt;/strong&gt; Here's why, and what actually works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why file overwrites don't reliably erase an SSD
&lt;/h2&gt;

&lt;p&gt;Overwriting a file writes new bytes over the old ones so the original content is physically replaced — that's real erasure, and it's exactly what an in-browser eraser tool does. The catch is what "in place" means on flash storage.&lt;/p&gt;

&lt;p&gt;An SSD can't rewrite a single cell the way a magnetic platter can. To spread physical wear evenly and stay fast, SSD controllers use &lt;strong&gt;wear-leveling&lt;/strong&gt;: when your OS "overwrites" a file, the controller frequently parks the new data in a &lt;em&gt;different&lt;/em&gt; physical location and retires the old block instead of erasing it there. The filesystem reports success. The original bytes may still exist in a block the OS can no longer even address. We cover this mechanism — and the related myth that more overwrite passes helps — in more depth in &lt;a href="https://files.cybxsan.com/blog/does-deleting-a-file-actually-erase-it/" rel="noopener noreferrer"&gt;does deleting a file actually erase it?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The upshot: a software overwrite on an SSD is a &lt;strong&gt;best-effort logical wipe&lt;/strong&gt;. It defeats undelete and file-recovery tools, which is the level NIST calls "Clear." It cannot promise a lab with the right equipment won't recover a fragment from a retired block. For most everyday deletions, Clear is genuinely enough. For a drive that's about to leave your hands entirely, it usually isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reference standard: NIST SP 800-88
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://csrc.nist.gov/pubs/sp/800/88/r1/final" rel="noopener noreferrer"&gt;NIST Special Publication 800-88&lt;/a&gt;&lt;/strong&gt;, "Guidelines for Media Sanitization," defines the escalating levels that matter here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Defeats&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clear&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Overwrite user-addressable storage with new data&lt;/td&gt;
&lt;td&gt;Standard undelete / recovery software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Techniques that resist laboratory recovery — cryptographic erase, or the drive's own firmware sanitize command&lt;/td&gt;
&lt;td&gt;Forensic recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Destroy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Physical destruction of the media&lt;/td&gt;
&lt;td&gt;Everything&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A whole SSD you're decommissioning calls for &lt;strong&gt;Purge&lt;/strong&gt;, not Clear. NIST 800-88 lists two practical ways to get there on flash media:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographic erase&lt;/strong&gt; — if the drive (or a volume on it) was encrypted, destroying the encryption key instantly makes every block unreadable, no matter which physical location the controller actually wrote to. This is the fastest and most broadly applicable Purge method for SSDs, provided encryption was on from the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The drive's own sanitize / secure-erase command&lt;/strong&gt; — issued directly to the controller (ATA Secure Erase for SATA drives, NVMe Sanitize for NVMe drives). The firmware erases the flash itself, which is the one layer that isn't fooled by wear-leveling, because it operates below it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both require access a web browser simply doesn't have — this is OS- and firmware-level work, not something JavaScript running in a tab can issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that actually looks like
&lt;/h2&gt;

&lt;p&gt;Concretely, reaching Purge on a real machine means one of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux, LUKS-encrypted drive:&lt;/strong&gt; destroy the volume key (&lt;code&gt;cryptsetup luksErase&lt;/code&gt;) for an instant crypto-erase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux, NVMe:&lt;/strong&gt; issue an NVMe Sanitize block-erase (&lt;code&gt;nvme sanitize&lt;/code&gt;) — the drive's firmware wipes itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux/any OS, SATA SSD:&lt;/strong&gt; the drive's ATA Security Erase Unit command (often run via &lt;code&gt;hdparm --security-erase&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; disable FileVault and destroy the APFS volume key for a crypto-erase, or use the drive's native secure-erase utility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; turn off BitLocker and reformat to destroy the key, or run the drive vendor's secure-erase tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are irreversible, whole-device operations — exactly the kind of thing that shouldn't run silently or by accident, and exactly why FileX draws a hard line around them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where FileX's two erasure tools fit
&lt;/h2&gt;

&lt;p&gt;FileX ships two erasure tools, and each is honest about which level it reaches:&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;a href="https://files.cybxsan.com/tools/securely-erase-files/" rel="noopener noreferrer"&gt;in-browser Eraser&lt;/a&gt;&lt;/strong&gt; overwrites and deletes the contents of a folder you choose, entirely in your browser via the File System Access API — nothing leaves your device. That's &lt;strong&gt;Clear&lt;/strong&gt;: it reliably defeats recovery software, and it's the right tool for cleaning out sensitive files you're done with day to day. It is not, and doesn't claim to be, a whole-drive Purge tool — a browser tab can't touch drive firmware.&lt;/p&gt;

&lt;p&gt;The downloadable &lt;strong&gt;FileX Eraser Tool&lt;/strong&gt; (native, Windows/macOS/Linux, Pro-licensed) also supports &lt;code&gt;crypto-erase&lt;/code&gt; and &lt;code&gt;purge&lt;/code&gt; methods for whole devices. Deliberately, it does not fire the firmware sanitize command itself — that's a destructive, irreversible action on an entire disk, and an unsigned CLI shouldn't auto-execute it. Instead it detects your OS and prints the correct, vetted native command for your platform (&lt;code&gt;nvme sanitize&lt;/code&gt;, &lt;code&gt;hdparm --security-erase&lt;/code&gt;, &lt;code&gt;cryptsetup luksErase&lt;/code&gt;, &lt;code&gt;diskutil secureErase&lt;/code&gt;, or the BitLocker equivalent) so you run it deliberately, as an admin, against the right device. For file- and folder-level &lt;code&gt;clear&lt;/code&gt; jobs it runs the erase itself and produces the same tamper-evident certificate as the web tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Deleting or even overwriting individual files on an SSD is Clear-level protection — good for day-to-day cleanup, not a guarantee for hardware leaving your control.&lt;/li&gt;
&lt;li&gt;The reliable way to reach Purge on an SSD is cryptographic erase (destroy the key) or the drive's own ATA Secure Erase / NVMe Sanitize command — both need OS- or firmware-level access.&lt;/li&gt;
&lt;li&gt;Turn on full-disk encryption from day one on any drive you might ever resell or return. It makes a future crypto-erase instant instead of impossible.&lt;/li&gt;
&lt;li&gt;For files you want gone right now, not a whole drive, the &lt;a href="https://files.cybxsan.com/tools/securely-erase-files/" rel="noopener noreferrer"&gt;in-browser Eraser&lt;/a&gt; overwrites and deletes them locally and hands you a certificate — nothing uploaded.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ssd</category>
      <category>secureerase</category>
      <category>nist80088</category>
    </item>
    <item>
      <title>PBKDF2 vs Argon2 vs bcrypt — which key-derivation function and why</title>
      <dc:creator>Sanjoy Karmakar</dc:creator>
      <pubDate>Wed, 08 Jul 2026 09:20:39 +0000</pubDate>
      <link>https://dev.to/sanjoy_karmakar_044/pbkdf2-vs-argon2-vs-bcrypt-which-key-derivation-function-and-why-571k</link>
      <guid>https://dev.to/sanjoy_karmakar_044/pbkdf2-vs-argon2-vs-bcrypt-which-key-derivation-function-and-why-571k</guid>
      <description>&lt;p&gt;If you've read anything about password hashing or encryption, you've run into all three names: PBKDF2, bcrypt, Argon2. They get lumped together as "ways to turn a password into something safe to store or use," but they were built for different problems, at different times, and they don't defend against the same attacks equally well. Here's what each one actually does, where they diverge, and why FileX derives its encryption keys with PBKDF2 rather than the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a key-derivation function is for
&lt;/h2&gt;

&lt;p&gt;A password like &lt;code&gt;correct horse battery staple&lt;/code&gt; is not usable directly as a cryptographic key, and it's not safe to check by comparing it to a plain stored copy either. A key-derivation function (KDF) — sometimes called a password-hashing function in the login context — takes the password plus a random &lt;strong&gt;salt&lt;/strong&gt; and runs it through a deliberately expensive one-way computation. Two properties matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The salt&lt;/strong&gt; makes every derivation unique, even for two people who pick the same password, so an attacker can't precompute one giant table of results and reuse it against every target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cost&lt;/strong&gt; (iterations, memory, or both) makes each guess slow. An attacker who steals a salt and a ciphertext (or a stored hash) still has to pay that cost for &lt;em&gt;every single password they try&lt;/em&gt;. That's the entire point — the cipher or the login check is rarely the weak link; how expensive it is to brute-force the password is.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PBKDF2, bcrypt, and Argon2 all satisfy this shape. Where they differ is &lt;em&gt;what&lt;/em&gt; they make expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  PBKDF2: CPU-hard, standardized, everywhere
&lt;/h2&gt;

&lt;p&gt;PBKDF2 (Password-Based Key Derivation Function 2) dates to 2000 and is specified in &lt;a href="https://www.rfc-editor.org/rfc/rfc2898" rel="noopener noreferrer"&gt;RFC 2898&lt;/a&gt;. It derives a key by running an underlying HMAC (commonly HMAC-SHA256) over the password and salt thousands of times in sequence. The only cost knob is &lt;strong&gt;iterations&lt;/strong&gt; — more repetitions, more CPU time, no memory requirement beyond the hash itself.&lt;/p&gt;

&lt;p&gt;That single-dimension cost is PBKDF2's main weakness: it parallelizes cleanly on GPUs and ASICs, which can run huge numbers of hash iterations concurrently far cheaper than a general-purpose CPU can. &lt;a href="https://pages.nist.gov/800-63-3/sp800-63b.html" rel="noopener noreferrer"&gt;NIST SP 800-63B&lt;/a&gt; sets the floor at "typically at least 10,000 iterations," while the current &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP Password Storage Cheat Sheet&lt;/a&gt; recommends 600,000 iterations for PBKDF2-HMAC-SHA256 in new systems specifically because commodity GPU cracking has gotten so much faster since the function was designed. PBKDF2 is still considered sound — it just needs a high, regularly-revisited iteration count to stay expensive against modern hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  bcrypt: built for login checks, not general key derivation
&lt;/h2&gt;

&lt;p&gt;bcrypt (1999) wraps the Blowfish cipher into a password-hashing scheme with a configurable, exponential cost factor. It was a real improvement over unsalted or fast-hashed passwords at the time, and OWASP still lists it as an acceptable choice with a work factor "as large as verification server performance will allow, with a minimum of 10."&lt;/p&gt;

&lt;p&gt;Two things limit it outside login-check use cases: it silently truncates input past 72 bytes, and — like PBKDF2 — its cost is CPU time only, so it doesn't resist a well-funded, memory-rich cracking rig as well as a memory-hard function does. It's also not part of any Web Crypto API standard, so a browser can't produce it without shipping a separate implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Argon2: memory-hard, the modern default
&lt;/h2&gt;

&lt;p&gt;Argon2 won the &lt;a href="https://www.password-hashing.net/" rel="noopener noreferrer"&gt;Password Hashing Competition&lt;/a&gt; in 2015 and is standardized in &lt;a href="https://www.rfc-editor.org/rfc/rfc9106" rel="noopener noreferrer"&gt;RFC 9106&lt;/a&gt;. Its cost has three independent dials: iterations (time), &lt;strong&gt;memory&lt;/strong&gt; (how much RAM each computation must hold), and parallelism. That memory requirement is the important change — a GPU or ASIC that can run millions of cheap hash operations in parallel can't cheat past a function that demands, say, 19 MiB of memory &lt;em&gt;per guess&lt;/em&gt;. Memory is expensive to parallelize at scale in a way that raw compute isn't.&lt;/p&gt;

&lt;p&gt;OWASP now recommends &lt;strong&gt;Argon2id&lt;/strong&gt; (a hybrid variant resistant to both side-channel and GPU-style attacks) as the first choice for new password-hashing systems, falling back to PBKDF2 only when FIPS-140 compliance is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three, side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;PBKDF2&lt;/th&gt;
&lt;th&gt;bcrypt&lt;/th&gt;
&lt;th&gt;Argon2id&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Defined&lt;/td&gt;
&lt;td&gt;RFC 2898 (2000)&lt;/td&gt;
&lt;td&gt;1999, no formal RFC&lt;/td&gt;
&lt;td&gt;RFC 9106 (2021)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost dimension&lt;/td&gt;
&lt;td&gt;Iterations (CPU only)&lt;/td&gt;
&lt;td&gt;Cost factor (CPU only)&lt;/td&gt;
&lt;td&gt;Time + memory + parallelism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU/ASIC resistance&lt;/td&gt;
&lt;td&gt;Weaker — parallelizes well&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Strong when memory is tuned high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input limits&lt;/td&gt;
&lt;td&gt;None significant&lt;/td&gt;
&lt;td&gt;Truncates past 72 bytes&lt;/td&gt;
&lt;td&gt;None significant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native in the browser (Web Crypto API)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIPS-140 status&lt;/td&gt;
&lt;td&gt;Approved&lt;/td&gt;
&lt;td&gt;Not a NIST/FIPS algorithm&lt;/td&gt;
&lt;td&gt;Not currently FIPS-approved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why FileX uses PBKDF2
&lt;/h2&gt;

&lt;p&gt;FileX derives the AES-256 key for every &lt;code&gt;.filex&lt;/code&gt; container with &lt;strong&gt;PBKDF2-HMAC-SHA256, a random 16-byte salt, and 250,000 iterations&lt;/strong&gt;, calling &lt;code&gt;crypto.subtle.deriveKey&lt;/code&gt; directly — the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey" rel="noopener noreferrer"&gt;Web Crypto API&lt;/a&gt; built into every modern browser. That's the deciding factor: &lt;code&gt;SubtleCrypto.deriveKey&lt;/code&gt; supports PBKDF2, HKDF, and ECDH natively. It does not support Argon2 or bcrypt. Getting either of those into the browser means shipping a third-party WebAssembly implementation and trusting it the way you'd trust any dependency — which cuts against FileX's rule of using only the browser's own audited, self-hosted crypto primitives with nothing extra to fetch or verify.&lt;/p&gt;

&lt;p&gt;That's an honest trade-off, not a claim that PBKDF2 is the strongest KDF available. Argon2id's memory-hardness is a genuine advantage against large-scale GPU cracking, and if you're designing a server-side login system today, OWASP's guidance to prefer Argon2id over PBKDF2 is worth following. FileX's use case is different in one respect but not immune to the same math: it derives a &lt;em&gt;file encryption key&lt;/em&gt; from a password, not a login-check hash, but an attacker who obtains a &lt;code&gt;.filex&lt;/code&gt; file still faces the same offline brute-force economics — the salt and iteration count are exactly what slow them down. FileX's 250,000 iterations sit well above the NIST floor of 10,000, though below OWASP's newer 600,000-iteration figure for stored password verifiers; iteration counts are a moving target as hardware gets faster, which is why the cheat sheets keep raising them.&lt;/p&gt;

&lt;p&gt;The practical upshot for you: the KDF is only half the defense. A long, random password does more for your file's security than any iteration count can compensate for on its own — &lt;a href="https://files.cybxsan.com/tools/generate-strong-passwords/" rel="noopener noreferrer"&gt;generate one in your browser&lt;/a&gt; with the same zero-upload guarantee. For the full picture of how the derived key gets used — AES-256-GCM, the random IV, the authentication tag that rejects tampering — see &lt;a href="https://files.cybxsan.com/blog/how-aes-256-gcm-encryption-protects-your-files/" rel="noopener noreferrer"&gt;how AES-256-GCM keeps your files safe&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All three — PBKDF2, bcrypt, Argon2 — exist to make password guessing slow, not to make encryption itself stronger.&lt;/li&gt;
&lt;li&gt;PBKDF2 and bcrypt cost CPU time only; Argon2 also costs memory, which is why it resists GPU/ASIC cracking better.&lt;/li&gt;
&lt;li&gt;Web browsers only implement PBKDF2 natively (via the Web Crypto API), which is why FileX — and most in-browser crypto — uses it rather than Argon2 or bcrypt.&lt;/li&gt;
&lt;li&gt;The password you choose still matters more than the KDF choice. &lt;a href="https://files.cybxsan.com/tools/encrypt-files-in-browser/" rel="noopener noreferrer"&gt;Encrypt a file in your browser&lt;/a&gt; — nothing is uploaded, and the live monitor on the page proves it.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>pbkdf2</category>
      <category>argon2</category>
      <category>keyderivation</category>
      <category>encryption</category>
    </item>
  </channel>
</rss>
