<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Dmitry Chestnykh&#39;s blog about tools, online business, technology, programming, and life.">
<link rel="alternate" type="application/atom+xml" href="https://dchest.com/atom.xml" title="dchest.com Atom feed">
<link rel="alternate" type="application/json" href="https://dchest.com/feed.json" title="dchest.com JSON feed">
<link rel="apple-touch-icon" href="/img/apple-touch-icon.png">
<link rel="shortcut icon" href="/img/favicon.png?v=1">
<link rel="preconnect" href="https://you.codingrobots.com">
<meta property="og:type" content="website">
<meta property="og:url" content="https://dchest.com">
<meta property="og:title" content="dchest.com">
<meta property="og:description" content="Dmitry Chestnykh&#39;s blog about tools, online business, technology, programming, and life.">
<title>dchest.com</title>
<style>:root{--f-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--f-mono:Consolas,"Roboto Mono","Liberation Mono",Menlo,"DejaVu Sans Mono",Courier,monospace;--f-serif:Georgia,'Times New Roman',Times,serif}*{box-sizing:border-box}body{margin:0;padding:0}body,textarea,input,select{font-family:var(--f-sans);font-size:16px;line-height:1.6}a:link,a:visited{color:#0D47A1;text-decoration:none}a:hover{text-decoration:underline}code{font:13px var(--f-mono);color:#333;background-color:transparent;padding:0}pre{line-height:1.2}blockquote{padding:0 20px;margin:0 0 20px;border-left:5px solid #eee;font-size:16px;color:#555}hr{margin:20px 0;border:0;border-top:1px solid #eee}address{font-style:normal}main,#mf,#mh>nav,#instr{display:block;max-width:800px;margin:auto;padding:15px}#mh{box-shadow:0 0 2px rgba(0,0,0,0.3);margin-bottom:20px;background:rgba(0,0,0,0.02)}#mh>nav{position:relative;padding:5px;font-weight:500}#mh h1{position:absolute;display:block;font-size:18px;line-height:1;margin:0 20px 0 0}#mh .logo{width:54px;height:64px}#mh h1 a:link,#mh h1 a:visited{text-decoration:none}#mh a:link,#mh a:visited{color:#444;white-space:nowrap;margin-right:20px}#mh ul{list-style:none;margin:0 0 0 80px;padding:5px}#mh ul>li{display:inline-block}#mf{font-size:14px;clear:both;margin-bottom:10px;color:#665}a.feed{display:inline-block;margin-right:6px;padding:1px 6px;border:1px solid #665;border-radius:3px;font-size:10px;text-decoration:none;color:#443;vertical-align:text-top}.post-content,.page-content{font-family:var(--f-serif);font-size:18px;line-height:1.5}.post-content h2,.post-content h3{font-family:var(--f-sans)}.post{margin:0 30px 30px 0}.page-header,.post-title{margin:30px 0 40px 0;padding:0;font-size:38px;font-weight:700;line-height:1.08349;font-size:48px;letter-spacing:-.003em}.post-title>a:link,.post-title>a:visited{color:#333}.post-title>a:hover{color:#666;text-decoration:none}.post-content a:link{text-decoration:underline}.post-content a:visited,.archive a:visited{color:#512DA8}.post-content img{max-width:100%;height:auto}.post-content>p:last-child{margin-bottom:0}.post-meta{font-size:14px;color:#887;margin-top:20px}.post-date a{color:#777;text-decoration:none}.post-more-link{}.comments{margin:30px 0;padding-top:10px;border-top:1px solid #eee;font-size:14px}.comment{margin-top:20px}.comment-author{font-weight:bold}.comment-date{color:#999}.comment-date:before{content:' / '}.comment-body{padding-left:15px}figcaption{color:#777;font-style:italic;text-align:center;font-size:80%}.articles .date{font-size:13px;font-family:var(--f-mono);text-align:right;color:#665;white-space:nowrap;vertical-align:baseline;padding-top:4px}.articles .title{padding-left:10px}sup{vertical-align:top;position:relative;top:-4px}aside h3{color:#887;text-transform:uppercase;margin:0;font-size:14px}aside ul{padding-left:20px;margin-bottom:0}#instr{font-size:8px;color:#887}</style>
</head>
<body>
<header id="mh" data-kkr-search="noindex">
<nav>
<h1><a href="/"><img src="/img/dchest-website.webp" class="logo" alt="Dmitry Chestnykh" title="Home page"></a></h1>
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/authbook/">Book</a></li>
<li><a href="https://www.codingrobots.com">Apps</a></li>
<li><a href="https://zine.dev">Zine</a></li>
<li><a href="https://x.com/dchest">X</a></li>
<li><a href="https://bsky.app/profile/dchest.com">Bluesky</a></li>
<li><a href="https://mastodon.social/@dchest" rel="me">Mastodon</a></li>
<li><a href="https://pixelfed.social/dchest" rel="me">Pixelfed</a></li>
</ul>
</nav>
</header>
<main>
<style>.homebook{display:grid;grid-template-columns:min-content auto;gap:20px;margin-left:-15px}.homebook-desc{align-self:center;max-width:600px}.homebook-img{max-width:150px}@media(max-width:767px){.homebook{margin-left:0}.homebook-img{max-width:60px}.homebook-desc{align-self:stretch;max-width:100%}.homebook-desc h3{margin-top:0}}</style>
<h2>Books</h2>
<div class="homebook">
<div>
<a href="/authbook/"><img class="homebook-img" src="/img/authbook/auth-book-small.webp" alt="Password authentication for web and mobile apps - Book cover"></a>
</div>
<div class="homebook-desc">
<h3><a href="/authbook/">Password Authentication for Web and Mobile Apps</a></h3>
<p>
Learn how to securely authenticate users,
how to hash and store passwords, use sessions and tokens,
prevent common attacks, and more.
</p>
<p><a href="/authbook/">Get the book <svg style="vertical-align: text-bottom" xmlns="http://www.w3.org/2000/svg"
          width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
          stroke-linecap="round" stroke-linejoin="round">
          <polyline points="9 18 15 12 9 6"></polyline>
        </svg></a></p>
</div>
</div>
<h2>Software</h2>
<ul style="padding-left:20px;list-style:square;color:#777">
<li><span style="color:red">New!</span> <a href="https://iwl.me"><b>I Write Like</b>: a web-based Markdown text
editor with various writing analysis tools.</a></li>
<li><span style="color:red">New!</span> <a href="https://calcish.com"><b>Calcish</b> = Calculator + JavaScript + AI +
Notebook</a>.</li>
<li><a href="https://www.codingrobots.com">Check out some useful apps for Mac by my company, <i>Coding Robots</i>.</a>
</li>
<li><a href="https://github.com/dchest">My open source projects are on GitHub.</a></li>
</ul>
<h2>Articles</h2>

<table class="articles" data-kkr-search="noindex">
<tr>
<td class="date">Aug 09, 2025</td>
<td class="title"><a href="/2025/08/09/mlkem-webcrypto/">ML-KEM in WebCrypto API</a></td>
</tr>
<tr>
<td class="date">Jun 17, 2025</td>
<td class="title"><a href="/2025/06/17/how-to-store-web-data-in-keychain/">How to store web app data in the system keychain</a></td>
</tr>
<tr>
<td class="date">Jul 09, 2020</td>
<td class="title"><a href="/2020/07/09/blurring-is-not-enough/">Blurring is not enough</a></td>
</tr>
<tr>
<td class="date">Jul 08, 2020</td>
<td class="title"><a href="/2020/07/08/swiftui-is-the-future/">SwiftUI is the future</a></td>
</tr>
<tr>
<td class="date">Jun 27, 2020</td>
<td class="title"><a href="/2020/06/27/platform-authenticators-for-web-authentication-in-safari-14/">Platform authenticators for Web Authentication in Safari 14</a></td>
</tr>
<tr>
<td class="date">Jun 15, 2020</td>
<td class="title"><a href="/2020/06/15/does-salt-need-to-be-random-for-password-hashing/">Does salt need to be random for password hashing?</a></td>
</tr>
<tr>
<td class="date">May 25, 2020</td>
<td class="title"><a href="/2020/05/25/improving-storage-of-password-encrypted-secrets-in-end-to-end-encrypted-apps/">Improving storage of password-encrypted secrets in end-to-end encrypted apps</a></td>
</tr>
<tr>
<td class="date">May 19, 2020</td>
<td class="title"><a href="/2020/05/19/why-password-peppering-in-devise-library-for-rails-is-not-secure/">Why password peppering in Devise library for Rails is not secure</a></td>
</tr>
<tr>
<td class="date">May 15, 2020</td>
<td class="title"><a href="/2020/05/15/my-book-on-password-authentication-is-out/">My book on password authentication is out</a></td>
</tr>
<tr>
<td class="date">Jan 16, 2019</td>
<td class="title"><a href="/2019/01/16/how-to-use-chrome-securely/">How to use Chrome securely</a></td>
</tr>
<tr>
<td class="date">Jan 12, 2019</td>
<td class="title"><a href="/2019/01/12/copywriting-gems-from-a-hundred-year-old-sears-catalog/">Copywriting gems from a hundred-year-old Sears catalog</a></td>
</tr>
<tr>
<td class="date">Nov 18, 2016</td>
<td class="title"><a href="/2016/11/18/nextcloud/">Synching Android and macOS with Nextcloud</a></td>
</tr>
<tr>
<td class="date">Oct 23, 2016</td>
<td class="title"><a href="/2016/10/23/nearlyfreespeech/">How to disregard business trends to find your niche</a></td>
</tr>
<tr>
<td class="date">Jul 15, 2015</td>
<td class="title"><a href="/2015/07/15/securing-go-web-applications/">Securing Go web applications</a></td>
</tr>
<tr>
<td class="date">Jul 12, 2011</td>
<td class="title"><a href="/2011/07/12/aqdataextensions/">Mac developers: don't use AQDataExtensions</a></td>
</tr>
</table>
<h3>See also</h3>
<table class="articles" data-kkr-search="noindex">
<tr>
<td class="date">Aug 18, 2025</td>
<td class="title"><a href="https://iwl.me/tools/markdown-to-word">Convert Markdown to Word <svg
          xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none"
          stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
          class="lucide lucide-external-link">
          <path d="M15 3h6v6" />
          <path d="M10 14 21 3" />
          <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
        </svg></a></td>
</tr>
<tr>
<td class="date">May 31, 2024</td>
<td class="title"><a href="https://blog.iwl.me/2024/05/31/introducing-new-iwl/">Introducing the new I Write Like
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none"
          stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
          class="lucide lucide-external-link">
          <path d="M15 3h6v6" />
          <path d="M10 14 21 3" />
          <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
        </svg></a></td>
</tr>
<tr>
<td class="date">Mar 25, 2024</td>
<td class="title"><a href="https://calcish.com/blog/2024/03/25/release/">Calcish 1.0 is here! <svg
          xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none"
          stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
          class="lucide lucide-external-link">
          <path d="M15 3h6v6" />
          <path d="M10 14 21 3" />
          <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
        </svg></a></td>
</tr>
</table>
<h3>Tags</h3>
<p data-kkr-search="noindex">
<a href="/tag/books/">Books</a> &#183; <a href="/tag/business/">Business</a> &#183; <a href="/tag/copywriting/">Copywriting</a> &#183; <a href="/tag/cryptography/">Cryptography</a> &#183; <a href="/tag/go/">Go</a> &#183; <a href="/tag/programming/">Programming</a> &#183; <a href="/tag/security/">Security</a> &#183; <a href="/tag/software/">Software</a> &#183; <a href="/tag/swift/">Swift</a>
</p>
</main>
<footer data-kkr-search="noindex">
<div id="mf">
<a href="/atom.xml" class="feed atom">Feed</a>
&copy; 2011-2026 &nbsp; <a rel="author" href="/about/">Dmitry Chestnykh</a> &nbsp; &#183; &nbsp;
<a href="/terms/">Terms</a> &nbsp; &#183; &nbsp;
<a href="/search/">Search</a>

<p style="margin-top:5em;display:flex;gap:1em">
<a href="https://www.codingrobots.com/memoires/"><img src="/img/memoires.gif" width="88" height="31" alt="Mémoires Now!"></a>
<a href="https://iwl.me"><img src="/img/iwl.gif" width="88" height="31" alt="I Write Like"></a>
<a href="https://tintara.tripod.com/FramesSuck.html" rel="nofollow"><img src="/img/noframes.gif" width="88" height="31" alt="Campaign against FRAMES!"></a>
</p>
</div>
</footer>
</body>
</html>
