<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>2fa &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/2fa/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Sat, 11 Apr 2026 06:53:47 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>2fa &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Some minor bugs in Proton's new Authenticator app]]></title>
		<link>https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/</link>
					<comments>https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 31 Aug 2025 11:34:55 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[Proton]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=62350</guid>

					<description><![CDATA[I maintain a a test-suite for TOTP codes. It contains a bunch of codes which adhere to the specification, some of which stretch it to breaking point, and some that are completely invalid.  These codes are a good starting point for checking whether a 2FA / MFA app works correctly.  Proton have release a swish new authenticator app for Android, iOS, Mac, Linux and Windows. Sadly, their open source…]]></description>
										<content:encoded><![CDATA[<p>I maintain a <a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/">a test-suite for TOTP codes</a>. It contains a bunch of codes which adhere to the specification, some of which stretch it to breaking point, and some that are completely invalid.  These codes are a good starting point for checking whether a 2FA / MFA app works correctly.</p>

<p>Proton have release a swish <a href="https://proton.me/authenticator">new authenticator app</a> for Android, iOS, Mac, Linux and Windows. Sadly, their <a href="https://github.com/protonpass/android-pass">open source repository</a> doesn't allow for bug reports so I'm blogging in public instead.</p>

<p>The good news is, the majority of tests pass. It accepts a wide range of acceptable codes and refuses to store most broken ones. There are a few niggles though.  None of these are severe security issues, but they probably ought to be fixed.</p>

<h2 id="very-long-codes"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#very-long-codes">Very long codes</a></h2>

<p>The maximum number of digits which can be generated by the standard TOTP algorithm is 10.  Proton happily scans codes containing 1 - 9 digits, but complains about 10 digit codes.  So this fails:</p>

<p><code>otpauth://totp/issuer%3Aaccount%20name?secret=QWERTYUIOP&amp;digits=10&amp;issuer=issuer&amp;algorithm=SHA1&amp;period=30</code></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/08/10digit.webp" alt="QR code for a 10 digit TOTP." width="360" height="360" class="aligncenter size-full wp-image-62370">

<p>The TOTP RFC says:</p>

<blockquote><p>Basically, the output of the HMAC-SHA-1 calculation is truncated to obtain user-friendly values</p>

<p><a href="https://datatracker.ietf.org/doc/html/rfc6238#section-1.2">1.2. Background</a></p></blockquote>

<p>But doesn't say how far to truncate.</p>

<p>There's nothing I can see in the spec that <em>prevents</em> an implementer using all 10.</p>

<p><strong>Risk:</strong> The user may not be able to store a valid code.</p>

<p><strong>Recommendation:</strong> Allow 10 digit codes.</p>

<h2 id="invalid-secrets"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#invalid-secrets">Invalid Secrets</a></h2>

<p>Here we get to yet another <a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/">deficiency in the TOTP specification</a>.  How is a secret defined?</p>

<p>Google says the secret is:</p>

<blockquote><p>an arbitrary key value encoded in Base32 according to RFC 3548. The padding specified in RFC 3548 section 2.2 is not required and should be omitted.</p></blockquote>

<p>Whereas Apple says it is:</p>

<blockquote><p>An arbitrary key value encoded in Base32. Secrets should be at least 160 bits.</p></blockquote>

<p>Either way, <a href="https://www.rfc-editor.org/rfc/rfc3548#section-5">the Base32 alphabet</a> contains only uppercase letters and a few numbers.  What happens if we give it a secret like <code>QWERT!£$%^)*(YUIOP</code>?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/08/invaid-secret.webp" alt="QR code for an invalid secret." width="360" height="360" class="aligncenter size-full wp-image-62371">

<p>Proton Authenticator just accepts it. It stores the full secret but I'm not sure how it generates the code based on it.</p>

<p><strong>Risk:</strong> The code may be generated incorrectly.</p>

<p><strong>Recommendation:</strong> Warn the user that the secret may be invalid and that a correct 2FA code cannot be guaranteed.</p>

<h2 id="issuer-mismatch"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#issuer-mismatch">Issuer Mismatch</a></h2>

<p>In this example, the first issuer is example.com but the second issuer is microsoft.com</p>

<p><code>otpauth://totp/example.com%3Aaccount%20name?secret=QWERTYUIOP&amp;digits=6&amp;issuer=microsoft.com&amp;algorithm=SHA1&amp;period=30</code></p>

<p>What should the TOTP reader do with this? Proton chooses microsoft.com.</p>

<p>This is something which, again, is inconsistent between major providers.</p>

<p>Google says this parameter is:</p>

<blockquote><p><strong>Strongly Recommended</strong> The issuer parameter is a string value indicating the provider or service this account is associated with, URL-encoded according to RFC 3986. If the issuer parameter is absent, issuer information may be taken from the issuer prefix of the label. If both issuer parameter and issuer label prefix are present, they should be equal.</p></blockquote>

<p>Apple merely says:</p>

<blockquote><p>The domain of the site or app. The password manager uses this field to suggest credentials when setting up a new code generator.</p></blockquote>

<p>Yubico equivocates with</p>

<blockquote><p>The issuer parameter is recommended, but it can be absent. Also, the issuer parameter and issuer string in label should be equal.</p></blockquote>

<p><strong>Risk:</strong> The code may be displayed with the wrong issuer.</p>

<p><strong>Recommendation:</strong> Warn the user that there are multiple issuers. Let them choose which one is correct.</p>

<h2 id="dealing-with-defaults"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#dealing-with-defaults">Dealing With Defaults</a></h2>

<p>What should a TOTP app do if there is missing information? Proton does the following:</p>

<ul>
<li>If the code has no number set for digits, it defaults to 6</li>
<li>If the code has no time set for period, it defaults to 30</li>
<li>If the code has no algorithm, it defaults to SHA1</li>
</ul>

<p><strong>Risk:</strong> Low. The user normally has to confirm with the issuer that the the TOTP code has been correctly stored.</p>

<p><strong>Recommendation:</strong> Let the user know that the code has missing data and may not be correct.</p>

<h2 id="odd-labels"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#odd-labels">Odd Labels</a></h2>

<p>The label allows you to have multiple codes for the same service. For example <code>Big Bank:Personal Account</code> and <code>Big Bank:Family Savings</code>.  The Google spec is slightly confusing:</p>

<blockquote><p>The issuer prefix and account name should be separated by a literal or url-encoded colon, and optional spaces may precede the account name. Neither issuer nor account name may themselves contain a colon.</p></blockquote>

<p>What happens if there are spaces before the account name?</p>

<p><code>otpauth://totp/Spaces:%20%20%20%20%20%20%20%20%20%20%20%20test%40example.com?secret=QWERTYUIOP&amp;digits=6&amp;issuer=&amp;algorithm=SHA1&amp;period=30</code>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/08/spaces.webp" alt="QR code for a TOTP." width="400" height="400" class="aligncenter size-full wp-image-62374"></p>

<p>Proton strips the spaces (probably wise) but also removes the issuer.</p>

<p><strong>Risk:</strong> The user will not know which account the code is for.</p>

<p><strong>Recommendation:</strong> Keep the issuer.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#timeline">Timeline</a></h2>

<p>These aren't particularly high severity bugs, nevertheless I like to give organisations a bit of time to respond.</p>

<ul>
<li>2025-07-31 - Discovered.</li>
<li>2025-08-01 - Disclosed <a href="https://bsky.app/profile/proton.me/post/3lvbnajumh22e">via a web form</a>.</li>
<li>2025-08-31 - Automatically published.</li>
</ul>

<h2 id="next-steps"><a href="https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/#next-steps">Next Steps</a></h2>

<ul>
<li>If you're a user, <a href="https://codeberg.org/edent/TOTP_Test_Suite">please contribute tests</a> or give feedback.</li>
<li>If you're a developer, please check your app conforms to the specification.</li>
<li>If you're from a security company - wanna help me write up a proper RFC so this doesn't cause issues in the future?</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=62350&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/08/some-minor-bugs-in-protons-new-authenticator-app/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[That's Not How A SIM Swap Attack Works]]></title>
		<link>https://shkspr.mobi/blog/2025/04/thats-not-how-a-sim-swap-attack-works/</link>
					<comments>https://shkspr.mobi/blog/2025/04/thats-not-how-a-sim-swap-attack-works/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 17 Apr 2025 11:34:54 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sim]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=59603</guid>

					<description><![CDATA[There&#039;s a disturbing article in The Guardian about a person who was on the receiving end of a successful cybersecurity attack.  EE texted to say they had processed my sim activation request, and the new sim would be active in 24 hours. I was told to contact them if I hadn’t requested this. I hadn’t, so I did so immediately. Twenty-four hours later, my mobile stopped working and money was wit…]]></description>
										<content:encoded><![CDATA[<p>There's <a href="https://www.theguardian.com/money/2025/apr/15/ee-was-unapologetic-after-i-tried-to-stop-a-sim-swap">a disturbing article in The Guardian</a> about a person who was on the receiving end of a successful cybersecurity attack.</p>

<blockquote><p>EE texted to say they had processed my sim activation request, and the new sim would be active in 24 hours. I was told to contact them if I hadn’t requested this. I hadn’t, so I did so immediately. Twenty-four hours later, my mobile stopped working and money was withdrawn from my bank account.
</p><p><strong>With their alien sim, the ­fraudster infiltrated my handset and stole details for every account I had.</strong> Passwords and logins had been changed for my finance, retail and some social media accounts. </p></blockquote>

<p>(Emphasis added.)</p>

<p>I realise it is in the consumer rights section of the newspaper, not the technology section, and I dare-say some editorialising has gone on, but that's <em>nonsense</em>.</p>

<p>Here's how a SIM swap works.</p>

<ol>
<li>Attacker convinces your phone company to reassign your telephone number to a new SIM.</li>
<li>Attacker goes to a website where you have an account, and initiates a password reset.</li>
<li>Website sends a verification code to your phone number, which is now in the hands of the attacker.</li>
<li>Attacker supplies verification code and gets into your account.</li>
</ol>

<p>Do you notice the missing step there?</p>

<p>At no point does the attacker "infiltrate" your handset. Your handset is still in your possession. The SIM is dead, but that doesn't give the attacker access to the phone itself. There is simply <strong>no way</strong> for someone to put a new SIM into their phone and automatically get access to your device.</p>

<p>Try it now. Take your SIM out of your phone and put it into a new one. Do all of your apps suddenly appear? Are your usernames and passwords visible to you? No.</p>

<p>There are ways to transfer your data from an <a href="https://support.apple.com/en-gb/HT210216">iPhone</a> or <a href="https://support.google.com/android/answer/13761358?hl=en">Android</a> - but they require a lot more work than swapping a SIM.</p>

<p>So how did the attacker know which websites to target and what username to use?</p>

<h2 id="what-probably-happened"><a href="https://shkspr.mobi/blog/2025/04/thats-not-how-a-sim-swap-attack-works/#what-probably-happened">What (Probably) Happened</a></h2>

<p>Let's assume the person in the article didn't have malware on their device and hadn't handed over all their details to a cold caller.</p>

<p>The most obvious answer is that the attacker <em>already</em> knew the victim's email address. Maybe the victim gave out their phone number and email to some dodgy site, or they're listed on their contact page, or something like that.</p>

<p>The attacker now has two routes.</p>

<p>First is "hit and hope". They try the email address on hundreds of popular sites' password reset page until they get a match. That's time-consuming given the vast volume of websites.</p>

<p>Second is targetting your email. If the attacker can get into your email, they can see which sites you use, who your bank is, and where you shop.  They can target those specific sites, perform a password reset, and get your details.</p>

<p>I strongly suspect it is the latter which has happened. The swapped SIM was used to reset the victim's email password. Once in the email, all the accounts were easily found. At no point was the handset broken into.</p>

<h2 id="what-can-i-do-to-protect-myself"><a href="https://shkspr.mobi/blog/2025/04/thats-not-how-a-sim-swap-attack-works/#what-can-i-do-to-protect-myself">What can I do to protect myself?</a></h2>

<p>It is important to realise that <a href="https://shkspr.mobi/blog/2024/03/theres-nothing-you-can-do-to-prevent-a-sim-swap-attack/">there's nothing you can do to prevent a SIM-swap attack</a>! Your phone company is probably incompetent and their staff can easily be bribed. You do not control your phone number. If you get hit by a SIM swap, it almost certainly isn't your fault.</p>

<p>So here are some practical steps anyone can take to reduce the likelihood and effectiveness of this class of attack:</p>

<ul>
<li>Remember that <a href="https://shkspr.mobi/blog/2020/03/its-ok-to-lie-to-wifi-providers/">it's OK to lie to WiFi providers</a> and other people who ask for your details. You don't need to give someone your email for a receipt. You don't need to hand over your real phone number on a survey. This is the most important thing you can do.</li>
<li>Try to hack yourself. How easy would it be for an attacker who had stolen your phone number to also steal your email address? Open up a private browser window and try to reset your email password. What do you notice? How could you secure yourself better?</li>
<li>Don't use SMS for two-factor authentication. If you are given a choice of 2FA methods, use a dedicated app. If the only option you're given is SMS - contact the company to complain, or leave for a different provider.</li>
<li>Don't rely on a <a href="https://bsky.app/profile/scientits.bsky.social/post/3lmz2zaxkf22k">setting a PIN for your SIM</a>. The PIN only protects the physical SIM from being moved to a new device; it does nothing to stop your number being ported to a new SIM.</li>
<li>Finally, realise that professional criminals only need to be lucky once but you need to be lucky all the time.</li>
</ul>

<p>Stay safe out there.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=59603&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/04/thats-not-how-a-sim-swap-attack-works/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[FobCam '25 - All my MFA tokens on one page]]></title>
		<link>https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/</link>
					<comments>https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 11 Apr 2025 11:34:34 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[Satire (Probably)]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=59334</guid>

					<description><![CDATA[Some ideas are timeless. Back in 2004, an anonymous genius set up &#34;FobCam&#34;. Tired of having to carry around an RSA SecurID token everywhere, our hero simply left the fob at home with an early webcam pointing at it. And then left the page open for all to see.    Security expert Bruce Schneier approved of this trade-off between security and usability - saying what we&#039;re all thinking:  Here’s a guy w…]]></description>
										<content:encoded><![CDATA[<p>Some ideas are timeless. Back in 2004, an anonymous genius set up "<a href="https://web.archive.org/web/20060215092922/http://fob.webhop.net/">FobCam</a>". Tired of having to carry around an RSA SecurID token everywhere, our hero simply left the fob at home with an early webcam pointing at it. And then left the page open for all to see.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/FobCam-fs8.png" alt="Website with a grainy webcam photo of a SecurID fob." width="512" class="aligncenter size-full wp-image-59341">

<p>Security expert Bruce Schneier approved<sup id="fnref:🫠"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:🫠" class="footnote-ref" title="🫠" role="doc-noteref">0</a></sup> of this trade-off between security and usability - saying what we're all thinking:</p>

<blockquote><p>Here’s a guy who has a webcam pointing at his SecurID token, so he doesn’t have to remember to carry it around. Here’s the strange thing: unless you know who the webpage belongs to, it’s still good security.
<a href="https://www.schneier.com/crypto-gram/archives/2004/0815.html#:~:text=webcam">Crypto-Gram - August 15, 2004</a></p></blockquote>

<p>Nowadays, we have to carry dozens of these tokens with us. Although, unlike the poor schmucks of 2004, we have an app for that. But I don't always have access to my phone. Sometimes I'm in a secure location where I can't access my electronics. Sometimes my phone gets stolen, and I need to log into Facebook to whinge about it. Sometimes I just can't be bothered to remember which fingerprint unlocks my phone<sup id="fnref:🖕"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:🖕" class="footnote-ref" title="🖕" role="doc-noteref">1</a></sup>.</p>

<p>Using the <a href="https://shkspr.mobi/blog/2025/03/using-the-web-crypto-api-to-generate-totp-codes-in-javascript-without-3rd-party-libraries/">Web Crypto API, it is easy to Generate TOTP Codes in JavaScript directly in the browser</a>.  So here are all my important MFA tokens. If I ever need to log in somewhere, I can just visit this page and grab the code I need<sup id="fnref:🙃"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:🙃" class="footnote-ref" title="🙃" role="doc-noteref">2</a></sup>.</p>

<h2 id="all-my-important-codes"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#all-my-important-codes">All My Important Codes</a></h2>

<table>
<tbody><tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/github.svg" width="100" title="Github"></td><td id="otp0"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/bitwarden.svg" width="100" title="BitWarden"></td><td id="otp1"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/apple.svg" width="100" title="Apple"></td><td id="otp2"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/ebay.svg" width="100" title="ebay"></td><td id="otp3"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/amazon.svg" width="100" title="Amazon"></td><td id="otp4"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/npm.svg" width="100" title="NPM"></td><td id="otp5"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/paypal.svg" width="100" title="PayPal"></td><td id="otp6"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/facebook.svg" width="100" title="Facebook"></td><td id="otp7"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/zoom.svg" width="100" title="Zoom"></td><td id="otp8"></td></tr>
<tr><td><img src="https://edent.github.io/SuperTinyIcons/images/svg/linkedin.svg" width="100" title="LinkedIn"></td><td id="otp9"></td></tr>
</tbody></table>

<h2 id="what-the-actual-fuck"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#what-the-actual-fuck">What The <em>Actual</em> Fuck?</a></h2>

<p>A 2007 paper called <a href="https://cups.cs.cmu.edu/soups/2007/proceedings/p64_bauer.pdf">Lessons learned from the deployment of a smartphone-based access-control system</a> looked at whether fobs met the needs of their users:</p>

<blockquote><p>However, we observed that end users tend to be most concerned about how convenient [fobs] are to use. There are many examples of end users of widely used access-control technologies readily sacrificing security for convenience. For example, it is well known that users often write their passwords on post-it notes and stick them to their computer monitors. Other users are more inventive: a good example is the user who pointed a webcam at his fob and published the image online so he would not have to carry the fob around.</p></blockquote>

<p>As for Schneier's suggestion that anonymity added protection, a contemporary report noted that <a href="https://www.schneier.com/crypto-gram/archives/2004/0915.html#:~:text=Fobcam">the owner of the FobCam site was trivial to identify</a><sup id="fnref:dox"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:dox" class="footnote-ref" title="The neologism &quot;doxing&quot; hadn't yet been invented." role="doc-noteref">3</a></sup>.</p>

<p>Every security system involves trade-offs. I have a password manager, but with over a thousand passwords in it, the process of navigating and maintaining becomes a burden. <a href="https://shkspr.mobi/blog/2020/08/i-have-4-2fa-coverage/">The number of 2FA tokens I have is also rising</a>. All of these security factors need backing up. Those back-ups need testing<sup id="fnref:back"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:back" class="footnote-ref" title="As was written by the prophets: &quot;Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it&quot;" role="doc-noteref">4</a></sup>. It is an endless cycle of drudgery.</p>

<p>What's a rational user supposed to do<sup id="fnref:rat"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:rat" class="footnote-ref" title="I in no way imply that I am rational." role="doc-noteref">5</a></sup>? I suppose I could buy a couple of hardware keys, keep one in an off-site location, but somehow keep both in sync, and hope that a firmware-update doesn't brick them.</p>

<p>Should I just upload all of my passwords, tokens, secrets, recovery codes, passkeys, and biometrics<sup id="fnref:bro"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:bro" class="footnote-ref" title="Just one more factor, that'll fix security, just gotta add one more factor bro." role="doc-noteref">6</a></sup> into the cloud?</p>

<p>The cloud is just someone else's computer. This website is <em>my</em> computer. So I'm going to upload all my factors here. What's the worst that could happen<sup id="fnref:🤯"><a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fn:🤯" class="footnote-ref" title="This is left as an exercise for the reader." role="doc-noteref">7</a></sup>.</p>

<script>async function generateTOTP( 
    base32Secret = "QWERTY", 
    interval = 30, 
    length = 6, 
    algorithm = "SHA-1" ) {
    
    //  Decode the secret
    //  The Base32 Alphabet is specified at https://datatracker.ietf.org/doc/html/rfc4648#section-6
    const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
    let bits = "";
    
    //  Some secrets are padded with the `=` character. Remove padding.
    //  https://datatracker.ietf.org/doc/html/rfc3548#section-2.2
    base32Secret = base32Secret.replace( /=+$/, "" )

    //  Loop through the trimmed secret
    for ( let char of base32Secret ) {
        //  Ensure the secret's characters are upper case
        const value = alphabet.indexOf( char.toUpperCase() );

        //  If the character doesn't appear in the alphabet.
        if (value === -1) throw new Error( "Invalid Base32 character" );
        
        //  Binary representation of where the character is in the alphabet
        bits += value.toString( 2 ).padStart( 5, "0" );
    }

    //  Turn the bits into bytes
    let bytes = [];
    //  Loop through the bits, eight at a time
    for ( let i = 0; i < bits.length; i += 8 ) {
        if ( bits.length - i >= 8 ) {
                bytes.push( parseInt( bits.substring( i, i + 8 ), 2 ) );
        }
    }

    //  Turn those bytes into an array
    const decodedSecret = new Uint8Array( bytes );
    
    //  Number of seconds since Unix Epoch
    const timeStamp = Date.now() / 1000; 

    //  Number of intervals since Unix Epoch
    //  https://datatracker.ietf.org/doc/html/rfc6238#section-4.2
    const timeCounter = Math.floor( timeStamp / interval );

    //  Number of intervals in hexadecimal
    const timeHex = timeCounter.toString( 16 );

    //  Left-Pad with 0
    const paddedHex = timeHex.padStart( 16, "0" );

    //  Set up a buffer to hold the data
    const timeBuffer = new ArrayBuffer( 8 );
    const timeView   = new DataView( timeBuffer );
    
    //  Take the hex string, split it into 2-character chunks 
    const timeBytes = paddedHex.match( /.{1,2}/g ).map(
        //  Convert to bytes
        byte => parseInt( byte, 16 )
    );

    //  Write each byte into timeBuffer.
    for ( let i = 0; i < 8; i++ ) {
         timeView.setUint8(i, timeBytes[i]);
    }
    
    //  Use Web Crypto API to generate the HMAC key
    //  https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
    const key = await crypto.subtle.importKey(
        "raw",
        decodedSecret,
        { 
            name: "HMAC", 
            hash: algorithm 
        },
        false,
        ["sign"]
    );

    //  Sign the timeBuffer with the generated HMAC key
    //  https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign
    const signature = await crypto.subtle.sign( "HMAC", key, timeBuffer );
    
    //  Get HMAC as bytes
    const hmac = new Uint8Array( signature );

    //  https://datatracker.ietf.org/doc/html/rfc4226#section-5.4
    //  Use the last byte to generate the offset
    const offset = hmac[ hmac.length - 1 ] & 0x0f;

    //  Bit Twiddling operations
    const binaryCode = 
        ( ( hmac[ offset     ] & 0x7f ) << 24 ) |
        ( ( hmac[ offset + 1 ] & 0xff ) << 16 ) |
        ( ( hmac[ offset + 2 ] & 0xff ) <<  8 ) |
        ( ( hmac[ offset + 3 ] & 0xff ) );

    //  Turn the binary code into a decimal string
    const stringOTP = binaryCode.toString();

    //  Count backwards from the last character for the length of the code
    let otp = stringOTP.slice( -length)

    //  Pad with 0 to full length
    otp = otp.padStart( length, "0" );

    //  All done!
    return otp;
}
//  Placeholder for OTPs
var otps = [];

//  Do you really think these are my genuine codes? At least one of them is. But which?
var otpData = 
    [
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "IPT5TRO7VFK66M6SHUJ7XZNM2U6IZZ4L"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "EXGKOX26KMDSTL6KM3BYMPXXDDKNQEYM"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "UGVGXRQFHY62OWI5SGSTZLIQUMXTTVME"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "Y4UHVLFIZZZK7ENDYZ4O3ZZI2QWUJI37"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "Z2KDRL4ELOCDALT3OSNUK65Z2KPOWGUL"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "OWRQKSCBLRUZXYXLXIDATUK6UTG3CPVV"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "XQLSEGNYPBMVK35ZMDTVN5GFOZB46WJJ"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "M3KVKGRB2WVWOZXN437EMF2MS36G75IR",
            "Comment"    : "This is genuinely my Twitter TOTP secret - although the period should be 30. But what's the password? There's a clue somewhere in this source code!",
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "3EMER2B6YXIFMMAY5XBYLNF4NSEGJXCU"
        },
        {
            "algorithm"  : "SHA1",
            "digits"     :  6,
            "period"     : 15,
            "secret"     : "ZML6O5K7QSVFE5QIWNFFT7BIZI7PBHNV"
        }
    ]


var i = 0;

otpData.forEach (
    item => {
        //  Add OTP
        otps[i] = item;
        i++;
    }
);

//  Generate TOTP codes
async function update() {
    for (var i = 0; i < otps.length; i++){
            //  Convert the algorithm
            //  The algorithm name is different for TOTP and Web Crypto(!)
            algorithm = "SHA-1";
            
            document.getElementById( "otp" + i).innerHTML = await generateTOTP( 
                otps[i]["secret"], 
                otps[i]["period"], 
                otps[i]["digits"], 
                algorithm
            );
    }
}
//  Update every second
setInterval(update, 1000);

</script>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:🫠">
<p>🫠&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:🫠" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:🖕">
<p>🖕&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:🖕" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:🙃">
<p>🙃&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:🙃" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:dox">
<p>The neologism "doxing" hadn't yet been invented.&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:dox" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:back">
<p>As was written by the prophets: "<a href="https://lkml.iu.edu/hypermail/linux/kernel/9607.2/0292.html">Only wimps use tape backup: <em>real</em> men just upload their important stuff on ftp, and let the rest of the world mirror it</a>"&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:back" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:rat">
<p>I in no way imply that I am rational.&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:rat" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:bro">
<p>Just one more factor, that'll fix security, just gotta add one more factor bro.&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:bro" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:🤯">
<p>This is left as an exercise for the reader.&nbsp;<a href="https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/#fnref:🤯" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=59334&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/04/fobcam-25-all-my-mfa-tokens-on-one-page/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Towards a test-suite for TOTP codes]]></title>
		<link>https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/</link>
					<comments>https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 02 Mar 2025 12:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[HTOP]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=58593</guid>

					<description><![CDATA[Because I&#039;m a massive nerd, I actually try to read specification documents. As I&#039;ve ranted ad nauseam before, the current TOTP spec is irresponsibly obsolete.  The three major implementations of the spec - Google, Apple, and Yubico - all subtly disagree on how it should be implemented. Every other MFA app has their own idiosyncratic variants. The official RFC is infuriatingly vague. That&#039;s no…]]></description>
										<content:encoded><![CDATA[<p>Because I'm a massive nerd, I <em>actually try to read</em> specification documents. As I've ranted <i lang="la">ad nauseam</i> before, the current TOTP<sup id="fnref:totp"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#fn:totp" class="footnote-ref" title="Time-based One Time Passwords. Not the TV show you remember from your youth, grandad." role="doc-noteref">0</a></sup> spec is <a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/">irresponsibly obsolete</a>.</p>

<p>The three major implementations of the spec - <a href="https://github.com/google/google-authenticator/wiki/Key-Uri-Format">Google</a>, <a href="https://developer.apple.com/documentation/authenticationservices/securing-logins-with-icloud-keychain-verification-codes#3795996">Apple</a>, and <a href="https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html">Yubico</a> - all subtly disagree on how it should be implemented. Every other MFA app has their own idiosyncratic variants. The <a href="https://datatracker.ietf.org/doc/html/rfc6238">official RFC is infuriatingly vague</a>. That's no good for a security specification. Multiple implementations are great, multiple interpretations are not.</p>

<p>So I've <a href="https://edent.codeberg.page/TOTP_Test_Suite/">built a nascent test suite</a> - you can use it to see if your favourite app can correctly implement the TOTP standard.</p>

<p><a href="https://edent.codeberg.page/TOTP_Test_Suite/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/03/TOTP-Tests-fs8.png" alt="Screenshot showing a QR code and numeric codes." width="1024" height="813" class="aligncenter size-full wp-image-58598"></a></p>

<p>Please do contribute tests and / or feedback.</p>

<p>Here's what the standard <em>actually</em> says - see if you can find apps which don't implement it correctly.</p>

<h2 id="background"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#background">Background</a></h2>

<p>Time-based One Time Passwords are based on HOTP - HMAC-Based One-Time Password.</p>

<p>HOTP uses counters; a new password is regularly generated. TOTP uses time as the counter. At the time of writing this post, there have been about 1,740,800,000 seconds since the UNIX Epoc. So a TOTP with an period of 30 seconds is on counter (1,740,800,000 ➗ 30) = 58,026,666.  Every 30 seconds, that counter increments by one.</p>

<h3 id="number-of-digits"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#number-of-digits">Number of digits</a></h3>

<p>How many digits should your 2FA token have? Google says 6 or 8. YubiCo graciously allows 7. Why those limits? Who knows!?</p>

<p><a href="https://datatracker.ietf.org/doc/html/rfc4226#section-5.4">The HOTP specification gives an <em>example</em> of 6 digits</a>.  The example generates a code of <code>0x50ef7f19</code> which, in decimal, is <code>1357872921</code>. It then takes the last 6 digits to produce the code <code>872921</code>.</p>

<p>The TOTP RFC says:</p>

<blockquote><p>Basically, the output of the HMAC-SHA-1 calculation is truncated to obtain user-friendly values</p>

<p><a href="https://datatracker.ietf.org/doc/html/rfc6238#section-1.2">1.2. Background</a></p></blockquote>

<p>But doesn't say how far to truncate.</p>

<p>There's nothing I can see in the spec that <em>prevents</em> an implementer using all 10.  The HOTP spec, however, <em>does</em> place a minimum requirement - but no maximum:</p>

<blockquote><p>Implementations MUST extract a 6-digit code at a minimum and possibly 7 and 8-digit code.
Depending on security requirements, Digit = 7 or more SHOULD be considered in order to extract a longer HOTP value.
<a href="https://datatracker.ietf.org/doc/html/rfc4226#section-5.3">RFC 4226 - 5.3. Generating an HOTP Value</a></p></blockquote>

<p>(As a minor point, the first digit is restricted to 0-2, so being 10 digits long isn't significantly stronger than 9 digits.)</p>

<p>Is a 4 digit code acceptable? The security might be weaker, but the usability is greater. Most apps will allow a <em>one</em> digit code to be returned. If no digits are specified, what should the default be?</p>

<h3 id="algorithm"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#algorithm">Algorithm</a></h3>

<p>The given algorithm in the HOTP spec is SHA-1.</p>

<blockquote><p>In order to create the HOTP value, we will use the HMAC-SHA-1 algorithm
<a href="https://datatracker.ietf.org/doc/html/rfc4226#section-5.2">RFC 4226 - 5.2.  Description</a></p></blockquote>

<p>As we now know, SHA-1 has some fundamental weaknesses. The spec comments (perhaps somewhat naïvely) about SHA-1:</p>

<blockquote><p>The new attacks on SHA-1 have no impact on the security of HMAC-SHA-1.
<a href="https://datatracker.ietf.org/doc/html/rfc4226#appendix-B.2">RFC 4226 - B.2.  HMAC-SHA-1 Status</a></p></blockquote>

<p>I daresay that's accurate. But the TOTP authors disagree and allow for some different algorithms to be used. The specification for HMAC says:</p>

<blockquote><p>HMAC can be used with <em>any</em> iterative cryptographic hash function, e.g., MD5, SHA-1
[Emphasis added]
<a href="https://datatracker.ietf.org/doc/html/rfc2104">RFC 2104 - HMAC: Keyed-Hashing for Message Authentication</a></p></blockquote>

<p>So most TOTP implementation allow SHA-1, SHA-256, and SHA-512.</p>

<blockquote><p>TOTP implementations MAY use HMAC-SHA-256 or HMAC-SHA-512 functions […] instead of the HMAC-SHA-1 function that has been specified for the HOTP computation
<a href="https://datatracker.ietf.org/doc/html/rfc6238#section-1.2">RFC 6238 - TOTP: Time-Based One-Time Password Algorithm</a></p></blockquote>

<p>But the HOTP spec goes on to say:</p>

<blockquote><p>Current candidates for such hash functions include SHA-1, MD5, RIPEMD-128/160.
These different realizations of HMAC will be denoted by HMAC-SHA1, HMAC-MD5, HMAC-RIPEMD
<a href="https://datatracker.ietf.org/doc/html/rfc2104#section-1">RFC 2104 - Introduction</a></p></blockquote>

<p>So, should your TOTP app be able to handle an MD5 HMAC, or even SHA3-384? Will it?  If no algorithm is specified, what should the default be?</p>

<h3 id="period"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#period">Period</a></h3>

<p>As discussed, this is what increments the counter for HOTP. The <a href="https://github.com/google/google-authenticator/wiki/Key-Uri-Format">Google Spec</a> says:</p>

<blockquote><p>The period parameter defines a period that a TOTP code will be valid for, in seconds. The default value is 30.</p></blockquote>

<p>The TOTP RFC says:</p>

<blockquote><p>We RECOMMEND a default time-step size of 30 seconds
<a href="https://datatracker.ietf.org/doc/html/rfc6238#section-5.2">5.2. Validation and Time-Step Size</a></p></blockquote>

<p>It doesn't make sense to have a negative number of second. But what about one second? What about a thousand? Lots of apps artificially restrict TOTP codes to 15, 30, or 60 seconds. But there's no specification to define a maximum or minimum value.</p>

<p>A user with mobility difficulties or on a high-latency connection probably wants a 5 minute validity period. Conversely, machine-to-machine communication can probably be done with a single-second (or lower) time period.</p>

<h3 id="secret"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#secret">Secret</a></h3>

<p>Google says the secret is</p>

<blockquote><p>an arbitrary key value encoded in Base32 according to RFC 3548. The padding specified in RFC 3548 section 2.2 is not required and should be omitted.</p></blockquote>

<p>Whereas Apple says it is:</p>

<blockquote><p>An arbitrary key value encoded in Base32. Secrets should be at least 160 bits.</p></blockquote>

<p>Can a shared secret be a single character? What about a thousand? Will padding characters cause a secret to be rejected or can they be safely stripped?</p>

<h3 id="label"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#label">Label</a></h3>

<p>The label allows you to have multiple codes for the same service. For example <code>Big Bank:Personal Account</code> and <code>Big Bank:Family Savings</code>.  The Google spec is slightly confusing:</p>

<blockquote><p>The issuer prefix and account name should be separated by a literal or url-encoded colon, and optional spaces may precede the account name. Neither issuer nor account name may themselves contain a colon.</p></blockquote>

<p>What happens if they are <em>not</em> URl encoded? What about Matrix accounts which use a colon in their account name? Why are spaces allowed to precede the account name? Is there any practical limit to the length of these strings?</p>

<p>If no label is specified, what should the default be?</p>

<h3 id="issuer"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#issuer">Issuer</a></h3>

<p>Google says this parameter is:</p>

<blockquote><p><strong>Strongly Recommended</strong> The issuer parameter is a string value indicating the provider or service this account is associated with, URL-encoded according to RFC 3986. If the issuer parameter is absent, issuer information may be taken from the issuer prefix of the label. If both issuer parameter and issuer label prefix are present, they should be equal.</p></blockquote>

<p>Apple merely says:</p>

<blockquote><p>The domain of the site or app. The password manager uses this field to suggest credentials when setting up a new code generator.</p></blockquote>

<p>Yubico equivocates with</p>

<blockquote><p>The issuer parameter is recommended, but it can be absent. Also, the issuer parameter and issuer string in label should be equal.</p></blockquote>

<p>If it isn't a domain, will Apple reject it? What happens if the issuer and the label don't match?</p>

<h2 id="next-steps"><a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#next-steps">Next Steps</a></h2>

<ul>
<li>If you're a user, <a href="https://codeberg.org/edent/TOTP_Test_Suite">please contribute tests</a> or give feedback.</li>
<li>If you're a developer, please check your app conforms to the specification.</li>
<li>If you're from Google, Apple, Yubico, or another security company - wanna help me write up a proper RFC so this doesn't cause issues in the future?</li>
</ul>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:totp">
<p>Time-based One Time Passwords. Not the TV show you remember from your youth, grandad.&nbsp;<a href="https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/#fnref:totp" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=58593&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/03/towards-a-test-suite-for-totp-codes/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Should you enable TOTP *only* authentication?]]></title>
		<link>https://shkspr.mobi/blog/2024/10/should-you-enable-totp-only-authentication/</link>
					<comments>https://shkspr.mobi/blog/2024/10/should-you-enable-totp-only-authentication/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 04 Oct 2024 11:34:24 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=53016</guid>

					<description><![CDATA[Here&#039;s a &#34;fun&#34; thought experiment. Imagine a website which let you sign in using only your username and TOTP code.  No passwords. No magic links emailed to you. No FIDO tokens. No codes via SMS. Just a TOTP generated and displayed on your device.  Is that useful? Sensible? Practical?  It&#039;s certainly technically possible. Store the username, store the TOTP seed, done. Your users can now log in. …]]></description>
										<content:encoded><![CDATA[<p>Here's a "fun" thought experiment. Imagine a website which let you sign in using only your username and TOTP code.</p>

<p>No passwords. No magic links emailed to you. No FIDO tokens. No codes via SMS. <em>Just</em> a TOTP generated and displayed on your device.</p>

<p>Is that useful? Sensible? Practical?</p>

<p>It's certainly technically <em>possible</em>. Store the username, store the TOTP seed, done. Your users can now log in.</p>

<p>Is it <em>useful</em>? Well, it would force users to not reuse passwords they've used elsewhere. That prevents one class of security issue. If another service gets hacked, attackers can't use those credentials with your service. If you get hacked, there are no passwords stored.</p>

<p>As for <em>practical</em>? I already have 60 TOTP codes! (That's up from <a href="https://shkspr.mobi/blog/2020/08/i-have-4-2fa-coverage/">30 a few years ago</a>). Scrolling through those codes is no harder than scrolling through my password manager.</p>

<p>So, <em>sensible</em>? This all depends on your risk tolerance.</p>

<ul>
<li>A 6 digit TOTP code has a million combinations. If your service has no rate limiting, that's trivial for an attacker to brute-force.</li>
<li>An attacker <em>might</em> get lucky and score a literal one-in-a-million hit.</li>
<li>Shoulder surfing attacks are easier if the password is only 6 digits (although harder with a short time-window).</li>
</ul>

<p>Should you build an authentication mechanism like this?</p>

<p>Ehhhh… I'm going to go with "mostly no, except in limited circumstances".  It might make life slightly easier for some users.  But I feel inherently <em>icky</em> about having such a short password, even if it does regularly rotate.  If this is a low-value service without sensitive information, it <em>might</em> be useful. But for everything else, I think it is a silly ideas.</p>

<p><a href="https://mastodon.social/@Edent/113106727728186564">Further discussion on Mastodon</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=53016&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/10/should-you-enable-totp-only-authentication/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Is it OK to share 2FA secrets?]]></title>
		<link>https://shkspr.mobi/blog/2024/08/is-it-ok-to-share-2fa-secrets/</link>
					<comments>https://shkspr.mobi/blog/2024/08/is-it-ok-to-share-2fa-secrets/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 11 Aug 2024 11:34:01 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51197</guid>

					<description><![CDATA[Yeah. Yeah, I reckon so. Under the right circumstances.  Multi-Factor Authentication (MFA, 2FA, TOTP, whatever you want to call it) is pretty nifty. You scan a QR code and your phone will continually generate a set of one-time passwords which are synchronised with a remote server.  There&#039;s nothing stopping multiple people from scanning that QR code! They will each have the same password displayed …]]></description>
										<content:encoded><![CDATA[<p>Yeah. Yeah, I reckon so. Under the right circumstances.</p>

<p>Multi-Factor Authentication (MFA, 2FA, TOTP, whatever you want to call it) is pretty nifty. You scan a QR code and your phone will continually generate a set of one-time passwords which are synchronised with a remote server.</p>

<p>There's nothing stopping <em>multiple</em> people from scanning that QR code! They will each have the same password displayed at the same time.</p>

<p>I've found this to be useful in a few situations.</p>

<p>If my wife and I have access to the same account, and it doesn't allow individual sign-ins, then we share a username, password, and MFA code. That only works in a high trust environment. If your marriage is not high trust, you may need a different solution.</p>

<p>For a Big Work Project™ we had several people on-call. In case of emergency, someone would ring a "group hunt" number. Any one of the team could pick up. In order to authenticate both the caller and the answerer, all participants had the same TOTP code stored on their phones. That was more sensible than having a dozen different passwords.</p>

<p>There are risks, of course.</p>

<ul>
<li>Giving multiple people access to a system increases the risk one of them will be hacked, phished, or attacked.</li>
<li>Having a secret on multiple devices means multiple chances for it to be leaked.</li>
<li>Revoking and reissuing keys is more difficult with multiple people.</li>
<li>It <em>feels</em> icky.</li>
</ul>

<p>There's nothing which technically stops you backing up or sharing your MFA secrets. But you need to be really sure you understand the risks.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51197&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/08/is-it-ok-to-share-2fa-secrets/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Password Resets in an Age of MFA]]></title>
		<link>https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/</link>
					<comments>https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 01 Jul 2024 11:34:05 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51014</guid>

					<description><![CDATA[Recently, WordPress got in contact with me to say they suspect that my password was exposed in some sort of data breach. Well, it&#039;s a day ending with a &#34;y&#34; - so of course some scumbag has pilfered my digital identity.  WordPress mandated that I change my password. But was that really necessary?  Firstly, the password was uniquely generated by my password manager. It isn&#039;t re-used anywhere else.…]]></description>
										<content:encoded><![CDATA[<p>Recently, WordPress got in contact with me to say they suspect that my password was exposed in some sort of data breach. Well, it's a day ending with a "y" - so of course some scumbag has pilfered my digital identity.</p>

<p>WordPress mandated that I change my password. But was that really necessary?</p>

<p>Firstly, the password was uniquely generated by my password manager<sup id="fnref:password"><a href="https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#fn:password" class="footnote-ref" title="It was w@&amp;7%GUznK#9^}<S5 if you must know." role="doc-noteref">0</a></sup>. It isn't re-used anywhere else. So there is no chance of hackers breaking in to my email, bank, or OnlyFans account<sup id="fnref:OF"><a href="https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#fn:OF" class="footnote-ref" title="Lots of weirdos want to buy videos of me recompiling Linux while in my pants. Who am I to judge?" role="doc-noteref">1</a></sup>.</p>

<p>Secondly, and more importantly, I have 2FA app which provides me with a TOTP code every time I want to log in. Even if the evil ne'erdowells have my username <em>and</em> password, they can't get in without the MFA code<sup id="fnref:2FA"><a href="https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#fn:2FA" class="footnote-ref" title="It is currently 194 685." role="doc-noteref">2</a></sup>.</p>

<p>So, should I change my password?</p>

<p>To understand this, it's worth considering the risks - both of action and inaction.</p>

<p>Changing a password isn't without risk.</p>

<ul>
<li>Perhaps some long-forgotten app or service relies on that password. If I change it, what will break?</li>
<li>Do I trust my password manager to give me a strong password?</li>
<li>What if the original email is a phishing attempt and I end up giving the baddies my credentials?</li>
<li>Can I be bothered spending the time maintaining this old account?</li>
</ul>

<p>As for the risk of inaction.</p>

<ul>
<li>Using my details, a miscreant <em>might</em> convince WordPress to disable MFA on my account.</li>
<li>If there was a breach, my MFA seed secret might also have been stolen.</li>
</ul>

<p>On balance… yeah, obviously I should change my password. It is a 30 second job with a decent password manager. But, I might argue, there isn't much <em>urgency</em> in doing so.</p>

<ul>
<li>A strong and unique password means there is no risk of collateral damage to other accounts.</li>
<li>The use of MFA adds an extra layer of protection which buys you time.</li>
</ul>

<p>Thankfully, we've moved on from the outdated advice to <a href="https://www.ncsc.gov.uk/collection/passwords/updating-your-approach#PasswordGuidance:UpdatingYourApproach-Don'tenforceregularpasswordexpiry">regularly change your password</a>.  Now we only have to change them when there's been a breach. Which, coincidentally, is every 30 days…</p>

<p>The future ain't what it used to be!</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:password">
<p>It was <code>w@&amp;7%GUznK#9^}&lt;S5</code> if you must know.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#fnref:password" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:OF">
<p>Lots of weirdos want to buy videos of me recompiling Linux while in my pants. Who am I to judge?&nbsp;<a href="https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#fnref:OF" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:2FA">
<p>It is currently <code>194 685</code>.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/#fnref:2FA" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51014&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/password-resets-in-an-age-of-mfa/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Giving the finger to MFA - a review of the Z1 Encrypter Ring from Cybernetic ★★★★☆]]></title>
		<link>https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/</link>
					<comments>https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 23 Feb 2024 12:34:17 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[fido]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[nfc]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[rfid]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49592</guid>

					<description><![CDATA[I have mixed feelings about Multi-Factor Authentication. I get why it is necessary to rely on something which isn&#039;t a password but - let&#039;s be honest here - it is a pain juggling between SMS, TOTP apps, proprietary apps, and magic links.  I&#039;m also not a fan of PassKeys. It feels weird to me that my computer is the password. I get the theoretical way it works - but it rubs me up the wrong way.  So, …]]></description>
										<content:encoded><![CDATA[<p>I have mixed feelings about Multi-Factor Authentication. I get why it is necessary to rely on something which isn't a password but - let's be honest here - it is a pain juggling between SMS, TOTP apps, proprietary apps, and magic links.</p>

<p>I'm also not a fan of PassKeys<sup id="fnref:terminology"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fn:terminology" class="footnote-ref" title="FIDO2? U2F? MFA? PassKeys? Some of these are technologies and some are marketing terms. In most cases it is transparent to the user. They type in their username and password, then they have to…" role="doc-noteref">0</a></sup>. It feels weird to me that my computer <em>is</em> the password. I get the theoretical way it works - but it rubs me up the wrong way.</p>

<p>So, Yubikeys? <a href="https://shkspr.mobi/blog/2017/11/a-grumpy-look-at-using-a-yubico-neo-nfc-on-ubuntu-android/">I find them an annoyance</a>. I never have my keys to hand - which sort of defeats the purpose of them.</p>

<p>A little while ago, I wondered "<a href="https://shkspr.mobi/blog/2022/02/where-are-the-u2f-rings/">Where are the U2F Rings?</a>" If I could have a <em>wearable</em> MFA token, that would solve many of my issues<sup id="fnref:issues"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fn:issues" class="footnote-ref" title="Technical issues. Obviously my many personal issues remain load-bearing." role="doc-noteref">1</a></sup>.</p>

<p>Enter the <a href="https://getcybernetic.com/product/ring/">Cybernetic Z1 Encrypter Ring</a>. It is a US$300 zirconia ring with a built-in range of JavaCard-based NFC apps - including the ability to unlock your Tesla<sup id="fnref:tesla"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fn:tesla" class="footnote-ref" title="I don't have a Tesla to test it on. And I'd rather keep it that way!" role="doc-noteref">2</a></sup>. It is powered by the <a href="https://vivokey.com/apex/">VivoKey Apex chip</a> (NXP JCOP 4 P71) which provides all the security and functionality. Your money also gets you an NFC reader/writer which connects to your computer via USB.  The team have sent me a demo version of the ring to review on the proviso that I give them feedback.</p>

<h2 id="demo"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#demo">Demo</a></h2>

<p>Here's a quick video showing how it works:</p>

<iframe title="Review: Cybernetic's Z1 Encrypter Ring - FIDO2, U2F, PassKey" width="560" height="315" src="https://tube.tchncs.de/videos/embed/84a5f19d-fe75-4b6a-baaa-970c9767d8c3" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe>

<h2 id="the-good"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#the-good">The Good</a></h2>

<p>It works! Seriously, in a world of vapourware and vaguely-worded Kickstarters, it is refreshing to have a product which actually delivers. I was able to enrol it on my BitWarden account and then use it to log in - all via my Android phone. Similarly, I tested it working with Amazon, BitWarden, CodeBerg, Discord, Gandi, GitLab, GoDaddy, Google, PorkBun, Proton, WordPress and a few others.</p>

<p>It's a good looking, plainly designed, unibody ring. It is waterproof and survived the daily abuse I give my hands.  It was washed with soap and blasted with a hand-dryer and it kept on chugging. No need to recharge it either - NFC runs off the power of radio waves like magic.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/cybernetic-black-gloss-side-b-1.webp" alt="A plain black ring. What secrets does it contain within?" width="512" height="512" class="aligncenter size-full wp-image-49594">

<p>It is completely smooth, no built in scanners or LEDs or power-ports. The antenna appears to be all the way around the ring - so you can use either side of your finger on a scanner.</p>

<p>There is an <a href="https://play.google.com/store/apps/details?id=com.vivokey.apexmanager.cybernetic">Android app</a> which you can use to send information to the ring. That's designed for being able to share contact details and has a generous 4KB of storage<sup id="fnref:4kb"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fn:4kb" class="footnote-ref" title="Not a typo. NFC is designed for low power and fairly low speed. Most commercial NFC tags have about 500 bytes of storage. The memory on this ring will let you share up to 32KB of data - if you remove…" role="doc-noteref">3</a></sup>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Android-app-fs8.png" alt="Android app with various options greyed out." width="540" height="966" class="aligncenter size-full wp-image-49602">

<p>But, the nice thing is, <strong>you don't <em>need</em> the app!</strong> By default the ring will work as a FIDO2 token suitable for logging in to a variety of services.</p>

<p>The code on the Ring is (somewhat) Open Source. You can write your own JavaCard applets and load them on to the ring.</p>

<h2 id="the-bad"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#the-bad">The Bad</a></h2>

<p>It works well... until it doesn't. Mostly this is a criticism of FIDO2. I initially was unable to use the ring with GitHub:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Something-Went-Wrong-fs8.png" alt="Android pop up saying &quot;Something went wrong&quot;." width="540" height="951" class="aligncenter size-full wp-image-49600">
I tried both Firefox and Chrome but got the same error.  Similarly, CoinBase wouldn't register the key and didn't tell me why.</p>

<p>I contacted the Ring's manufacturer and they sent me details of a <a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#updates">firmware update</a> which claimed to fixed the issue.</p>

<p>Google worked - but gave me this rather weird default name and icon:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Google-Account-fs8.png" alt="Google account page showing an Apple logo and the name iCloud keychain." width="540" height="674" class="aligncenter size-full wp-image-49601">
I was able to rename it, but the icon can't be changed.</p>

<p>Amazon had the same issue, but with no way to rename.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Amazon-passkey-fs8.png" alt="Screenshot showing the Passkey has been added - but it is called iCloud Keychain." width="540" height="708" class="aligncenter size-full wp-image-49633">

<p>Both LinkedIn and WhatsApp would only let me create a phone-based PassKey. They didn't give me a prompt to scan my NFC ring.</p>

<p>NFC <em>only</em> is also a bit of a limitation. Until every laptop comes with built-in NFC, you'll need to use a dongle / reader if you want to use the ring.  For a phone or tablet with NFC, you're fine.  Well, as long as you know where your phone's NFC reader is!</p>

<p>The Android app isn't open source, which feels like a bit of a missed opportunity. It is pretty bare-bones, only providing the ability to add contact details and see how much free storage and RAM there is. In the future, the app promises to offer "Smart PGP" and a few other services.</p>

<p>The contact card stuff is a bit underwhelming. Rather than embed a VCARD, it takes users to a separate website which has your contact details on it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Social-Network-fs8.png" alt="Screenshot of a website with a pixelated image of my face and some contact details." width="540" height="592" class="aligncenter size-full wp-image-49603">

<p>Weirdly, it zips the content of your contact details and uses them to populate the website with data. Because there's only a limited amount of space available, contact images end up very pixellated.  The website also uses external JavaScript without using SRI - which isn't what I'd expect from a security focussed company.</p>

<p>If you use a 3rd party NFC app, you can change the NDEF share to be <em>any</em> URl you want.  I think that's probably a sensible thing to do.</p>

<p>Obviously, $300 is a chunk of change. You can <a href="https://amzn.to/49rsPMT">buy a basic U2F USB/NFC <strong>key</strong> for £20 - £50</a>. So, with this, you're paying a higher price for a small-run product with a niche form-factor.</p>

<h2 id="the-ugly"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#the-ugly">The Ugly?</a></h2>

<p>Do you want to wear jewellery? The Z1 is plain black and unobtrusive - unlike the garish designs of some fashion rings - but perhaps a few different styles and colours would be nice?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Ring-height.jpg" alt="Photo of my fingers curled up so you can see the height of the ring." width="1024" height="1024" class="aligncenter size-full wp-image-49604">

<p>I already wear a wedding ring, so having another to wear wasn't too much of an adjustment.  The ring comes in a number of US ring sizes, so you may need to compensate if you're used to a different sizing system. However, it is a bit of a chunky beast. You will certainly notice it while wearing it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Ring-width.jpg" alt="Photo of my fingers stretched out so you can see the width of the ring." width="1024" height="1024" class="aligncenter size-full wp-image-49605">

<p>Would an attacker rip it off your finger or even chop your finger off? It is a niche risk - but if you're using this to digitally safeguard your billions of crypto-riches, worth thinking about.</p>

<h2 id="updates"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#updates">Updates</a></h2>

<p>The Z1 Encrypter runs JavaCard applets so, in theory, you can load any compatible app onto it. By default, it runs <a href="https://github.com/BryanJacobs/FIDO2Applet">Bryan Jacobs' FIDO2Applet</a>.  It recently received <a href="https://github.com/BryanJacobs/FIDO2Applet/commit/1f406ec383f7b447c7752d4d35b2f3bbd3c079d3">an update</a> which should make it work with GitHub.</p>

<p>To install or update apps, you'll need the Fidesmo <a href="https://play.google.com/store/apps/details?id=com.fidesmo.sec.android">Android app</a> or <a href="https://apps.apple.com/us/app/fidesmo/id1504891446">iOS app</a>.</p>

<p><strong>WARNING!</strong> Before installing a new app, you have to destroy the old one. This will wipe <em>all</em> your previous registrations.</p>

<p>However, I just couldn't get this to work. I tried using the Fidesmo app to uninstall the Tesla applet - but it failed.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/service-failed-uninstalling-fs8.png" alt="Screenshot of the Fidesmo app saying &quot;Service Failed Uninstalling&quot;." width="540" height="731" class="aligncenter size-full wp-image-49657">

<p>Despite it asking me to uninstall again, there was no option to do so.</p>

<p>I find it a bit weird that the Ring relies on a 3rd party app to do this. I'd much rather see it built into the same app which controls the ring.</p>

<h2 id="security"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#security">Security</a></h2>

<p>By default, the ring has no password set on its internal memory.  That means you can write whatever content you want to the NDEF share. Of course, this means someone sat next to you can <em>also</em> change your saved URl!  If you use the Fidesmo app, you can lock the contents of the share. Once locked it cannot be overwritten unless you destroy the applet.</p>

<p>So I was able to change the default URl to one I controlled, and I was able to lock it.</p>

<p>But <em>anyone</em> with the Fidesmo app can delete <em>any</em> applet on your ring. Simply open the app, tap the phone against the ring to read the data, select the app you want to delete, and hold the phone against the ring for a few seconds.</p>

<p>It isn't unobtrusive. You'd probably notice someone clutching your hand for a several seconds. But you probably wouldn't notice if you were asleep.</p>

<p>The only damage is rendering your PassKey inoperable. So you would have to revert back to using a different 2FA method. An attacker couldn't steal your data, but they could provide a denial of service attack on you.</p>

<p>It would be great if the ring came with a password. However, there is the risk that if you lost your own password, you'd be unable to write data to it.</p>

<p>I am unqualified to audit the hardware security. If an attacker had physical access to the Ring, could they crack it open and extract the keys from hardware? I don't know.</p>

<h2 id="linux-support-open-source"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#linux-support-open-source">Linux Support &amp; Open Source</a></h2>

<p>The Cybernetic website says the Z1 supports "iOS, Android, Windows. MacOS coming June 2024."  But how well does it work with Linux?</p>

<p>There are <a href="https://github.com/VivoKey">several open source tools repositories available from VivoKey</a> - although none specifically related to the ring.</p>

<p>I took a look at a bunch of <a href="https://ccid.apdu.fr/ccid/section.html">compatible readers</a> and got the ACR1252u-MF (full review later). There are a couple of Linux utilities which claim to work as NFC U2F readers - but the only one I could get working was Bryan Jacob's <a href="https://github.com/BryanJacobs/fido2-hid-bridge">FIDO2 HID Bridge</a>.  Installing was a bit of a faff (yay various Python incompatibilities) and using it means invoking an obscure command on the terminal. But... it worked!</p>

<p>I registered the ring on a service using my Android device, then I was able to sign in to the same service using Firefox on Linux!</p>

<p>Even better - I was <em>finally</em> able to register the ring with GitHub! And, once I'd registered it using Linux, I could sign on with Android. HASHTAG INTEROPERABILITY!</p>

<h2 id="the-broken"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#the-broken">The Broken</a></h2>

<p>And then I kinda broke it. Somehow, the Fidesmo app ended up <a href="https://forum.dangerousthings.com/t/cant-destroy-applets-with-fidesmo/21264/">locking the entire card</a>. Everything still worked - both NDEF and WebAuthN - but I couldn't update the firmware or applets. On the one hand, no one can wipe my OS! But on the other, I can't load new software or fix any bugs.</p>

<p>NFC is <em>fragile technology</em>. Send the wrong obscure command to the device and it will behave unpredictably.</p>

<h2 id="final-verdict"><a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#final-verdict">Final Verdict</a></h2>

<p>For a certain type of nerd, this is awesome. It doesn't have aggressive "geek-chic" branding - it just quietly lets you augment your body with a useful bit of tech.  Now I don't need to search for my key-ring every time I want to log into a secure service.</p>

<p>The flaws with this product are mostly to do with the ecosystem. Mostly.</p>

<p>U2F / FIDO2 / Whatever is pretty nifty technology. When it works, it is just like magic. Wave your hand near your phone and you are authenticated.</p>

<p>When it doesn't work, you might get stuck in a loop trying to work out why things are going wrong.  It's terrifyingly easy to accidentally break something.</p>

<p>FIDO2 is still a pain. Do you know <a href="https://www.beyondidentity.com/developers/blog/fido2-vs-u2f-whats-difference">the difference between CTAP1 and U2F, or how they relate to WebAuthn</a>? Does your favourite service <a href="https://2fa.directory/gb/">support 2FA at all</a>?  Are you happy running a Python script on the CLI if you want to log in?</p>

<p>But that's not the ring's fault. It is early days for the tech and there are teething troubles.</p>

<p>The built-in contact-card portion of the ring is a bit daft. Pointing users to a 3rd party site doesn't seem like the right call for the type of people who'll buy this. I'm glad it could be pointed to a site that I control - albeit by using a different app to write the data.</p>

<p>I got used to wearing the ring after a few days, and it was the exact size that I requested. Although it is chunky, it is a subtle piece of jewellery and unlikely to draw unwanted attention.  There are no LEDs or batteries to worry about.</p>

<p>Despite the teething issues and the price, I'm rather keen on this. Waving my hand next to my phone to exchange cryptographic information makes me feel part-way to being a cyborg-wizard.  Is this the future of wearable technology? I don't know - but it is rather fun.  I'm happy to be an early-adopter and to bash out the bugs in the tech.</p>

<p>If you want, VivoKey will also sell you an <a href="https://vivokey.com/spark/">NFC Implant</a> which you can inject under your skin and use as an MFA token.  Personally, I think I'll stick with the ring!</p>

<p>You can <a href="https://getcybernetic.com/">buy the ring directly from Cybernetic</a>.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:terminology">
<p>FIDO2? U2F? MFA? PassKeys? Some of these are technologies and some are marketing terms. In most cases it is transparent to the user. They type in their username and password, then they have to present another credential. That could be a code sent by a text message, or generated by an app. In this case, they present their NFC token.  Technically, a PassKey is designed to replace usernames and password - present your key and that's the only credential you'll need. The reality is that various sites use these terms interchangeably.&nbsp;<a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fnref:terminology" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:issues">
<p>Technical issues. Obviously my many personal issues remain load-bearing.&nbsp;<a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fnref:issues" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:tesla">
<p>I don't have a Tesla to test it on. And I'd rather keep it that way!&nbsp;<a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fnref:tesla" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:4kb">
<p>Not a typo. NFC is designed for low power and fairly low speed. <a href="https://shkspr.mobi/blog/2020/06/gadget-review-ysshui-ntag215-nfc-tags/">Most commercial NFC tags have about 500 bytes of storage</a>. The memory on this ring will let you share up to 32KB of data - if you remove the other applets.&nbsp;<a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/#fnref:4kb" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49592&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Firefox might remember old 2FA logins]]></title>
		<link>https://shkspr.mobi/blog/2023/10/firefox-might-remember-old-2fa-logins/</link>
					<comments>https://shkspr.mobi/blog/2023/10/firefox-might-remember-old-2fa-logins/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 19 Oct 2023 11:34:21 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[firefox]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48407</guid>

					<description><![CDATA[I&#039;m big enough to admit when I make a mistake.  A few days ago I had a bit of a rant on Mastodon about how PayPal was encouraging browsers to remember 2FA codes.  I&#039;d tried to log in to PayPal, went to enter my 2FA code and was presented with this:      But, this isn&#039;t PayPal&#039;s fault! Let&#039;s take a look at the code behind each input:  &#60;input name=&#34;otpCode-0&#34;         id=&#34;ci-otpCode-0&#34;        …]]></description>
										<content:encoded><![CDATA[<p>I'm big enough to admit when I make a mistake.</p>

<p>A few days ago I had <a href="https://mastodon.social/@Edent/111206844871406102">a bit of a rant on Mastodon</a> about how PayPal was encouraging browsers to remember 2FA codes.</p>

<p>I'd tried to log in to PayPal, went to enter my 2FA code and was presented with this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/PayPal-1-fs8.png" alt="Screenshot of the PayPal login screen. The 2FA login has individual inputs for each number. The first input has a dropdown featuring 3 single numbers." width="510" height="508" class="aligncenter size-full wp-image-48410">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/PayPal-2-fs8.png" alt="The third number has a dropdown featuring3 single numbers." width="510" height="508" class="aligncenter size-full wp-image-48409">

<p>But, this <em>isn't</em> PayPal's fault! Let's take a look at the code behind each input:</p>

<pre><code class="language-html">&lt;input name="otpCode-0" 
       id="ci-otpCode-0" 
       aria-invalid="false" 
       placeholder=" " 
       aria-label="1-6" 
       role="textbox" 
       aria-describedby="otpCode" pattern="[0-9]*" 
       for="securityCodeInput" 
       autocomplete="one-time-code" 
       type="number" 
       value=""&gt;
</code></pre>

<p>It's correctly using <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete"><code>autocomplete="one-time-code"</code></a> which means that browsers shouldn't remember any entered codes.  Indeed, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1547294">Firefox has support this for nearly a year</a>.</p>

<p>So why was I seeing the remnants of old codes?</p>

<p>I was set straight by <a href="https://mastodon.social/@yoasif/111224131353201346">Asif Youssuff</a> who knows a heck of a lot about Firefox. He pointed out that the values might have been saved from <em>prior</em> to the fix. And, he was right!</p>

<p>Firefox doesn't remember new codes - but it will regurgitate old codes it had previously remembered.</p>

<p>I'm not sure if that's desirable or sensible. But it isn't the bug I thought it was!</p>

<p>I went through and manually deleted the old codes - they haven't since re-appeared.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=48407&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/firefox-might-remember-old-2fa-logins/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[An eInk, Wrist-Mounted, TOTP Generator]]></title>
		<link>https://shkspr.mobi/blog/2023/07/an-eink-wrist-mounted-totp-generator/</link>
					<comments>https://shkspr.mobi/blog/2023/07/an-eink-wrist-mounted-totp-generator/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 08 Jul 2023 11:34:09 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[eink]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[watchy]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46213</guid>

					<description><![CDATA[Behold! Thanks to the power of the Watchy development platform, I now have all my 2FA codes available at the flick of my wrist!    HOWTO  This uses Luca Dentella&#039;s TOTP-Arduino library.  You will need a pre-shared secret which is then converted into a Hex array. Use the OTP Tool for Arduino TOTP Library to get the Hex array, Base32 Encoded Key, and a QR Code to scan into your normal TOTP…]]></description>
										<content:encoded><![CDATA[<p>Behold! Thanks to the power of the <a href="https://shkspr.mobi/blog/2023/06/review-watchy-an-eink-watch-full-of-interesting-compromises/">Watchy</a> development platform, I now have all my 2FA codes available at the flick of my wrist!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/Wrist-TOTP.jpg" alt="A chunky wristwatch showing the time and a selection of 6 digit codes and their corresponding entities." width="1024" height="1024" class="aligncenter size-full wp-image-46214">

<h2 id="howto"><a href="https://shkspr.mobi/blog/2023/07/an-eink-wrist-mounted-totp-generator/#howto">HOWTO</a></h2>

<p>This uses <a href="https://github.com/lucadentella/TOTP-Arduino/">Luca Dentella's TOTP-Arduino library</a>.</p>

<p>You will need a pre-shared secret which is then converted into a Hex array. Use the <a href="https://www.lucadentella.it/OTP/">OTP Tool for Arduino TOTP Library</a> to get the Hex array, Base32 Encoded Key, and a QR Code to scan into your normal TOTP generator.</p>

<p>Add the Hex array into the code below.</p>

<p>To check that it is functioning correctly, either scan the QR code from the OTP Tool above, or use the Base32 Encoded Key with <a href="https://totp.danhersam.com/">an online TOTP generator</a>.</p>

<p>Here's how the code interfaces with the Watchy:</p>

<pre><code class="language-c">#include &lt;Watchy.h&gt; //include the Watchy library
#include "settings.h"
#include "sha1.h"
#include "TOTP.h"

class MyFirstWatchFace : public Watchy{ //inherit and extend Watchy class
    public:
        MyFirstWatchFace(const watchySettings&amp; s) : Watchy(s) {}
        void drawWatchFace(){

          ...

          RTC.read(currentTime);
          time_t epoch = makeTime(currentTime) - 3600; // BST offset


          // The shared secret - convert at https://www.lucadentella.it/OTP/
          uint8_t hmacKey[] = {}; // e.g. {0x4d, 0x79, 0x4c, 0x65, 0x67, 0x6f, 0x44, 0x6f, 0x6f, 0x72};
          int hmacKeyLength = sizeof(hmacKey) / sizeof(hmacKey[0]);

          TOTP totp = TOTP(hmacKey, hmacKeyLength);
          char* epochCode = totp.getCode( epoch );

          display.print(  "TOTP Code Twitter: ");
          display.println( epochCode );

          ...
</code></pre>

<p><a href="https://gitlab.com/edent/watchy-faces/-/tree/main">You can grab the full code from GitLab</a>.</p>

<p>I'm not very good at C++ - so please let me know what terrible mistakes I've made.</p>

<h2 id="is-this-a-good-idea"><a href="https://shkspr.mobi/blog/2023/07/an-eink-wrist-mounted-totp-generator/#is-this-a-good-idea">Is this a good idea?</a></h2>

<p>Well... Yes and no.</p>

<p>TOTP is a strong-ish form of Multi-Factor Authentication. It helps prevent attacks where someone already knows your username and password.  Having a convenient way to get your TOTP codes may make you more likely to use them. It also prevents you from getting locked out of your accounts if your phone dies or is stolen.</p>

<p>Convenient security is <em>good</em> security.</p>

<p>But... Having them on your wrist for everyone to see? I've deliberately made the font as small as I can so it is only readable up close. However, if someone is shoulder-surfing your details, they may well see your wrist. The watch isn't encrypted - so even if you hid the codes behind a button press, anyone who steals your watch will have your codes. If they steal your phone, they need to get through your PIN / biometrics.</p>

<p>Who are your adversaries? If you are trying to evade state-level actors, thieves specifically targeting you for your crypto-holdings, or an untrustworthy spouse - this probably isn't a great idea.  If you don't use 2FA because you don't keep your phone with you - this will probably increase your security posture.</p>

<p>Ultimately, all security measures are a trade-off between convenience and control.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46213&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/an-eink-wrist-mounted-totp-generator/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What's the optimal length for a 2FA code?]]></title>
		<link>https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/</link>
					<comments>https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 18 Aug 2022 11:34:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sms]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43361</guid>

					<description><![CDATA[The other day, a company sent me a 2FA code which was only four digits long.    I&#039;ll admit, this weirded me out. Surely 4 is just far too short. Right? I think almost every 2FA code I&#039;ve seen has been 6 digits long. Even back in the days of carrying one of those physical RSA fobs, 6 has been the magic number.  But why?  A 2FA code is meant to prevent a specific class of problem. If an attacker…]]></description>
										<content:encoded><![CDATA[<p>The other day, a company sent me a 2FA code which was only <em>four</em> digits long.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/2FA.png" alt="Screenshot of a text message. It says &quot;Your one time passcode is 1031.&quot;" width="465" height="176" class="aligncenter size-full wp-image-43362">

<p>I'll admit, this weirded me out. <em>Surely</em> 4 is just far too short. Right? I think almost every 2FA code I've seen has been 6 digits long. Even back in the days of carrying one of those physical RSA fobs, 6 has been the magic number.</p>

<p>But why?</p>

<p>A 2FA code is meant to prevent a specific class of problem. If an attacker has got hold of something you are (your username<sup id="fnref:un"><a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#fn:un" class="footnote-ref" title="Traditionally, the something you are is a biometric. However biometrics are static - they never alter. So they're poor for some choices of authentication. A username represents something you are.…" role="doc-noteref">0</a></sup>) and something you know (your password), you are still protected by something you have (your phone).  Whether your second-factor is an app generating unique codes, a SIM card receiving SMS<sup id="fnref:SMS"><a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#fn:SMS" class="footnote-ref" title="Let's gloss over SMS being a bit vulnerable for now." role="doc-noteref">1</a></sup>, or a cryptographic enclave producing signed transactions - it doesn't matter. The attacker can use your password but won't get the unique second code.</p>

<p>Suppose you received a 2FA code that was a <em>single</em> digit. Is that secure enough?</p>

<p>I think most reasonable people would say that wasn't secure. An attacker has a 10% chance of guessing the 2FA. If the system allows for a couple of retries before locking them out, they've got a 30% chance of getting in.</p>

<p>Similarly a 2 or 3 digit code <em>probably</em> doesn't provide sufficient protection.</p>

<p>A typical bank card PIN is 4 digits. So an attacker has a 1 in 10,000 chance of guessing. That might be slightly better as bank PINs usually don't allow repeated digits, palindromes, and a few other combinations.</p>

<p>I suppose that if an attacker had compromised tens of thousands of credentials, and the service allowed for a few incorrect entries, it is statistically likely that they might be able to compromise a few accounts if they were only protected by 4 digits.</p>

<p>As 2FA codes get longer, they begin to <a href="https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two">reach the limits of what humans can remember</a>. Yes, I know <em>you</em> have an excellent memory - but not everyone does. And I know <em>your</em> fancy 2FA app automatically copies and pastes the codes - but not everyone does. We have to work to what the average user is capable of at a minimum.</p>

<p>I think most people would find it annoying - if not impossible - to remember a 10 digit one-time password.</p>

<p>If you're copying a code from your phone to type into your laptop, there's probably an upper limit on what people will be prepared to do. No one is going to manually transcribe 128 digits. And, if they did, they'd likely introduce several errors.</p>

<p>So the industry has seemingly settled on 6 digits.  I've ranted before about the <a href="https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/">lack of standardisation in the OTP specification</a>. But all of them seem to allow 6 - 8 digits.</p>

<p>I <em>suspect</em> 6 is the standard because that's what the original RSA SecurID tokens used by default.</p>

<p><a href="https://commons.wikimedia.org/wiki/File:RSA_SecurID_Token_Old.jpg#/media/File:RSA_SecurID_Token_Old.jpg"><img class="aligncenter size-full" src="https://upload.wikimedia.org/wikipedia/commons/8/8a/RSA_SecurID_Token_Old.jpg" alt="RSA SecurID Token Old.jpg" width="480"></a></p>

<p>An attacker would have to be <em>incredibly</em> lucky to randomly guess a 6 digit code - literally a one-in-a-million chance<sup id="fnref:pterry"><a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#fn:pterry" class="footnote-ref" title="Although, as per Terry Pratchett: &quot;Million-to-one chances crop up nine times out of ten.&quot;" role="doc-noteref">2</a></sup>. Even if they had multiple retries, it's still statistically unlikely.</p>

<p>Once I logged in using my 4 digit code, I had full access to my account. But if I wanted to make any changes, I had to wait for <em>another</em> 2FA code to be sent. So I guess the effective length of code was actually 8 digits. Which seems excessive 🤣</p>

<h2 id="thoughts-from-the-community"><a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#thoughts-from-the-community">Thoughts from the community</a></h2>

<p>I asked my Twitter buddies for their wisdom:</p>

<blockquote class="social-embed" id="social-embed-1556913475389112321" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/ealexhudson" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRpIBAABXRUJQVlA4IIYBAADwCQCdASowADAAPrVQnUwnJKKiKrVdUOAWiWYAy17xxLilwRGsKKaBrtSlVqCDDbooT6Ycx6rD1oAGOFHttkSuEU6x1l1cvf9yluJ8OZ2BPON5+/sAX+UAAP736ZOmTSBJrik49a//CtWj4lKt4/fnen6qhFukanSjCWDpZLBKtgGAyXjEf7/YjUr3jHECKLuLpDirjPccuvjmJI3D3T8cOM+DggIN1sbqlgGh3LU03UZ4zJP+LOpQbXmyn/IK/+cFg3jNdY0xssXHx3JCF5/jOuJzw95QUBF9AqO17SPYEBbZQBzCUQwjZM8937rj5CSajmybm02kueMJyEsX9ws3sZ/sefJicrAxMByma5rDrkgz9eDLXNByhpXeGYsxOhXjXX4HLorswgNVBfk6rEAkWijB/QydZ5br0iFG2rz1ASgI6guMgaPutAs02lXf+Tmnj7KvmI3w8n0CODggLAX7ug6VK2kNjDCM2fcpdBKlo67Kk6wlVdrrdBusbiM1ust3E72tAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Alex Hudson</p>@ealexhudson</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><a href="https://twitter.com/edent">@edent</a> Depends on retry/lockout policy? 4 digits is enough for a bank card, but there is a physical token involved there - is the account as valuable as that, though?<br><br>Gut feeling is 6 digits is right for most circumstances though...</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/ealexhudson/status/1556913475389112321"><span aria-label="2 likes" class="social-embed-meta">❤️ 2</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-09T08:01:13.000Z" itemprop="datePublished">08:01 - Tue 09 August 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1556914657276952578" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/mmmmmrob" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRs4CAABXRUJQVlA4IMICAADQDACdASowADAAPrFImEmnJCIhMdzKAOAWCWoAnTNURThI/U/eX5BQB7Q/q3HR2d5oKymaf5W+Y+9emTgSClOfs8J3V311zXI91dxdvWIW6o5zr9y2kZvIyIEEVO7epO3EKz2d1KfKaPH+EMLNekAA/vva3bK12/RxZTnzmDJxI1qul/owczuZtp8UnG0Q5gppfhi8WwV+tgP3t7xwjxJsSRE2QCllVhIF8fKtbJPwn4+bFPLnsF0D/DDYiO023WAAueZlDEN1maitEPc9n4oG3Hy6MOpVPx7V5/LCKp7VQadQX+eEAPOtYqCxztzk9BF+YFiXc7093UpLBvxmtF+kUB2nNlOyGo94lUdFcVYSIA2xKxoKU6sIUQOFOsIAHm3/hpoDMvg1and0ZX/us3yv2wf1QbNVAT578dsaZLakagc9KRk1Tq84GOJHlUugtkQdVA5R6t7ovgySaZAd0lzulQ15J64j6ytZC7UPS9K3U56o6LNyDtYQFyJkcFV2nNfgiIpbKv/zFfxCHCAChLzbLEXJNwFQ871salvh6fQfuevpF43KmcIoOE6vzMjJ6NUnNagFJd/wiBX/dH9m+wbPtU1rzQ/z6v6POBHZ6jYsLvEuzS4NcaW9Ct9JthMiZn//qjb8kq1uPymoKCwshAh8d86CWZ/KtrZ2R3I2qJwjEVk91kd5yeCv/lqFT700s9WNTOEtLLARuQdko8O/FG6ZThgSIIhzmyBMWkaq/IYU0MV3nRS0YClqH448osDpssR2l3z14tG2/Q0DHefq96ijWryG/rc3bh26ElCgLbpQo4htoRSDjeWU0QRrItqBbne3yPp8aTKkEwW4B0recBVbApQxd7o2huUg7xA7epgdv6YnRvlT9lpoDSUTYmIK+93tpF6MkZ2dUtGvNzfQxnFgF5h8iJaZvqDet8KEkRa9AAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Rob Styles</p>@mmmmmrob</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/mmmmmrob/status/1556914260080574464">Replying to @mmmmmrob</a></small><a href="https://twitter.com/edent">@edent</a> 10,000 combinations is plenty to prevent guessing, and making the code longer doesn't add any additional protection if the message/device is compromised.<br><br>Making the code longer makes the usability exponentially worse when the code has to be re-keyed.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/mmmmmrob/status/1556914657276952578"><span aria-label="3 likes" class="social-embed-meta">❤️ 3</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-09T08:05:55.000Z" itemprop="datePublished">08:05 - Tue 09 August 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1556914899586097152" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/artesea" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRu4CAABXRUJQVlA4IOICAADwDQCdASowADAAPqFAnEmmI6MhNVqtUMAUCWYAnTMORghYPKxsFSxtE9LpGXYDqFuFzktyCq7b0wO0RsJmHNeweFafikrmMH599Lox5OunwahAqBdrTgtP8ZBiS9Pm1VAhmoC69YffnE9bQOVxPQHYI0zCag7VdjwA/vitYb/vXsunqlYAIB+EGbWPCsrKIQv2Oc6OyRMQaAN+fqQgzOYVeK1cNEafM4mmRV31SP9D3L+5ZoK3g+LUEn71/jFbR57WoTprC0btsDxhY2jZGYOc6Ndd5e2PgcgJXxvv6Qm8ATMRM01UWDNQj0wfVd5G/9j37U9T6Nz8Oj5jLtY9O/NwhJ8VssvhVuu+va/AhYyCr0g8txxqI0gFm04gGYYykwMZC6HnVlQ6L7xLBfSto/gz19l0LSZUeUJVxKxSUt/pjgiP3T5OTTYeG6vYRtVqXBEW8E3hSnNP6StIX+h9OPdbMysgoOhHSk5JqtrEczqNPCKYm0Hpfqvc6WWgxEdTsC/7ieZ68uaOPx7iYATnb79uzIz2wejk+p68mpCoMyeQ8DIuhWRohbrip0GQjhO6vyLAarzQhDD/zdrTGZCYT6Tb5MDcMGlF2X5ZCX1D7QIQc+yFXgw8k9Xi1CroR6k5CwNQIjvzjVSCM8M6FT7puLCetfKk1waLVqnNVrkoEOLJqyP2DbPR0XHpe1A75W5er0Hg23ry45rpvUxuY8QOM5ZHyigDDS5CRO7fk7nCt7N7GU60ZuvzPaC2ilovOvelei940b62MG0EqT+Qb9EB18w12qvYTQcE7+hDmcge85MXNefa8M/hLtVxwg6YMdpLRQh1uQcNxTUqkuXyjB2mcQTesJRv8CHYwMbQEXe6kINcC0NECTKYmVjHJI/i8MzNMvepRSFxn0lOjTAwPLo3PgGLPlfWPh1jfdUuBNjbvYRLHpqPtvE8nzPtp6ndjSkwCCqIv+njlOa6DhSWkVYbT8lUAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan Cullen</p>@artesea</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><a href="https://twitter.com/edent">@edent</a> Assuming just three retries before the code expires, 3 in 10,000 doesn't sound too bad. Also easy to remember whilst switching between the messaging app/notification shade and the app/website wanting it. I find with 6 I need to go back and forth. Worse with alphanumeric.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/artesea/status/1556914899586097152"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-09T08:06:52.000Z" itemprop="datePublished">08:06 - Tue 09 August 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1556919005125959682" lang="en"><header class="social-embed-header"><a href="https://twitter.com/SecondeJ" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRvIBAABXRUJQVlA4IOYBAABwCgCdASowADAAPrVIn0qnJCKhqrqtUOAWiWkAFHH0ydwtc5xhzmiebv2bnTxlsmFs0NlwWTsjE8aD6wQHa1iSjcFvOtjuOq0NIu1wMYhZTaLOW8z/BFqsc8vPAAD+/lZOcN3OyY3MgxtPdsxxWIATqQiZRRFxLIeWQsUJwEp5iPIAKUEGZAUYrXyEZewSGJluexFf58/IVYpD5e/dww4j2MpqdS6JkEstZHWP9NwC7SSXUw8KwTx3uh++nz+pd60lhPk5TgNBgD63PGm0wu7a5eIWaB2UKfhnx+NgxRHcSR8lCpd4TlY9EaKnzzQt63afSvzTVLlXNSY2VfE5ktHheUw4O/GNhv+IiaCw0TWDNMj77KcaQj7itsbKVlc6QFd9h5hjKfnkRZzuZfaF7m3aZBiXV7/UcggzMw5Y7sziStGlZKCuRAemAN+FwbhjlMnTYkw6YB/RsUriUmfJE2ciRFPPZZWY1S+KTWw+7t+80z/RSAz5jw8l/2fajz8PrbgsYneZulXMfYv220peM+dMpvKiaLc9LNkvT+oFvWqLxPdKBhRTz1Npxwfcc5MwyQHs5Xh1duniwuYFwTFNb/BassAlSAWMhaWTvLBH2QN4HPypvRRFwYgLerSJ94sndoJuGhZY4AA=" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">James Seconde</p>@SecondeJ</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/mmmmmrob/status/1556915524352851968">Replying to @mmmmmrob</a></small><a href="https://twitter.com/mmmmmrob">@mmmmmrob</a> <a href="https://twitter.com/edent">@edent</a> For these sorts of reasons, this is why <a href="https://twitter.com/VonageDev">@VonageDev</a> 2FA (Verify) lets you choose between 4 and 6 digits</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://web.archive.org/web/20220809082331/https://twitter.com/SecondeJ/status/1556919005125959682"><time datetime="2022-08-09T08:23:11.000Z">08:23 - Tue 09 August 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1556921468327526400" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/RhidianB" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRpICAABXRUJQVlA4IIYCAACQDACdASowADAAPrVKn0snJCKhrjQMyOAWiWYArDlBUx5h/gL9zfB8ZoC4ynv7UdyG646dbL3p9j3zKshaYYXvMmz3qpbp+cayyYqgijvxjwdy95U4oNQPOaL6lBYRk9tnYrxhUVc+kFBp1CVAAOP15PA2z2fnN3X4doPJQt+udolFs1RYeQ1yLRD09AEHiRDNTMN7g67XVra7Z+lk7xX6c6lYKt9qAk/4gcE9Cakbhj1v5BlTCG1xE6U0NDtp/lXb/l1LNAoqO3w76iaWVMhQ4qpwsQDQldFjSDKrbqWcxi288o2NjVWoOTUQpZ9nBChqVSTeTQmdBSZOcg77zyGt1fl9NukWNntRETNjc7+Mub2Fe4EM7QhdmjiJ25CD6z+ndjR/SQUWK4wCPmPFNGdtcYoNzLY50xtnVgOVMQ4eh1w97+ekrS5evvyXBtg4e1wC5BykhqqhkkC7mAZWFmw7EukPIOF0by13A72NGv4jlpG9yA+krqgOMsR9UG/6Uv3zanlVfF8SJoP2EjLBcHvrTR1xgWwUTpkjoJVaqIb9OmurIzlqMEIEb9EnCWAexpmxd1MCcterEwhr6qaI1VS/i3stEh7OGFVzEQ9NKsz22P5nNC2D7lsSvppKeoErqW2GhxNh3MD7ZFSUmo7FVDYeI/KDVr9QPqMXbLIJ0FKzPJlbF5zygYidD8W0R2O3S8mehZBrw4VthIgoG2HINujBGqcUxtwtFPCE6qZbJkc3O8aMiaE9N+vShC79lRC8KIPCLFnX6NbD633LrPon00Vh5ujvR5AZongfVgMvaazMMC5jL2kZP+UuEozAwonj8UNX16F7Ja5zSuPQkB6TEEQ+G7ThAAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Rhidian Bramley</p>@RhidianB</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><a href="https://twitter.com/edent">@edent</a> Zero digits. More user friendly and secure to send a hyperlink with a single use time limited encryption key. No heed to compromise usability vs security. Win win.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/RhidianB/status/1556921468327526400"><span aria-label="3 likes" class="social-embed-meta">❤️ 3</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-09T08:32:58.000Z" itemprop="datePublished">08:32 - Tue 09 August 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1556954933831897088" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/quis" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRoYBAABXRUJQVlA4IHoBAADQCACdASowADAAPrVSpE4nJCMiJzgJIOAWiWkAEV08/izBiRMEUx29bYtJu4iuIYJDNOD4PcldUHN8sCPbFUBm6pn0grY4vTs4Rke99DHAAP781ihmB/6rrBLC3M/W5paQCHCxK2YR5eb1zKmNlIeaewvvcd53RCtN9SCSWq93KBbWw2EW++UL0QdVCXwnFonqq/k3DT0uWDTlDPtTehdUe5n1wnZNe0k4vI+x3/3WhQ4oC7CyElkIK+icri13wMpAzcnzW4gYn+AqCOslDYPiLI2UkQwg+47t8oY3GTJvbUnfI7Zn+26JHsOJk8UwJ3LGxIElc9zjz73eKJyQRrs3RHnRGjr88p/SpIJDMh8+BNTf0WWg67nuOdwPl27DYG7dUzKpQYK1r+3TKBZe0VJ2vlCzllOlN0mSqIEK734l25srPE/Z0nT0FQ9pCrG5oCYhjpH5RgGAtbILcD+HudXJshNnmygblEhFVYBTgtK9wNmWWZNmseh8AAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Chris Hill-Scott</p>@quis</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><a href="https://twitter.com/edent">@edent</a> Design System says 5 digits: <a href="https://design-system.service.gov.uk/patterns/confirm-a-phone-number/">design-system.service.gov.uk/patterns/confi…</a><br><br>On Notify 2% of attempts are miskeyed – people with dyslexia probably disproportionately affected.<br><br>4 would be better – used by Airbnb and Uber – but you need stronger technical measures in place to prevent automated attacks.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/quis/status/1556954933831897088"><span aria-label="2 likes" class="social-embed-meta">❤️ 2</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-09T10:45:57.000Z" itemprop="datePublished">10:45 - Tue 09 August 2022</time></a></footer></blockquote>

<p>What do you think?</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:un">
<p>Traditionally, the something you are is a biometric. However biometrics are static - they <em>never</em> alter. So they're poor for some choices of authentication. A username <em>represents</em> something you are. Everyone can see your username - just like everyone can see the fingerprints you leave on every touchscreen and the DNA you shed all over the place.&nbsp;<a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#fnref:un" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:SMS">
<p>Let's gloss over <a href="https://www.issms2fasecure.com/">SMS being a bit vulnerable</a> for now.&nbsp;<a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#fnref:SMS" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:pterry">
<p>Although, as per Terry Pratchett: <a href="https://en.wikiquote.org/wiki/Equal_Rites">"Million-to-one chances crop up nine times out of ten."</a>&nbsp;<a href="https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/#fnref:pterry" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43361&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/08/whats-the-optimal-length-for-a-2fa-code/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I've locked myself out of my digital life]]></title>
		<link>https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/</link>
					<comments>https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 07 Jun 2022 11:34:06 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42735</guid>

					<description><![CDATA[Imagine…  Last night, lightning struck our house and burned it down. I escaped wearing only my nightclothes.  In an instant, everything was vaporised. Laptop? Cinders. Phone? Ashes. Home server? A smouldering wreck. Yubikey? A charred chunk of gristle.  This presents something of a problem.  In order to recover my digital life, I need to be able to log in to things. This means I need to know my u…]]></description>
										<content:encoded><![CDATA[<p>Imagine…</p>

<p>Last night, lightning struck our house and burned it down. I escaped wearing only my nightclothes.</p>

<p>In an instant, everything was vaporised. Laptop? Cinders. Phone? Ashes. Home server? A smouldering wreck. Yubikey? A charred chunk of gristle.</p>

<p>This presents something of a problem.</p>

<p>In order to recover my digital life, I need to be able to log in to things. This means I need to know my usernames (easy) and my passwords (hard). All my passwords are stored in a Password Manager. I <em>can</em> remember the password to that.  But logging in to the manager <em>also</em> requires a 2FA code.  Which is generated by my phone.</p>

<p>The phone which now looks like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/Melted-Phone.webp" alt="A melted phone. Credit: Reddit user Crushader." width="720" height="480" class="aligncenter size-full wp-image-42781">

<p>Oh.</p>

<h2 id="backups"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#backups">Backups</a></h2>

<p>I'm relatively smart and sensible. I regularly exported my TOTP secrets and saved them in an encrypted file on my cloud storage - ready to be loaded onto a new phone.</p>

<p>But to get into my cloud, I need my password and 2FA.  And even if I could convince the cloud provider to bypass that and let me in, the backup is secured with a password which is stored in - you guessed it - my Password Manager.</p>

<p>I am in cyclic dependency hell.  To get my passwords, I need my 2FA. To get my 2FA, I need my passwords.</p>

<p>Perhaps I can use my MFA FIDO2 Key?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/key-melted.jpg" alt="A melted security key. Photo taken from  A Side Journey To Titan: Revealing and Breaking NXP's P5x ECDSA Implementation on the Way." width="411" height="231" class="aligncenter size-full wp-image-42782">

<p>Oh.</p>

<h2 id="emergency-contacts"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#emergency-contacts">Emergency Contacts</a></h2>

<p>Various services allow a user to designate an "emergency contact". Someone who can access your account <i lang="la">in extremis</i>. Who do you trust enough with the keys to your digital life?</p>

<p>I chose my wife.</p>

<p>The wife who lives with me in the same house. And, obviously, has just lost all her worldly possessions in a freak lightning strike.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/ShadowRidgeRoadFire.jpg" alt="Photo of a house engulfed in flames. Photo taken by Wikimedia user LukeBam06." width="512" height="384" class="aligncenter size-full wp-image-42783">

<p>Oh.</p>

<h2 id="recovery-codes"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#recovery-codes">Recovery Codes</a></h2>

<p>Most online services which have Multi-Factor Authentication, also provide "recovery codes". They are, in effect, one-time override passwords.  A group of random characters which will bypass any security. Each can only be used once, and then is immediately revoked.</p>

<p>I was clever. I hand-wrote the codes on a piece of paper (so they can't be recovered from my printer's memory!) and stored them in a fire-proof safe, secured with a key hidden under the cat's litter-box.</p>

<p>Sadly, the fire-proof safe wasn't lightning-strike safe and is now obliterated. Along with the cat's litter-box. The cat is fine.</p>

<p>I know… I know… I <em>should</em> have kept them in a lock-box in my local bank. The only problem is, <a href="https://www.which.co.uk/news/article/ask-an-expert-my-bank-isnt-providing-safe-deposit-boxes-anymore-where-can-i-get-one-aTFbh0i7nezo">virtually no banks offer safe deposit boxes in the UK</a>. The one that does charges <a href="https://www.metrobankonline.co.uk/safe-deposit-boxes/">£240 per year</a>. A small price to pay, for some, to avoid irreversible loss. But it adds up to a significant ongoing cost.</p>

<p>But, suppose I had stored everything off-site. All I'd need to do is walk up to the bank and show some ID which proved that I was the authorised user of that box.</p>

<p>The ID which has just been sacrificed in tribute to mighty Thor and now looks like a melted waxwork.</p>

<p><a href="https://twitter.com/swestdahl/status/1533504584328523776"><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/06/meltedID.png" alt="An AI generated image of a melted driver's licence." width="384" height="208" class="aligncenter size-full wp-image-42843"></a></p>

<p>Oh.</p>

<h2 id="friendly-neighbourhood-storage"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#friendly-neighbourhood-storage">Friendly Neighbourhood Storage</a></h2>

<p>Perhaps what I <em>should</em> have done is stored all my backup codes and recovery keys on a USB stick and then given them to a friend?</p>

<p>There are a few problems with that.</p>

<ol>
<li>Every time I sign up to a new service, I would need to add it to the USB stick. How many times can I pop round with a fresh stick before it becomes an imposition?</li>
<li>What if my friend (or their kid) accidentally wipes the drive?</li>
<li>If a freak lightning storms hits both our houses at the same time, I still lose everything.</li>
<li>Even if I did all that, I would have to give the USB stick a strong password to make sure my friend didn't betray me. So I either need to remember that, or I'm stuck in the password-manager-paradox.</li>
</ol>

<p>Perhaps I could split the USB sticks between multiple friends using <a href="https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing">Shamir's Secret Sharing</a>? That solves some problems - mostly the accidental losses and remembering a strong password - but creates <em>even more</em> issues. Now I have to do a lot more admin <em>and</em> worry about all my friends conspiring against me!</p>

<h2 id="phone-home"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#phone-home">Phone Home</a></h2>

<p>One of the weakest forms of identity is the humble phone number. Several of my accounts use my mobile number to text me authorisation codes. SMS isn't the most secure way to deliver passwords - it can be intercepted or the SIM can be swapped to one controlled by an attacker. But, <em>if</em> I can get my phone number back, I stand a chance of getting in to my email and perhaps some other services.</p>

<p>That's a weakness in my security posture. But one I may need to take advantage of.</p>

<p>The only question is - how do I prove to the staff at my local phone shop that I am the rightful owner of a SIM card which is now little more than soot? Perhaps I can just rock up and say "Don't you know who I am?!?!"</p>

<p>I know, I'll show them my passport!</p>

<p><a title="Santeri Viinamäki, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Burning_EU_passport_20180318.jpg"><img width="512" alt="Burning EU passport 20180318" src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Burning_EU_passport_20180318.jpg/512px-Burning_EU_passport_20180318.jpg"></a></p>

<p>Oh.</p>

<h2 id="bootstrapping-of-trust"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#bootstrapping-of-trust">Bootstrapping of trust</a></h2>

<p>I am lucky. I have a nice middle-class life and know lots of professionals - doctors, lawyers, teachers - who I <em>hope</em> would be happy to vouch for me.  I could use one of my friends to <a href="https://www.gov.uk/confirm-identity-online-for-passport-application">confirm my identity for a replacement passport</a>.  Once I have a passport, I should be able to get a SIM card with my phone number. And, I hope, some online services.</p>

<p>I would, however, need to use a credit or debit card to apply for a replacement passport. But all of my cards are melted to slag - and I can't prove to the bank that I am who I say I am because I don't know my account number, password, or mother's maiden name.</p>

<p>You see, I was "clever" and took some idiot's advice about <a href="https://shkspr.mobi/blog/2020/11/why-lying-is-essential-for-privacy-herd-immunity/">setting your mother's maiden name to being a random string of characters</a>. Those details are, of course, stored in my inaccessible password manager!</p>

<p>Hopefully one of my friends will be prepared to lend me the £75.50 to get a new passport.</p>

<p>I'll just call up one of my friends. Hmmm… now, where did I store their phone number?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/Melted-Phone.webp" alt="A melted phone. Credit: Reddit user Crushader." width="720" height="480" class="aligncenter size-full wp-image-42781">

<p>Oh.</p>

<h2 id="starting-over"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#starting-over">Starting over</a></h2>

<p>Again, I'm lucky. I live relatively close to some friends and family. And I'm confident that they'd be gracious enough to pay an emergency cab fare if I started hammering on their door at silly o'clock in the morning.</p>

<p>With their help, I think I could probably call up enough insurance companies to figure out which one covered the property. I would hope the insurance company would have some way of validating with the emergency services that the house is, indeed, a smoking crater.  I don't know if that would get me emergency cash, or if I'd have to rely on friends until I get access to my bank account.</p>

<p>I assume my credit card companies can probably be convinced to send out replacement cards. But will they also be willing to change my address - or will the card go to the pile of ashes which was formerly my home?</p>

<p>I don't know whether my insurance policy covers me for access to digital files. Even if it did, I'm not sure how they can force a company like - say - Google to give me access to my account. It isn't like Google went through a KYC (Know Your Customer) process when I signed up.</p>

<h2 id="code-is-law"><a href="https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/#code-is-law">Code Is Law</a></h2>

<p>This is where we reach the limits of the "Code Is Law" movement.</p>

<p>In the boring analogue world - I am pretty sure that I'd be able to convince a human that I am who I say I am. And, thus, get access to my accounts.  I may have to go to court to force a company to give me access back, but it is <em>possible</em>.</p>

<p>But when things are secured by an unassailable algorithm - I am out of luck. No amount of pleading will let me without the correct credentials.  The company which provides my password manager simply doesn't have access to my passwords. There is no-one to convince. Code is law.</p>

<p>Of course, if I can wangle my way past security, an evil-doer could also do so.</p>

<p>So which is the bigger risk:</p>

<ul>
<li>An impersonator who convinces a service provider that they are me?</li>
<li>A malicious insider who works for a service provider?</li>
<li>Me permanently losing access to all of my identifiers?</li>
</ul>

<p>I don't know the answer to that. If you have a strong opinion, please let me know in the comment section.</p>

<p>In the meantime, please rest assured that my home is still standing. But, if you can, please donate generously to the <a href="https://donation.dec.org.uk/ukraine-humanitarian-appeal">DEC's Ukraine Humanitarian Appeal</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42735&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/feed/</wfw:commentRss>
			<slash:comments>139</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Why is there no formal specification for otpauth URls?]]></title>
		<link>https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/</link>
					<comments>https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 08 May 2022 11:34:35 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[qr]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42594</guid>

					<description><![CDATA[Yes yes, Cunningham&#039;s law etc etc!  I want to play around with 2FA codes. So, I started looking for the specification. Turns out, there isn&#039;t one. Not really.  IANA has a provisional registration - but no spec.  It links to an archived Google Wiki which, as we&#039;ll come on to, isn&#039;t sufficient.  There&#039;s some documentation from Yubico which is mostly a copy of the Google wiki with some incompatible…]]></description>
										<content:encoded><![CDATA[<p>Yes yes, Cunningham's law etc etc!</p>

<p>I want to play around with 2FA codes. So, I started looking for the specification. Turns out, there isn't one. Not really.</p>

<p><a href="https://www.iana.org/assignments/uri-schemes/prov/otpauth">IANA has a provisional <em>registration</em></a> - but no spec.</p>

<p>It links to an <a href="https://github.com/google/google-authenticator/wiki/Key-Uri-Format">archived Google Wiki</a> which, as we'll come on to, isn't sufficient.</p>

<p>There's some <a href="https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html">documentation from Yubico</a> which is mostly a copy of the Google wiki with some incompatible tweaks.</p>

<p>The <a href="https://www1.auth.iij.jp/smartkey/en/uri_v1.html">Internet Initiative Japan has a <em>subtly</em> different spec</a> which includes an <code>icon</code> parameter not seen in any other.</p>

<p>Hidden halfway down the IETF tracker for <a href="https://datatracker.ietf.org/doc/draft-ietf-kitten-scram-2fa/">Extensions to Salted Challenge Response (SCRAM) for 2 factor authentication</a> is <em>yet another</em> specification which is incompatible with the others!</p>

<p>Oh, and <a href="https://web.archive.org/web/20230122203833/https://www.ibm.com/docs/en/sva/9.0.6?topic=authentication-configuring-totp-one-time-password-mechanism">IBM has yet another one</a>!</p>

<p>Of course, Apple have their own <a href="https://developer.apple.com/documentation/authenticationservices/securing_logins_with_icloud_keychain_verification_codes#3795996">special Apple-specific version</a>. It is identical to Google's, but uses the <code>apple-otpauth:</code> scheme. Because.</p>

<p>Here's a quick table comparing them:
<!--
|                   |            Google           |          Yubico         |              IIJ             | SCRAM        | IBM |
|------------------:|:---------------------------:|:-----------------------:|:----------------------------:|:------------:|:------------:|
|  `label` `issuer` | No encoding specified       | No encoding specified   | URI Encoding                 | N/A          | No encoding specified |
| `label` `account` | URI encoding                | URI encoding            | URI encoding                 | N/A          | No encoding specified |
|          `secret` | Arbitrary length Base32     | Arbitrary length Base32 | Arbitrary length Base32      | 40 * HEXCHAR | Not specified |
|       `algorithm` | SHA1 / SHA256 / SHA512      | SHA1 / SHA256 / SHA512  | SHA1 / SHA256 / SHA512 / **MD5** | -        | HmacSHA1, HmacSHA256, HmacSHA512 |
|          `digits` | 6 / 8                       | 6 / **7** / 8               | 6 / 8                        | -        | 6 - 9 characters or numbers |
|          `period` | Arbitrary number of seconds | 15 / 30 / 60            | Arbitrary number of seconds  | -            | Arbitrary number of seconds |
|          `issuer` | URL encoding                | URL encoding            | No encoding specified        | 1*CHAR       | No encoding specified |
|            `icon` | -                           | -                       | String                       | -            | - |
--></p>

<table>

<thead>
<tr>
<th align="right">Variable</th>
<th align="center">Google</th>
<th align="center">Yubico</th>
<th align="center">IIJ</th>
<th align="center">SCRAM</th>
<th align="center">IBM</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">label issuer</td>
<td align="center">No encoding specified</td>
<td align="center">No encoding specified</td>
<td align="center">URI Encoding</td>
<td align="center">N/A</td>
<td align="center">No encoding specified</td>
</tr>
<tr>
<td align="right">label account</td>
<td align="center">URI encoding</td>
<td align="center">URI encoding</td>
<td align="center">URI encoding</td>
<td align="center">N/A</td>
<td align="center">No encoding specified</td>
</tr>
<tr>
<td align="right">secret</td>
<td align="center">Arbitrary length Base32</td>
<td align="center">Arbitrary length Base32</td>
<td align="center">Arbitrary length Base32</td>
<td align="center">40 * HEXCHAR</td>
<td align="center">Not specified</td>
</tr>
<tr>
<td align="right">algorithm</td>
<td align="center">SHA1 / SHA256 / SHA512</td>
<td align="center">SHA1 / SHA256 / SHA512</td>
<td align="center">SHA1 / SHA256 / SHA512 / <strong>MD5</strong></td>
<td align="center">-</td>
<td align="center">HmacSHA1 / HmacSHA256 / HmacSHA512</td>
</tr>
<tr>
<td align="right">digits</td>
<td align="center">6 / 8</td>
<td align="center">6 / <strong>7</strong> / 8</td>
<td align="center">6 / 8</td>
<td align="center">-</td>
<td align="center">6 - 9 <strong>characters</strong> or numbers</td>
</tr>
<tr>
<td align="right">period</td>
<td align="center">Arbitrary number of seconds</td>
<td align="center">15 / 30 / 60</td>
<td align="center">Arbitrary number of seconds</td>
<td align="center">-</td>
<td align="center">Arbitrary number of seconds</td>
</tr>
<tr>
<td align="right">issuer</td>
<td align="center">URL encoding</td>
<td align="center">URL encoding</td>
<td align="center">No encoding specified</td>
<td align="center">1*CHAR</td>
<td align="center">No encoding specified</td>
</tr>
<tr>
<td align="right">icon</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">String</td>
<td align="center">-</td>
<td align="center">-</td>
</tr>
</tbody>
</table>

<p>I tried creating a variety of codes on the fringes of the specification - more than 8 digits, lower than 15 second periods, weird issuers - to see what would happen if my trusting friends scanned them with their TOTP apps.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/WTAF.png" alt="A QR code." width="350" height="350" class="aligncenter size-full wp-image-42599">

<style>.social-embed{all:unset;display:block;}.social-embed * {all:unset;display:revert;}.social-embed::after{all:unset;}.social-embed::before{all:unset;}blockquote:not(*){all:unset;}.social-embed a{cursor:pointer;}blockquote.social-embed{box-sizing:border-box;border:.5px solid;width:550px;max-width:100%;font-family:sans-serif;margin:auto;margin-bottom:.5em;padding:1em;border-radius:1em;background-color:#FFF;color:#000;display:block;}.social-embed-header{display:flex;justify-content:space-between;}.social-embed-user{display:flex;position:relative;align-items:center;text-decoration:none;color:inherit;}.social-embed-avatar{width:3em;height:3em;margin-right:.5em;}.social-embed-avatar-circle{border-radius:50%;}.social-embed-avatar-square{border-radius:5%;}.social-embed-user-names-name{display:flex;align-items:center;font-weight:bold;margin:0;}.social-embed-text{margin-top:.5em;}.social-embed-footer{display:flex;align-items:center;justify-content:space-between;}.social-embed-logo{width:3em;}.social-embed-hr{border:.1px solid;margin:.5em 0 .5em 0;}.social-embed-meta{text-decoration:none !important;color:unset !important;}.social-embed-reply{display:block;}.social-embed-text a, .social-embed-footer time{color:blue;text-decoration:underline;}.social-embed-media, .social-embed-video{border-radius:1em;max-width:100%;}.social-embed-reply{font-size:.75em;display:block;}.social-embed-meter{width:100%;background:#0005;}</style>

<blockquote class="social-embed" id="social-embed-1522597758749880323" lang="en"><blockquote class="social-embed" id="social-embed-1522597542348926978" lang="en"><header class="social-embed-header"><a href="https://twitter.com/samnalty" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRt4BAABXRUJQVlA4INIBAAAwCgCdASowADAAPrVIokqnJCMhrjv5mOAWiUAXZoHYyqQ0eAuLFQPefp2t0tF+xe/kNlepsH6/8TzPwSqnv3elmK12fKIlHfzuAq/Afb8g2Oq2z/VWt3N6yAAA/vNo84oq9c7uaDif8Ttje97m+ToovqRbZK4Ji8uX4H7sdFlcDpPn7sA0gmE/zTsAfycjXDV2uYyIIfbK1lNrEO+NTaFfxxHfX942TEZ/CFSGOB1D00iDvSiS8CF4B3v/d2/y23jeIHY6AAuWf9IxrmTLiNNHeQGcqdBHJyii0hajpueZks+6/Ixjb5v3i5SZy77+ul//Kp7VOFPZc7BBrsUgJjBZKPJCYyTLBgcfIt/+IrT2px6eU060ADdXeLL/5MilC4yJ84XaPSp3vzxlp/HskXunfb5XQ4dWxxSg7T3L4K40WyuE0idrfdk/GeoUnT2ox9cavFP0+4jfSHsDlRzqb1Ncaf4XQfryl8/fwQZ2tdROfnFCFQOUAqFkV25q3d6TDZ6TqCKNkpz/INc1FQv4pOxUQZ9TXhNFKxHQBHkrV5AAXRuf6mK1j+fDuDuhjHOeX+NI186Uzmfiwtwxe4beufuzjBgMoRuv9nVHYtcVbiw+AgAA" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Sam Nalty</p>@samnalty</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/kerguio/status/1522592200764317697">Replying to @kerguio</a></small><a href="https://twitter.com/kerguio">@kerguio</a> <a href="https://twitter.com/edent">@edent</a> Weird, worked for me on 1password for android</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/samnalty/status/1522597542348926978" aria-label="1 likes" class="social-embed-meta">❤️ 1</a><a href="https://twitter.com/samnalty/status/1522597542348926978" aria-label="0 replies" class="social-embed-meta">💬 0</a><a href="https://twitter.com/samnalty/status/1522597542348926978" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/samnalty/status/1522597542348926978"><time datetime="2022-05-06T15:21:57.000Z">15:21 - Fri 06 May 2022</time></a></footer></blockquote><header class="social-embed-header"><a href="https://twitter.com/samnalty" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRt4BAABXRUJQVlA4INIBAAAwCgCdASowADAAPrVIokqnJCMhrjv5mOAWiUAXZoHYyqQ0eAuLFQPefp2t0tF+xe/kNlepsH6/8TzPwSqnv3elmK12fKIlHfzuAq/Afb8g2Oq2z/VWt3N6yAAA/vNo84oq9c7uaDif8Ttje97m+ToovqRbZK4Ji8uX4H7sdFlcDpPn7sA0gmE/zTsAfycjXDV2uYyIIfbK1lNrEO+NTaFfxxHfX942TEZ/CFSGOB1D00iDvSiS8CF4B3v/d2/y23jeIHY6AAuWf9IxrmTLiNNHeQGcqdBHJyii0hajpueZks+6/Ixjb5v3i5SZy77+ul//Kp7VOFPZc7BBrsUgJjBZKPJCYyTLBgcfIt/+IrT2px6eU060ADdXeLL/5MilC4yJ84XaPSp3vzxlp/HskXunfb5XQ4dWxxSg7T3L4K40WyuE0idrfdk/GeoUnT2ox9cavFP0+4jfSHsDlRzqb1Ncaf4XQfryl8/fwQZ2tdROfnFCFQOUAqFkV25q3d6TDZ6TqCKNkpz/INc1FQv4pOxUQZ9TXhNFKxHQBHkrV5AAXRuf6mK1j+fDuDuhjHOeX+NI186Uzmfiwtwxe4beufuzjBgMoRuv9nVHYtcVbiw+AgAA" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Sam Nalty</p>@samnalty</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/samnalty/status/1522597542348926978">Replying to @samnalty</a></small><a href="https://twitter.com/kerguio">@kerguio</a> <a href="https://twitter.com/edent">@edent</a> Even weirder, in the Android app it is a 10 digit OTP but on the windows app it's a normal 6 digit one.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/samnalty/status/1522597758749880323" aria-label="0 likes" class="social-embed-meta">❤️ 0</a><a href="https://twitter.com/samnalty/status/1522597758749880323" aria-label="2 replies" class="social-embed-meta">💬 2</a><a href="https://twitter.com/samnalty/status/1522597758749880323" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/samnalty/status/1522597758749880323"><time datetime="2022-05-06T15:22:48.000Z">15:22 - Fri 06 May 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1522593948950310913" lang="en"><header class="social-embed-header"><a href="https://twitter.com/ben_nuttall" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRuABAABXRUJQVlA4INQBAADQCQCdASowADAAPrVGnUqnI6KhsdM9+OAWiUAYC4F9/88AZUBi/iT0gUz/x2Yi1FvH8pq2qgkRxfVDXvlsquGPR233nNWgbjRPm3d5tEBY8WOtldy+DwAA/v34fHTGYdkcvM0NpyW5l9wXBDmJizXg/G78cyvDv/hDOMVphom5abaa+N0tCHH6Atw6JP/BnZnQ9+4bdDOHqsX8LyY/6z7Vb5lIiK5Hf8wmbpwHbOHKrPxOx4LkVB3C3Y1Uk8tsumTGiT8uvARYdIOs4daIZ8vZaXmuVrV78PrLysVkYNLl6q4rHMKZc4Mk1O6qaFaIbADyJeh0xRg5M2DWCKQ2wFsXn/oKXvO5lN2Vm+KlrJCkNL92nsAMUGUDOaDwqR40IHORon3f+esYpXN0TWg7NC4t900f/V7X19hanVskWTfhXN/R9at634o3kHU1HCGOgbGWHor/DMLFTeUFJ+CdEuarzqv0nc9P+OnpGI6wg7erI6NIQOeuD28SekqNZmjpsqbvvixRfW7Z8eHu//wtipY8+zP/0x6wT6+5sKxkpb4UqRQZ5/rIjGOGYQCt91SkKW3AHaFVtuzuMNz3UarAgVG0puJWkczvAj0sdp6DQ45edLE/gAA=" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Ben Nuttall</p>@ben_nuttall</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1522592041150173190">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Seems to work as my others do (in Google Authenticator), apart from the name is emojis and some RTL text</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/ben_nuttall/status/1522593948950310913" aria-label="1 likes" class="social-embed-meta">❤️ 1</a><a href="https://twitter.com/ben_nuttall/status/1522593948950310913" aria-label="1 replies" class="social-embed-meta">💬 1</a><a href="https://twitter.com/ben_nuttall/status/1522593948950310913" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/ben_nuttall/status/1522593948950310913"><time datetime="2022-05-06T15:07:40.000Z">15:07 - Fri 06 May 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1522592326509641736" lang="en"><header class="social-embed-header"><a href="https://twitter.com/kerguio" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRgoCAABXRUJQVlA4IP4BAABQCwCdASowADAAPrVSoU2nJCMiJzgKSOAWiWkAE9efUuVVP0YgVprdB+q4wKaP4+tQT9U0xtjlubHIWJhQStYQS6H8gshCYHvQ7ePmiaXIrcC5qxugIucI8ZXMmacopZWPUoAA/v4u2vmGJ8xWI07tUFkaMDPwFq4SHNqEOAeceix6BTkrSTJfdMf12w9KYEZ3Hrkxnvfbv/zj8PPCG92ON8jbVkJJsFEghWl7plQo4trtEPUGqlBIZbjsehokBqafJe679sf7fqx4ife6Oe0CInR8fvrRkA1uBNCJ0/Nxxzy6fvkmF/Oiyd8ge2yCp9XyiY1n98gRvlS7TAIy0FDvldfTjdVywIdOKozXnHVYHO4bpcszFazlI8ta8Wg/RNTZ0T/bGPNZPFo7Yfi6ZrA0x77JNVarO39pJM8tugZA5Y83nZB5GMF3cp+wkrPeImEImZijJCYU0gKQJ8dkUM0r6eQ3t90zVXYgTfLxejej8OEOYu0nf0e8WPmtHvs8BEaEcq9uJ/fRO7k+Bb3/604NIT7G/q3r/D0AJq79tnYzcMImDDxt+bt7zFR6Q8Me3TTVo7yJdLXSUCPnWetlMwJ9vDd2thAnoYBisAS69mWsqlzv1B1Mk2zXOfxzVESQn9a43CHXA6hAun36kelfuPeC1Ge60Gfmp27gfNFAAAA=" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Serge</p>@kerguio</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1522589408251334659">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Keychain in iOS seemed to ingest it, but not sure where it went...</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/kerguio/status/1522592326509641736" aria-label="1 likes" class="social-embed-meta">❤️ 1</a><a href="https://twitter.com/kerguio/status/1522592326509641736" aria-label="1 replies" class="social-embed-meta">💬 1</a><a href="https://twitter.com/kerguio/status/1522592326509641736" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/kerguio/status/1522592326509641736"><time datetime="2022-05-06T15:01:13.000Z">15:01 - Fri 06 May 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1522605596247220224" lang="en"><header class="social-embed-header"><a href="https://twitter.com/Johninnit" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRvIBAABXRUJQVlA4IOYBAAAwCgCdASowADAAPrVMoEwnJCMiJzgNsOAWiWoAnTOOfK/PX7uOAlMYtpVHyB2P97QjYhb+ry9tvRBMpAdz+98UEf37ZCZob6sKn6C+Bo32AZ93nSVkH37QuqAA/q49PU3rLu2tNJ9PCa1/7K/c6BEANQPLaPNIatWVu7F76L6IuGN/Gf/P2rc9i7DMmSjt3e476wdJYpWjejlRYlIJHtZ66CchOcac33VDloP7KNyBndWkJAShUSR0b0zsOL6w9pL8qsqT8WDBqsAN3y+Dz6uUA9fWrdSaUGmR0JG0wjf1xYV2lWNJuKxIzBq7c2eF8VpT+GlXlga77kcrjVXs2swDOghLAvBQE2ZqiUGD7vbgf8U0V5y6lf+pqPZTydbE+iVSeRHI9m0FVZMdAjYuLo19xAlRO3S/leprxG6qdEJZraLEkkFc/65ZsIXiejSjq4yS23Gk7B4q8vCzuGb5BPXXbtS1ccJejcEoIvRNB2H8YnliVS+Tg7vql2LAUmvvc977LHIOnClwFAGDXTyZB6fhfgH9LK1cW1rTL4Q4urck28ZFVMwdxDoJkdYkOsE50zpc+2HmWgCbbQySC0MKaef0XfrhTmfxjhZhLaPYY+6BVpndMPPO5kPXf8z1PjYHPGoGuBEAAAA=" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">John</p>@Johninnit</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1522589408251334659">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Authy says "Token format invalid"</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/Johninnit/status/1522605596247220224" aria-label="0 likes" class="social-embed-meta">❤️ 0</a><a href="https://twitter.com/Johninnit/status/1522605596247220224" aria-label="1 replies" class="social-embed-meta">💬 1</a><a href="https://twitter.com/Johninnit/status/1522605596247220224" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/Johninnit/status/1522605596247220224"><time datetime="2022-05-06T15:53:57.000Z">15:53 - Fri 06 May 2022</time></a></footer></blockquote>

<iframe src="https://toot.me.uk/@revk/108255557953114821/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"></iframe>

<iframe src="https://mastodon.social/@andypiper/108255613228860659/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"></iframe>

<script src="https://mastodon.social/embed.js" async="async"></script>

<h2 id="why-is-this-a-problem"><a href="https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/#why-is-this-a-problem">Why is this a problem?</a></h2>

<p>Formally standardised specifications are a good thing. They mean that everyone is on a level playing-field and innovation can happen without actors enclosing the commons.</p>

<p>More prosaically, it means that users can be confident that any app will work with any code from any provider.  And implementers can have a forum where they can propose enhancements to the spec which won't break users' devices.</p>

<h2 id="where-are-the-specifications-deficient"><a href="https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/#where-are-the-specifications-deficient">Where are the specifications deficient?</a></h2>

<p>The URI encoding trips up a number of publishers - more on that in a later blog post.</p>

<p>Should there be a maximum or minimum length to the secret? Why? Why not?</p>

<p>Is it a wise idea to fix those algorithms? Does it matter if a weaker one is in there? Can they be deprecated?</p>

<p>Why just 6 or 8 digits? What's wrong with an arbitrary number of digits? What about using letters or other symbols?</p>

<p>The period is in seconds. Does that mean whole seconds? Can users reliably type in 8 digit codes which change every 15 seconds?</p>

<p>"Issuer" is in there twice. What if they don't match each other?</p>

<p>Do users want an "icon"? Should it be a Base64 encoded graphic? If so, what format? If not, is a URL sufficient?</p>

<p>I'm sure there are half-a-dozen more gripes you could come up with.</p>

<h2 id="the-future-kinda-sucks"><a href="https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/#the-future-kinda-sucks">The future kinda sucks</a></h2>

<p>I am <em>so</em> tired of Google getting bored halfway through designing something - and then expecting the rest of us to just figure out what they meant.</p>

<p>We're now in a situation where everyone is (rightly) pushing TOTP for 2FA, but there's no formal specification for how users can scan those codes into their apps. There's no way to propose changes. And there's no guarantee that a user will be able to reliably scan the codes they are given.</p>

<p>Bad times.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42594&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What's the risk from fake Yubikeys?]]></title>
		<link>https://shkspr.mobi/blog/2022/03/whats-the-risk-from-fake-yubikeys/</link>
					<comments>https://shkspr.mobi/blog/2022/03/whats-the-risk-from-fake-yubikeys/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 06 Mar 2022 12:34:04 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[yubikey]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42091</guid>

					<description><![CDATA[I found this on a security-related Slack (shared with permission).    It launched an entertaining discussion about the risks of taking a potentially fake FIDO token.  We all know the risks of taking a free USB drive and shoving it in our computer, right?    USB sticks can install software, act as a keylogger, transmit data over WiFi, and even physically damage the electronics!  So a USB Yubikey…]]></description>
										<content:encoded><![CDATA[<p>I found this on a security-related Slack (shared with permission).</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/Fake.png" alt="Anyone at the Government ICT conference? Yubico are doing free Yubikeys. Well, I presume it is Yubico..." width="703" height="134" class="aligncenter size-full wp-image-42092">

<p>It launched an entertaining discussion about the risks of taking a <em>potentially</em> fake FIDO token.</p>

<p>We all know the risks of taking a free USB drive and shoving it in our computer, right?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/free-usb-stick.png" alt="Meme in the style of &quot;You Wouldn't Download A Car&quot; saying &quot;You wouldn't take a free USB stick." width="975" height="418" class="aligncenter size-full wp-image-42094">

<p>USB sticks can install software, act as a <a href="https://www.irongeek.com/i.php?page=security/usb-hardware-keyloggers-1-keycarbon">keylogger</a>, transmit <a href="https://hackaday.com/2019/02/18/wifi-hides-inside-a-usb-cable/">data over WiFi</a>, and even <a href="https://www.infosecinstitute.com/resources/general-security/usb-killer-how-to-protect-your-devices/">physically damage the electronics</a>!</p>

<p>So a USB Yubikey could do all those things - but could it do anything malicious as an MFA token?</p>

<p>And - at the risk of invoking Cunningham's law - I think the answer is a cautious "<strong>no</strong>".</p>

<p>Other than the risks inherent in any USB device, what's the worst that could happen? A cloned device <em>might</em> let an attacker have a duplicate key. But that's useless unless they also have your username and password.</p>

<p>A device with a built in transmitter <em>might</em> send an OTP to an attacker but, again, useless without the other authentication factors.</p>

<p>The devices could be set up to deliberately fail - or be revoked. That could work as a denial of service attack against users. But most services allow you to have a backup authentication method.</p>

<p>There may be some sites which <em>only</em> use a token for login - eschewing passwords - but that's rare, I would hope.</p>

<p>A Yubikey can be <a href="https://www.blackhillsinfosec.com/how-to-weaponize-the-yubikey/">hacked to send arbitrary keystrokes</a> - but that's of limited usefulness. I guess an attacker could force open a browser window to download malicious software, but that would be fairly obvious to a user.</p>

<p>So, go on then, prove me wrong. What's the worst thing that can be done with a compromised Yubikey?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42091&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/03/whats-the-risk-from-fake-yubikeys/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Should browsers remember 2FA codes?]]></title>
		<link>https://shkspr.mobi/blog/2021/08/should-browsers-remember-2fa-codes/</link>
					<comments>https://shkspr.mobi/blog/2021/08/should-browsers-remember-2fa-codes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 14 Aug 2021 11:50:46 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=39881</guid>

					<description><![CDATA[In HTML, the autocomplete attribute is pretty handy.  The HTML autocomplete attribute is available on &#60;input&#62; elements that take a text or numeric value as input, &#60;textarea&#62; elements, &#60;select&#62; elements, and &#60;form&#62; elements. autocomplete lets web developers specify what if any permission the user agent has to provide automated assistance in filling out form field values, as well as guidance to the …]]></description>
										<content:encoded><![CDATA[<p>In HTML, the <code>autocomplete</code> attribute is pretty handy.</p>

<blockquote><p>The HTML <code>autocomplete</code> attribute is available on <code>&lt;input&gt;</code> elements that take a text or numeric value as input, <code>&lt;textarea&gt;</code> elements, <code>&lt;select&gt;</code> elements, and <code>&lt;form&gt;</code> elements. <code>autocomplete</code> lets web developers specify what if any permission the user agent has to provide automated assistance in filling out form field values, as well as guidance to the browser as to the type of information expected in the field.
<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete"></a><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete">https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete</a></p></blockquote>

<p>In plain English - your browser remembers your email address and presents it in a drop-down box when you try to log in to a service.</p>

<p>That's pretty cool, right? It's <a href="https://www.w3.org/TR/WCAG21/#input-purposes">useful for accessibility</a>. And there are a bunch of "hints" to help the browser know what data to fill in - so it doesn't accidentally put your postal address where your email address should go.</p>

<p>One of these hints is <a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-autocomplete-one-time-code"><code>one-time-code</code></a>. The theory is, your browser can auto-fill the <code>&lt;input&gt;</code> with a two-factor-authentication code. A phone's browser might automatically grab the 2FA when it receives an SMS. Or a desktop browser might see the code in the user's clipboard. Clever, huh?</p>

<p>But...</p>

<p>The thing about one-time codes is that they're designed to be used <em>once</em>. A code is typically valid for around 60 seconds. After that, it's useless. The service will refuse you entry and ask for another code.  So there is no point having the browser <em>remember</em> the code to let you re-use it later.</p>

<p>And yet...</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/2fa.png" alt="Screenshot of the GitHub two-factor authentication screen. The use has typed the number 2 - and a dropdown shows a previously entered 2FA code. The HTML code shows the autocomplete attribute." width="1281" height="594" class="aligncenter size-full wp-image-39882">

<p>Firefox and Chrome both remember 2FA codes and "helpfully" show them in a dropdown.  Why?</p>

<p>There is no world where a user would want to re-enter the same 2FA code. If they mistyped the code the first time, showing it again isn't helpful. There is close to zero chance of a previous 2FA code being the same as my current 2FA code. Remembering 2FA codes is a bug, not a feature.</p>

<p>I'm not the first to notice this:</p>

<blockquote class="social-embed" id="social-embed-1423888616388927494" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/kaihendry" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRpgBAABXRUJQVlA4IIwBAABQCQCdASowADAAPrVQoUynJKMiKrVaqOAWiUAW33Zn0okw17xOYhAEAIlTck1MdmO4MXqTICfdsTGYv4WUXgwU7t+UHFlmZuDT2aQx6rwEFTOMMAD+5E1PkBmClPGqUsmH8P5hBixLfWMEq7lCLWN0w9A33l37yylodRLS087qaRLZocEyhOtMbvx3nCweNxb1E5cZ6rvUN+UjVFJfWVp8Hlat3/QfvA5Wifk5ypoYG94Z3bCTZdjvxtgZzBZdEmuskrTdjz9fTmPN968g+dxii212ykPXEQqnHin3UZIuroaNCSQgI6hMX5ElQR9514geVHoVCfYnaTtkJX8AvbKD8SwUH11aX7+svSTmDP2/o8oXncu0pvqtyn39H8wF8gouYn30qrCbLUWudfVY6TRvuKMHaIA4X/KcGqTzVAZa5S4BM20cUEskUUkjnGljd3ES+zxr+SNF8URssyYdb5qJe12+1TUNX1O1W2IvsLCh2Ugdb5BBZAOCZlfbZDsjWtUIAptYjKDvav7zwAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Kai Hendry</p>@kaihendry</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Is <a href="https://whatwg.org/html">whatwg.org/html</a> some sort of lost skill? <a href="https://twitter.com/github">@github</a> <a href="https://x.com/kaihendry/status/1423888616388927494/photo/1">pic.x.com/9WJD1FbOzx</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/E8Kq8apVEAYzHwd.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/kaihendry/status/1423888616388927494"><span aria-label="3 likes" class="social-embed-meta">❤️ 3</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-08-07T06:07:55.000Z" itemprop="datePublished">06:07 - Sat 07 August 2021</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1041981056948338688" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/davedevelopment" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRqQCAABXRUJQVlA4IJgCAADwCwCdASowADAAPrVMnkqnJCKhrigA4BaJQBiheqhoexfi/9lSBKS9+GV7+G80dL00MjQyi/kDnHAj4iItfYLybvLP2xxhj3QiYSz8SQ9Tsde6LP2XOlTA2/LCRwtaYgVUy5f7KgTcwAD+in/pIDmf1VaF4nPmCiVlajDiMSpUNwX8ayYFSE4kpjbtYVuUH5KUo3h/+aZx2rs3t2OFTJokSxEOGspc3HV/9m+04nqOPuHuvaQdcRXx1l1r4a7negAs9OMgxvwLApvzKuwOxEWL6Xg7jLH8NlkT0zrQ4q2THnMe4ACOUT4KsNIhasIdUiDwnVr0dNbktXxfruMwEjssSb/Mt98v/TTDM9E4xrk6cKCXWxzGiRElCR22jHkIT59m3Z5ZEIJ1fgXpth8CBrcigsTQ4ZTwgqCiB3LEulPb3E4wgA8vwlrIxnHMUPryc1iyAKoHc6Tsk+ab0+J1/29ceYuRr/R4ETbbXQQAMjRihjBHvIN6MRl0BJLwXy6iAqpjQhzjyFfDNfNURM+p/kl4J0OHfxYz/eafoiawJrEy8ROxXWvigLTWoJCkOS3N8CdQJPtufuk6/w5GgF9PCTO71okJiScMqVHzAFFa6O+ECJ3dkCGJ31ytJqzZRiZZoj6Ehndfe2eByarq4UeE4yXwxA0ZlaAsRoL1d3i4CfnjzMt2RhElFslwXbYXgBEZljo5M3UtV5Lxp38O2AOh++AyD5gckqZQID8sbbMpW68kGCq9i4ByVjT8APnPF1o7R11NFaiTdGKEArUVMnB7fhYOJBJY73UL5I1y87dCXHh6WgO88pqi3Bs3md9CTxYeD+5RLtHkXE+HC8IIYEbufEfPqlwatFJADeRRlq4Z+YlOIrATXwy7kAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Dave Marshall</p>@davedevelopment</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">This irritates me far more than it should. If you're coding up a 2FA form, autocomplete=off please 👍 <a href="https://x.com/davedevelopment/status/1041981056948338688/photo/1">pic.x.com/jXBRithoH5</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/DnXcFhCXgAA6KEy.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,UklGRhQeAABXRUJQVlA4IAgeAACQpQCdASpEAk0BPrVYpE6nJSOiI7QqqOAWiWlu4XSCVmC1m2pNaXRA8sg+/P/09Nuc3TT1j+jYvpPzH2Q/4T8nPOvx/fAM6z/S8MXV/mT/Nfvl+x/vntq/cf1o8U/g//rflj8BHsf9YfJb9gHgxbl/qv999gHyC+wf0b/sf4nxbf7b0H/Q/8t/1/cA/n/9S/53rh/1/Bh/G/8v2BP5J/c//T/ivZR/7PMx9Zf/P3D/1+/8HZTHe92TgvpU5fCe3NDWkSdYCbSJOsBNpEnWAm0iTq/XTVuPOoxtDIOhxVUdwM+wOq8sEwU0mkF2pKFYTMxxSJRChppZ0c0XJbVUmYxuo9l4tQcAFqdZqdkhZTfGlI1uE4f608Hhn5ZZwBK3XIGq3RySPxVq+GDpDBBbBBvpqloQ0cANkYdJb4JFGknkAqTeLtWnx3dDS18NbUhnFgfzZobyEadxyeQtynN0gcxMDn3QyBCcy6h3PAYTqjnlpve9k/iIA2wIrtOrkN7R9NCY4N+/Mf6UIYXH8F5NcKgBhlzqmjVRMk72sSrpYo0gX4rVFBAC0eAVLojP4exwSStQEDD04eMLMlJZuscy5mBm7j8GfgeSvsxsde/81X5ZwAUT7YNdpKfo+5jMEPC1zmxQfnlhXZLAKxCHIakYbOqmSsFsNQvan9aFH6Up5yKazbcpUvX4S4fk/VjwI/XIi7HhW6VruLbql7StigndVHTM/V1C4q4weUiPd75K30A0aC31GPL5lIw41lEhWp6/m5F37eNLm2h9IiSWpJqrfv+JgQ5YEqlhJVv+l6FpwMzp9zzumh1Um/a4NQC6dKuJlfFXEytVrW56DgSZWvbaErXk0mVuW+ZkjrfMyR1vmZDmWv/UPH0E3BGKy/o2JnAuARPOE/rvnnZVFjhhX5FlTzha+v9+1Ylcrafwgl9jSbUGhf7+tpBb2VhjBdaxq2/3Ka8FxhatVsdqrWpSNeyQrelYY3IQ4aV4q+lVGKF/YZ7gsZtWRTc837bfskNTWZisO3yJpw2N4ZPS5ImPWv70N7PTTYb/+G8kGAt76VQ8IgvpxJpsN3duZowd+RhRnqFTDlPbp0O3NXHUHmIBlRepgVrny6G2Or+sXHnWJVO4mqz5UN6zUnyYb1mpPkw3rNSdiw67SXyMYhpcHQ8xrWshA1Cv1+ePYKlre25kK6WYLBmkiO2RzaQKrQH731xvVo/8WrVbHaq1qUjTRJYexfmbLGirSetislEN44GJLBB96IJUoWyvJFiF//DeSDAW99KoeEQX04k02G//hvGJ0iD+L+d5NGdGcP7qxaWUHDH49EiAUYMyqJx8dXpZQJIF22eNSWw03F/Yxx0sEvKfeYWKqgL5ls2bMAGFKcaIFOhRrexq164NNGJep2DRLjC1arY7VWtSjPAmGGED0ZdMrN/Uo+bykXzbRDXpcYWrVbHaq1qUjTVqtjGVNVJfa/UyUQe5Tl3guL54t/cygPgJaSNNWq2O1VrUpGmrVbHWXUPndRV0+i+Qn751fN9TgCmELgQCUIzG2gGFWx2qtalI01arY7VWsABYxdbEW6L3wICM5UnVnJSNNWq2O1VrUpGmrVbHWTsuRKpOT7R5xigCHZf3nlOHvkoGKGneZuDlI01arY7VWtSkaatVrE1ZIJhsv9TDQ6c84ukmD8OxlSND0ao3BU6+61qUjTVqtjtVa1KRpq06OsMH1Yt04W60N5fCe3NDWkSdYCbSJOsBNpEnWAmyXwiXw/lI01arY7VWtSkaatVsdqrWpSKgAP6AZCHjSZDEqJRCC+9H6Gv+LDQyzhZaWsGXEAAX3+ce1dDt4utVCVA6mRlXfb2v5ocliQAwpCyEwS5gaEHaIyAoCxlX3vMFPlYKc/N1Jc7ctHmtyZr22Mznq4GWJFisfzanL4BdlFPjHibWhtdIdcrm0dhMONwLUYcLr+Doi8Mv81piI3+BxYAkWArLnuF9mgshRlj8kJ6x8L9JlCnWDJAeHJeVmjxZqw9PERx0svsRAFdFx6jz8G4s9GkC1MngCErGbwMQhlgx1MyZ785uyDBqxkpmiAJzpvWK5qtUnanFmkzYaj8UFsT43dnKSRiKeQz9bgz7Qu9xpSD6/Jo67wYMojhfkbKfZdBCd2aBP869LULnSG1+PWVkVBtf0CjpDr9DDFtSF0STMw6SgFHPnARx5XaaqmFYnlz3q1ptaTrhpVBACu18nqswU0uDRc3+9UPAFBZHsm3XEugBL8r8XOBLs63yN/v/iE8PDLIpWFyyC+ooAAZpwjb5L1qBCgCsGt2zZNekADVq4/wZeNhLa+FJaLePd6RKTpzgN2NTK8a7apYkFebPe1I1AR3E26wUMqF/pwJARG+BVuinFj8nUs0L0sX9dmfUxd1gMEK/blWPQAvE+SgSJct3zRznz8o2cA/t3Nt7CE5i6d8N0c588Dr4dJ/2SoEKnY2wMVMHGzG5MXeYA7Ke19RUvYIEH7Kk+T8vq0ZFXTGPUAxHQcXg2TheM4m2Eq0muckGGINNO29GOCfg1J6f3OuO0yoVO+u6EY7JI2/AXz3owA/yFu73bdfdPjj0ep2aEYBEzqqEtBcOAHiRnd8AAyMpWVUiupzROZwTM1QRXsAN0/kQJwaKpN/B07gg3xNUwsNFsVfbCDIIx29YEZ9mjiiCYxxAeWrmkVbXrAGWd+rvSvK+KtpSdAOOHWRNHPA8ygJnZKZt/ouAz5cPMATsweotwF6RUBtRYM2fWUKs6tXhobJyDu+AMjCpoZbj5jD22Q+9uonH/MJJH41yzQPPOkTC4xj62WbtDXoQm0+eyyUhd7k0k8xJHj12+ZoNTNx2Ds395k4uZb19gjZ57I3bmUYV7sFSrlDsIBMIwJ/stcrlBQYbWU1HhFBqmbAIkqPmI6w2iimf6hKgc4ymVNtQtG1yawY5sawbV1YvsZXhrlKDnt3B/NWBLRIPZJ6HTv5i7gNUwzPGBqpvoPHMN8lmNvPXCzgB1BkNby0fJnFqhgU5yXIWnABt8vFXYN40V26W3EtwoM2BuN+zL+AF7ceAujyBRXIa1jlogh0lQy6eEATABQoOGIYXGsIBG+Gap7AO+PVxyPmTr+nXSREf/ksFtFdwxAG6nFCbUuzvqGIJZxz6GMZG/p1JtiQyxciVtAmy3wFJav57E7vc8iXNxadkKzAaXShcUuyx3KkXLkA6OxapqcS7DkgsTI02Q7i2Pk7gFpEfC8CNADlRBmoK0ottnykVN2B1h2odEARZ7dQPGGXrP30+hGlUk7sEkhQScrlqKzddk46T5pdtFx48qtyDqLgzoJ/7Oa9UFp62cGLxpolO5jFbe0dqut2OVgE2opoNEosbU5Xhe1+DpFNxLSuBDYm/PPSouIrSWj8Q5DIiPP4YsmuImC9Tvz2okDU3l7sCTAQl3CBsom9Yu98vKrihb9FzyUl7HJtM2imLxeeJ9Prdb4kYzS6aeBZAOZVsDFcIPXTWvObWj220k8Xx6vX/2DqMaIJ47yRv+8zGBCTc7T1pFGcqDqsKK56elgLL3nZLEHJ16SkF3vkXxjj0sQvswKuljuJOuas+KqcpeBSKp1BoOXMGhrrUU9Pjh/RvUB9X7qeL2Trn9vL3UwQVLAT+E4AzIzR55PApy9V1VfE79jhiu5hXH3bdgGsUc3Vie5asKP7e+T2ZX/o89I9oHIvZ/H/tRo+zE9/SVGA9F4idxAPa8FxrdsoXYu0h+YFRZUk4sGs0Hpj+rL5R2lc7RcMK7Ot+jBeOWePMIla/LHaDrh/yYPCokeiU10p+1uP3OLDb9FPo6dEdGogBUKNbbbZXxrDlDB4IIa0YuuhrjYtdi7W7stq6FzVzfhlFLy4yqVd0Ofma+psl8vVZ+Pabzc2GhcC596JnkBDQBs2CSOAOtmiisX/3jNnCvx1vfF2f2R5jtXhSt/eaC4XFh81C5cYKuaYsJ5PAp2xxfhtzh77UEy7jZbMcIy97eIjt88E9Uz5BmJNd4l/OvmVKQXw4MBJQpBT4+41yVu5JjhdsBXqI7UG1k2ZkDdDLCXnFO0Xx8C5O9AANpZMn0YZRK7zebpqYwYsdfqW5G42GnioDif83+Nz3fzDUeGBxiaq+MMXE4KnCkegD3E+1mH/VhSSXtHaa88ngU7Y6V2IpT5G2jyhTfuYqyOdYHO6KGxwho1anHUnvnp9FxNh0ktpTM4OI4/SnL/lf+HngtXuZ3aephCm1BgeQM+8JQsOOcsR6dXqBSGtgIrTDU1IUtlLzXD1KE/Wza3AcMU6qtJOIhQCbu0HekMB9fY+Dg8xOf/g82wyYxfo6vcMcedl5XKhp7xwAfkCQUj+UJb9J0JzWDnsegDHWY8Cwy4NzabuaUqeq0HRs+8KG7iqNOQL1oIn8VwtyX681pbayhwCWWINmR43Zsb0VjY+MJMJNGPLFPn4Py1nP/EzxvCp+2cCHIsehD95/M8CWSrmsku4kNtKJylynwGF+p0opjqseDwkkdJWFhtiGGyMR127nCgx7BR7tfAs6V0q5BiVyGKILcfZaA7u+YIAYXKP/KyL+o0B//WnLOwb/ow/+0XLfUAVit+VSBzN/13Iv2MJoTaFejXQNoEVxf/s2C8MH70miBO/tKo7IXLLrBl44+JQ68zopxqfB1ru6ZBuMeIo2lkwdPjp5X0GMjw3vv7zed8zjn0MluMAAQ1pznrFmVIWS1K/HO02pj6ACtJIutnAnSO0kIPhfnXOpuQODZ7b0QcYATn21X6Glr8yoA49ZODclEzBZmI21BPFgLLXvbGJTTnyKyRrl3gLhzmyBAgBxCsNCXrI/SeMSRpIji9qZV9J00l1ztEFIhB/X2195a0W6Jm3BbwoqkqLMJ6Glt1H3c9lhcjtUbVQKbtTbO89HMKSgHvpY7W0OrfEB0IhXEGnL6IqU0nb3u/S9PS1E8PICSxUxyU71I5aYVmz0ZA14z0xvBZKZxHeNjpaL0vyZ7AQjXq1Bsz7RC27tphTZU6Wj9w1giZEHBwDOgSu4qwCtYyG1JyvBDlH/C+u/Q/G2oQALAOJCiIy6ZPI9zqxfNOFoJJAhVp8XgG/h08x3za0LFCfCDCMwmjsktrRC6AxJYX8j6tBjL6Md0r5oG3OfmtPgb1ApF2Nc8nI4jkpPm/u9TThgLF9CPK1C4k3kPmZRHhjQfxUEOwASAO5rsmQYPb8PizqAb1bH97Ej1csAMpz6pBZlUwL0G9ICeujxr5oEVj4lsIgczwnEUkOVe7GsNXI355FBO0loE6ykMgyDC9oLsU7Ol3+O0bFC9J+AVDL5xceAAeYi7NtNJQaie5OYI4oJ+9H+IMxt6V7irS65LJMWpBJGEiyUYY009v696RqeXLI9fKQeGMwuT5vVUWEP0pCE9tFtRo+k4CCWAGvYfAfKAVY4N6Q+AA457GPwJLMEKBXMjmcDUS4ICtEI+AtoOWVmzqCxZeL0/44sXFWhtagjynrN4Gi0D2674Qx52dIGYfIlIJGJRNaOvCprzCBnGxC3IxGR8U7L3w1r0FOOnlsVdAPatArQtUyX3i2DSoJQAb/4BI4tQfPjIFVziAAAOf8oOEdUrd6BKZuMyHrY5hF+6GPN1RB0fgqG2HWyt0RRJC+8cOfkjhiEoHoaNVW5fs/h+Lv7UDvCaTKrrr0HxgAJuTxdiZ05VhvcgczfjEW1Lr5eBB76xJC4X/DqAAH6IOLZDV8QX+2JHfr3fVDpmfor2EbaG3pxFjc6o9O5aH/nK+V+OGNphqi9/X7SgyHcz75gl2z266Wy9tsvYpaCAmuQ/PWKkNovU6d5b1jr4TkbVcJDOTZN91hdKH+zAuT9/z46NaS2vjXhOn8WwV1ajRhWtMsuH4cK9k8zI+JMYuo0lvR77/tyAKspjJYytM5hd3RTOq4I25ewH+QudGqNtZyS0fs08IXgK3U01+THI3jDyLeTemryJBYW9IiePBG33qCNsXzLU4L2X9wtjMPjFFhuHJvlbGTswDvxEOMev5PlsI6ijOnUQ4cux10ZmHnGrlrL4bvOWRDZAZY6M0auJ5ScpHsmxrX0py3oIKx9QWzLH2C6BG6OSX5VeB0iQYY3VqFw4rxJCQ4Y2cXiIygJXD4WwoDB5PNZ6oFypXbM+DkTqbU9loZqS11YwTNL0LiwwoJc/4bdpZMsJDlCiWLB19xLyy/d3F2RoIQCT486RSaYfuhhCUCRMfopnVMiKi4TDRXiRNkyRT9jxs8gfhWcEi64nYHTr2toYctyHI/pL70BbUiBYH4rcN+mEdzvUhCUCRVdTT9ofTgDSpd+1LZnf49R6b6VVuAesAceZ1A8UY8EvVKQz7Y10wz5z5qXS/I+efRDbkVE56WYxApgUKQsGPyZBQ3wuxTfHJzhE/IQyoZ5i8wiP8iD9+u0BZf7uO7tcdc/PfyPIuoNxBOKju/qva1Tx7TpxcRgIpgyqfFKM55SO+YtDynp8XI0E53Oe6Y+cJH1isct6gk4LgMKuVXCz11PBB1+79fO8guUEcshfq/FABZESb5djYVUibY0Mx6Tg4P3A4kg2aVrH6g1JFOXE2Zx6J72BNVPcj4PE3H10waPouewqy0RmK8qiew8+FjHak+itVEDVyyINcT7KVRtrVIsnEbwzMegg0JO4zsgFFO5Us/06+oHH8ZiMTSdinKAgWj0Hd6x3v98tCLcH9GeqSGMBOLfpCd94GmxI9vg0Uhm64M0RVcviudOZwIHSRHm4KtSBK2oGa9RCm69RCm69RCm6dVHRoJc0Shoj1QESClAo1Jgi7HTIt2yu9wVABPMIU/kWQ/APYAhGi7vcdQiGhsvynYA1doRo3w+RJqIXPv4PZww6FtURSLwnExYLWYsF+Z6lTjnnArs1b6WQ1VFA4Ob4DWS1+u00o31a1MoHUzIPS/kQiiA2sNJKlszSVYMj0Xuc+uOeL4OqhqPjkhreSYMEMxEpl5gAvkATSj2rqhtfwo7mVW8O35gtd6gDj7JG+R+D0wcig1Xm3ad3PIsZ6/HQ7RAN2fhoVd3/tNGmL23Xjfy9UpbUhmrklrzo/qRN4xJrJS7npgrfuZ6AAAE7obHTikFHln6A+7EfHBVcbqx+uF49NTugFshfRAy9aDODWPskav8QijSEsQyScfbkRhxKzEZ5rNwS379nYB7eMxAgGfTA+Fv0xPxFqpS3IsFEkdah8879EjEhzRO/OEoR3uuTPnp0BUFwuHDCLa9j283kuAE2EfjwE6TKU8VMDNeE/4SXq+cFcfuG1ce04M3mNluKcBBEys+ppYviwF7T3Hz/k6fo9J4WBb89cRDoeo3+rLkGQGThatZdMbFIZYykI6qI2pWdr+mN7ZlTRG5Yc5UEzXMlcqTntVS2ZuYuCjrkRFA4qC717LgeS4uj5Wmcgs7m5v2DbjvA+jgEz66hzoxg2u21kx/NPG9bQpSV6SW7HnAmA3hpThHj+lms9JjcgtrX5m+0NlAibw8z8w5wglub7YbnEuXTPEkM/RLj4jIjXEHUqGhwEbTof5dhTLli+gtQHz/Nm9rDNOKJ3snT1OS5AulhJ4MFB/Odkr/3SYy29vj7x8HjVuKzZlH+H+IPnmRPlGVd3tMIZ1xcjLHaT54vHfx+aZ1a/WR8yqpWRFgYMGILUbPbQ/wlgPM54BOl+d+ci8oAmDXN4mW88utjv5RDdXg6Ms8I9RPnEG7/r080qyJEsB5nQDPvD/fYShBOFPHib6wsE2yMijaiLSe1A9tWZHnBo6qtVWqtZGNkGftwPX4FWsArKLcY5YRXMrmVzK5lcyuZXMrmVzK5lcyuZXMrmWEFKRqXI4pEkvIBVNfpvdZLVGRPRT0NGIEKgTsY3Tz7zMdfmzNG3r0Zztk3WE6YjvD32/Jlz4dmLrxM+NIMonKWxL1K7owVrl4Z273sYLd3YJSF1yG1zi27hYuiJaOJadUEI4GzzU44ZNo3bomuG21dYe0BKNvJ+Sut1CGyZwBZ1bsdcVPbDVNJ5DUnYu64aNu8OIwm7nmVCvmIbA8EmCCiwOYbhHu3pgJNseZT5nmwqc8HgZRBWoZ4TbkhTW2mJuUIlXCfv8szZNWkl/7rr9ix0iZ8Tt8tLGibUQ4EEzLCZtGAAAAAHScTRef2xg5YCt/PhDq9BY33v/3VxKxyVHOpNk4qKS965hSaFqS4qqNXGGpIpWT70uCkjmlv5GEdGFXUfdDxSaU7s4gI5ZVfTNnpu4eZ0EQTSQeDDFhve5meT3rVjyosGRgHhqhLW++yeKqY7smbRwI6g8WzvpK1lFRr7SZQxfOxR8TfqvJhBy/S5Bmp4szkaVu8szaYydwVXQ9ixeO9qNwOFjrjB7PpUAz/6mgdkbT/DKGzDO1y344gBx0QxkLRn3QultxUEGSVPpMOzTK2BJW1n34KSSrkL7Lc/f8nWjVXVfx9t3Uf2Ibo/PwxOO73/yX0wBfvtW7+vni7oRNDe5PmoKHhSDZnarjl+REjsD517sA5jhb3ek4xi+BSK8hwvfQqyiJeu2Crn4YkyABcA3QwpQ5fzGzBM5FgwgCqjHH+Suvre/JxEwCTZQDSyexmmmSg7jqBndYbAnle45J+M2I7694mpBy73HqX2T4bqe9onCkQV/8txHf7yBAKbwXg7nv0mie9I48e2/xzhWbvPtMzDoWgRXqLeQkAdrWSQr0J0nqOzdX5b4JNeSxg5et+9qQbM7Vct/11iYA1rAyABMCfhD8mbVdMwqwKh+Tq4wovIxBnoORK6+X/JfTC+FFoyzcb0E9gCsTFIEsbqBziGkqfQ6YNhvG1J2TsGzvluX/cuMBGmaWlxLWbXTU6cEsljWRyRYWcwLn9LDN1VDID+VwRbxnQsPliKzP9f1hTqF2zXu7/Nivr+7LoBPEwe1YAzSncyuqB7Q0iogOySX9KsmXk7nP86YZ2e7DQ1fcwn7l+WXegNIQWc15IPOhv2TPgWtgvfGsc8RuxAnMO1vxlmcMjsESQANEJZ8RqnsIAHV9v86X95mx3vb2QXqmLSbvo3V0cRxVlwu9s0xQqZdHC0nR+9Hm5tbBHJ3fRe8iMoxXmfnZDwmb/jDmRjZfD8RoNHnDsB2CXL8BC6s09bFkorVIN1HFIWl0OYbhraLYpHYu8238OybcMpcp6ZFM0Dci15eOtxkyYQzDIpH6X/bcuTn2fvO+yLIT/gb8OWXIBP4cgjseApkyPFbaSvfgTnY/9bREB+GYVKpaeI547/rnD8vd9a5g8vIh+JBXO0yjE1FkUSEZTOuLUnR8YXjVK4dW1K1ubi1fTbOcIN7eHh8tenX+bh28g5s7QOk0PZtbXqg26HXw4EpTWurH5dYF/us2306wnl3pHztJU9TICXkQAEuKZF7wMZSnV3AmveJde4GjJvTRX8QvPwMKZUA9gTDzqiV4sVccTI24lGfQDP6wsE1wjVglj+PEXH3J/7vrsBdFPEbCV1N5BoTBSxqLp/xGLsiiUx6Zn5B8Xa46V2P+Oj7WuW/VPwG8uw+MaUljw7DZaRDf/J78+yWixxQF2kjwfwv5KmarAAisj+QkkEBFRcDfAoivXpWSqsDJb4yiWsNv7P2pp59x0018U0J0G2UfBoU0o7A4CRDHQ+xEvG+U947O25BOsPxYTiaA27sDluyGiRvPEo8/zl/uMjcHSghqkQR7JTiY66a2RDWNVboUtd20c+qeCAal/ny2WAVLu8/snti8icOjb5PCmCu+veBp2rfAMTdXwXroTsGhSKGcElAMmkU61ym+jQK385/nA4fHcI1KqDoHpo39fxNvKoFuk0UxwOjSpFDeeaEqf5Ikl2Trd/mDEoIT+qFp9JlgHPngVTs4tNpzmAMEHpN3TmM+Ioz3gOiB0mlqFp9lkAKdUOeqyjN4j9h4kHwM7YUjaRcmO0HClJi9ZgSTYcH7Ym2GT+OZlpZeAjTfL9jIWeTQFylmLaITGGORZLzE5c4dh53nD0OaLQzugLAxKsEWIW1ccudUEXbtJIDBwj/BM8e6dLYm1B3gJ0l0NfYOTBYypZEkckveIsIs1jQEeCpffrk5oPEskbmYFeRGeNaIu9NCVCYu3MvkTZjQqoIXchvlG5v6pPkOvBvTffHbKNhI5uIdZoV0VgkunaZ9wRu5WZiQjss8cc5uCaiUhPFw7WFFvQoan1ggiSm5wYFsOfBT/VN1X7LMC5Kv5ESOwfVhfCioMxwN+0/S/gbqxyXC99Csd4gnVMQMYlKs4H9+OwAColvfNbgCOpg94IhhPwI8RCeboOmAAAAjXrIEW48BHLGg0gAAAAAAAA=="></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/davedevelopment/status/1041981056948338688"><span aria-label="29 likes" class="social-embed-meta">❤️ 29</span><span aria-label="4 replies" class="social-embed-meta">💬 4</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2018-09-18T09:23:37.000Z" itemprop="datePublished">09:23 - Tue 18 September 2018</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1387799224167931907" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/UXOpportunities" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRu4EAABXRUJQVlA4IOIEAABwFgCdASowADAAPpE0k0mloqGhPGgAsBIJbAC7M7R7XInqzUwClQjts9zyGnIb0LZgm2j614D+DP1rGDa3f4D0A/jn22/B/l3yAygfpf9r9APqr/gPyj9zL/F/ab8nd4N3x7AH8z/pH/O9Qz/i/xPnu+k/+x7h360/8LsSErK+8f5PiZt1XNn8BxT+/7/JkP5c1EsS5J65/nY965m3SIVEOh3zLT4uKpvxJ0f701E7qpOb6fTbhMqUs1RPAAD+YRc0725M0F1Tn+2T9RUMasDZL3OGOf6IjKYGjH0GO9UMnDT07I3A2MoWfN263x4mcSpwTn8ZfOCHU2PJejSW0jtxOxvxu68Qr4NAsYsuwIYIHVF+RvVJ/KwCBKPc3C459asO//hcsN3nr951BqSCj6gTc2sSWpA2dqtc5Evbdvusim0gptZ5wBQyn0iTQqjhwZ47l0XOZGX9Wxli1HmnEuWqVbSrDCdgmXea/HILSIIBdBr7ruPn8tNopAZeT70z7Fn/PpjgkASOQoNrZHPtLgHlYj0rB3yQeYeGMzJVqBcDXx42l7zcbyImaKF/8KHnfbFHybnT7wRWOa5asvxDzSaFc/iAFa59knfh0lAbY8ZwIMG3toK/PJgq2LxL5KmyFpAQ0i3tY9zXmG1ACMxOH5iAEQK6ziiwZdJ2gGHTaVUsG8zhOEXjYntudOljvELd8WFJ19D6Eb9faz4g+HFO+KW81D0yzqf/jYXbru3JYMf524dDCQJVtda/XC6mQIac/zYS/yCM3q8vrJwafoyL8YJBIfYacxDR1sgtj0+tvAL1gXtiweWt8Aoi2+d5O5y1mq2bT1rc/+UokWfPAZtro4eBzfMEDm4zlwTxht6nraaoG3ScbDjafhaFV+xxF/ckuhR/aCeTeVsgksNYUXs/3bImaeNRau7JH887FLm6co1oDx26aJfDRqaQVPzuOqZtuHrPgP/6Iv+n5lMo1ldAX99tFlxhL/hAKo/UxxT6PrKzgush3UbPJnp+n1+nBfKD+lXb6U0LkdPMTjFUaj8ewfs0lIXUs5MfPwTka5EGIWzGEci8mevfzLLyyUPHn8/8wKs4sGuco+el5bSYJoA8W/F+HavLsESNz+3d44n0n37dN4iOU6MF1zV9Zzx0TxsKS5VNsBbU55c5+Z5RKCe5FCli+l+1ivjdtjZ2gE4Yv6acAqmRbGdTMpYSomQS0Ih9+Jcv/jcKci82L7LqOhDhrfnszpKdYvRcbgxeIFpXoLkta3Ilp9qXSfnjJTr+BboUu10n9p6EYyjj6KNEZx33K1CJCrKxgwEBUT5jD8MEjzGYOyZ+PUTQ65GJhRvvz3Q+UE+0RQ/vTirEzTTJMv9kazrx3Uj19VKn0V+/IVkgJYXB2zEWerRdIFTqXVo34ORAzOTmujYNMm+HF+khw9L/z0B5ykdsARNuM07O8eA6kWfJ0jWZmB5ASVlx1lFSgvuUc/gv519XLXPycd31HIXnrEbMdbfpB1kxKmcdCN8KNWlR95Goh9uQYl2MGhni4wFlmKr4cGQkJ3ye7Hjvu62IHjMLQf3XXfdH+t9StEHL+N3cfBpRUyJzHhMPoNr0pKwW81sHHqjL+zed/UvTA4KhgvdY/KeLPbpKeT0sVJ/bf2XjKoo8sMYX+UOyWZp0LYutKyqAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">UX Opportunities 🟠 User Experience Advice</p>@UXOpportunities</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Auto-complete on OTP fields shouldn't show past codes, <a href="https://twitter.com/ChromiumDev">@ChromiumDev</a>, surely?<br>Do other <a href="https://twitter.com/hashtag/browsers">#browsers</a> do this?<br><br><a href="https://twitter.com/hashtag/ux">#ux</a> <a href="https://twitter.com/hashtag/userexperience">#userexperience</a> <a href="https://twitter.com/hashtag/uxfail">#uxfail</a> <a href="https://twitter.com/hashtag/wtfux">#wtfux</a><br><br>This <a href="https://twitter.com/hashtag/UXOpportunity">#UXOpportunity</a> courtesy of <a href="https://twitter.com/github">@github</a>'s <a href="https://twitter.com/hashtag/2FA">#2FA</a> page, which correctly uses `autocomplete="one-time-code"` <a href="https://x.com/UXOpportunities/status/1387799224167931907/photo/1">pic.x.com/fyci5H63ze</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/E0JykHZXsAgFlLs.png" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/UXOpportunities/status/1387799224167931907"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="2 replies" class="social-embed-meta">💬 2</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-04-29T16:01:33.000Z" itemprop="datePublished">16:01 - Thu 29 April 2021</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1363963316696211461" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/chordbug" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRgIDAABXRUJQVlA4IPYCAADQDQCdASowADAAPqE6mEmmIyKhNV1dUMAUCWoAnTKEhFfIXs9voOltzGY0b7MXHL+DJUUObvQeBmk+mp+SKlvExUbOVkV+gOZCNSdr7LcafmxEnk7Lpmt7aywEf4cyQuYrkKWC0455wS31iWiR79i96QLHzQtaIAD++zGBtBfuhxFxXbNlaZAMxbV86ySNsYIgO513YKjfnp66ywRefISPHa6LD/PiIm7ZFhlWA5j/d22SOr1zw4rMj4Xb0P3a2cLTL1uzbtLF7bGVIePvolPa3hdlmE/NTjJZBAz66fOGGs67xs8UdBz3xvo0b1vPIbE7PGCDDsdMKhh7D1QSB0yxlFB/veAWpTWD5km4auii1vbVjdxSvu3q7bdiPWXLH2bzY/hWt7MWBoAMAnBdCtGR52d8DU1FIAejy5S19vs+oiaOwaPdwtTJeYDZeyT1uEtVcZBWI76m5Rh6k8AT8nDVY4GKQ42jh1PMZBKFRL2Uc8M5cdU8D6vuWAnzgEy5KgvCTFJPBTuC5DCl8DuTfwgrv1GmPlG2MnEasIDGsMnwiKBRL5Ssl4AmBJOl72STIfGq1sSInO5snKsqkTLf9frFrE2meYs1VPX+Rbbrl1yGmZ5RXz7TXYlFNho+q13viHuuKAY9JwSMuOjMOd1Z5pqYUToH9yXWm24D5nJJQMFMPTk9K1lUHfa4Nizg76BQD7UCV70xqdrJxJYj90AhRo1ozV6UkOHTEMD+Vbn66OSiKA9NzdK30+x208BzMJxRcW3zlXGRtcpflo4UoyRfSCK6NnWrjkaeUYskbuVWt+Ovqqb5IjiR6S/L0CF0lOFNBnG0SaaemSJCqhjTT+REZRHjeSAuNCvy66EU/gSqCpgVM3YnmPt4Akcocwtb8XMxt+jRZ1yzwM8LPtJrVR5kPy5EDZDOQLdZMJdh9FYj9ErijiaxQ51hk3/Xtyrq5QN20/lEqrS+9Y2O/ppPoTqbKRN00SmfSuVS6o45W0Pj8Me26Yk0rHhAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Lynn (finally free)</p>@chordbug</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">As a…<br>→ user with 2FA enabled<br><br>I want…<br>→ the 6-digit password field to have autocomplete<br><br>So that I can…<br>→ save time whenever I win the 2FA lottery</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/chordbug/status/1363963316696211461"><span aria-label="54 likes" class="social-embed-meta">❤️ 54</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-02-22T21:26:10.000Z" itemprop="datePublished">21:26 - Mon 22 February 2021</time></a></footer></blockquote>

<p>In fact, <a href="https://shkspr.mobi/blog/2014/09/2fa-best-practice-disable-autocomplete/">I've been ranting about this since 2014</a>.</p>

<p>Please - browser manufacturers and spec writers - do some user research to see if the feature you're developing is useful to real-life users.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=39881&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/08/should-browsers-remember-2fa-codes/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[That's not how 2FA works]]></title>
		<link>https://shkspr.mobi/blog/2021/01/thats-not-how-2fa-works/</link>
					<comments>https://shkspr.mobi/blog/2021/01/thats-not-how-2fa-works/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 17 Jan 2021 12:40:04 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[yubikey]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37855</guid>

					<description><![CDATA[Another day, another high-profile website cloned to phish credentials.  Tess Rinearson@_tessrIs this a phishing attempt? Goes to &#34;githubverification.com&#34; and asks for username and pw (if so, it nearly got me!) /cc @github pic.x.com/jgt4oNvjF2❤️ 2,243💬 111🔁 016:12 - Sat 16 January 2021  In the replies, you’ll see lots of techbros saying “this is why you should switch on 2FA people!!!”    Except, an…]]></description>
										<content:encoded><![CDATA[<p>Another day, another high-profile website cloned to phish credentials.</p>

<blockquote class="social-embed" id="social-embed-1350475941026390021" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/_tessr" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRsgBAABXRUJQVlA4ILwBAADQCgCdASowADAAPrVWn0ynJSKiJzgMkOAWiWwAtwEAOdojz4Dit6weKsrFgBpqLr5lNIAAGZ9qhrkbPuZAMFXr3bCH+SFpcod6cyHonnohjYTLXyf5WAlWh7N0buaoAAD+yteGTe+dVOl6PNPlENif8gRx+k2fibPxNlmeJc+OJz+THX+LCVWY9bJDWVkA28f4/mSbP5nKyDhAYczuKUZLm+yFo7eNTkqiZyoGgAv6az4c6vmQ99UDTSLkSzevfddVQldphLMnB4RFkNunok0lGZehci4WsFhgyCLw2A25Kn5gpsSjyg4IBVMS20XMok/0jfejZlhOPES2jLACnqBqYOzUy+uEAXwCYu+ZJVCCmBqZKzYdkyfBc11J55g0gaTxQEw18edjb5aGAYjraft1GAsdQMtvyqJQ1y/+RhHW9+U5SkJwP/RLe9lYf5f8o6wOgpb+mhXLZIHwm6sK635Jj7ToNsEF+TXdTUP9F0YcqPtUYi2+Rk30qGsHNex2Sa9K4qMgFRzMBnasWeRdfJx/cHa1LfPMWZTKewuDZbTT/bD0Wm19jqgP5ygI6Z4tihSJKr/kd/H+Rm74IAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Tess Rinearson</p>@_tessr</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Is this a phishing attempt? Goes to "<a href="http://githubverification.com">githubverification.com</a>" and asks for username and pw <br><br>(if so, it nearly got me!) <br><br>/cc <a href="https://twitter.com/github">@github</a> <a href="https://x.com/_tessr/status/1350475941026390021/photo/1">pic.x.com/jgt4oNvjF2</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/Er3aVnqW8AAZhrv.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a><a href="https://pbs.twimg.com/media/Er3aWf-XIAESPsx.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/_tessr/status/1350475941026390021"><span aria-label="2243 likes" class="social-embed-meta">❤️ 2,243</span><span aria-label="111 replies" class="social-embed-meta">💬 111</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-01-16T16:12:09.000Z" itemprop="datePublished">16:12 - Sat 16 January 2021</time></a></footer></blockquote>

<p>In the replies, you’ll see lots of techbros saying “this is why you should switch on 2FA people!!!”</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/01/2FA-people.png" alt="List of tweeters advocating for 2FA." width="1024" height="306" class="aligncenter size-full wp-image-37862">

<p>Except, and I hate to bring accuracy to a technical discussion, that’s <em>not</em> how 2FA works!</p>

<p>A second factor allows a site to better authenticate <em>you</em>. It does not help you identify the site.</p>

<p>If you log on to fake-bank.com, the scammers will immediately take your username and password and send it to real-bank.com – the fake bank will then ask you for your 2FA token. That could come via SMS, email, an authenticator app, or even post. Then the fake site uses your real token and logs in as you.</p>

<p>Game Over.</p>

<p>There is almost nothing you can do to authenticate that a site is legitimate.</p>

<ul>
<li>Any information that you can request from the real site can be proxied to the fake site.</li>
<li>The green SSL padlock means nothing for validity. Anyone can get one.</li>
<li>The top result on Google is invariably an advert for a scam site.</li>
</ul>

<p>Realistically the only thing you can do is look for “out of band” verification. What’s the URL stamped on your credit card? What’s written on the welcome letter sent by snail mail?</p>

<p>None of these are infallible – and they can all be manipulated by a suitably determined attacker.</p>

<p>The best defence is to use a password manager. I recommend the <a href="https://bitwarden.com/">open source Bit Warden</a>.</p>

<p>A password manager stores your passwords. But it <em>also</em> stores the web address of site’s login page. If you visit githu<em>d</em>, the password manager won’t prompt you to use the login details for githu<em>b</em>.</p>

<p>Defence in depth. Use 2FA to prevent attackers masquerading as you. And use a password manager to prevent fake sites masquerading as real sites.</p>

<h2 id="what-about-yubikeys"><a href="https://shkspr.mobi/blog/2021/01/thats-not-how-2fa-works/#what-about-yubikeys">What About YubiKeys?</a></h2>

<p>No. I'm <a href="https://shkspr.mobi/blog/2017/11/a-grumpy-look-at-using-a-yubico-neo-nfc-on-ubuntu-android/">not a big fan of YubiKeys</a>. In theory, a hardware token can help with this. You register the token with the device and it spits out a code only to the correct site.</p>

<p>But it has significant downsides.</p>

<ul>
<li>Cost. The average YubiKey is £50. There are a few around the £30 price point. That’s a huge expense given the small number of sites that support them.</li>
<li>Usability. Buy a device, register it, install the app, configure it, find the setting in the website, enable it, hope your machine has the right sort of USB ports, press the button at the right time. Take 10 minutes to watch a normal user try to set one up - then tell me if you think this is a good solution.</li>
<li>Convenience. My YubiKey is on my keyring. My keys are in my coat. My laptop is not near my coat. Given how often I need to log into things, it means adopting a significant change of habit. Or leaving my YubiKey plugged in all the time. Which leads to…</li>
<li>Risk. YubiKeys have no password lock of their own. At least my crumby Android has a fingerprint lock to prevent people getting my 2FA tokens. But if you’ve stolen my laptop and the YubiKey is plugged in, then you’ve got the keys to my kingdom.</li>
<li>Support. WebAuthn is a great standard – but only a few sites support it. While it is good at protecting a handful of sites, I encounter it so infrequently that I regularly forget how it works.</li>
</ul>

<p>While a WebAuthn request can't be proxied - there's nothing stopping a fake site from asking for your token, then rejecting it and asking for a separate factor.</p>

<p>If fake-github.com said "Hmmm we're having problems with our WebAuthn backend - please use a one-time code from your authenticator app for added security" would you be fooled?</p>

<p>WebAuthn and hardware tokens are probably the future. And they’re probably the best way we have to verify site legitimacy. But they’re also currently a poorly supported usability disaster.</p>

<p>Stay safe out there.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37855&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/01/thats-not-how-2fa-works/feed/</wfw:commentRss>
			<slash:comments>23</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I have 4% 2FA coverage]]></title>
		<link>https://shkspr.mobi/blog/2020/08/i-have-4-2fa-coverage/</link>
					<comments>https://shkspr.mobi/blog/2020/08/i-have-4-2fa-coverage/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 30 Aug 2020 11:37:44 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=36427</guid>

					<description><![CDATA[Last year, when doing some digital spring-cleaning, I realised that I had 800 different passwords.  I tried going through them, removing long-dead websites, closing old accounts, and deleting anything incriminating.  I now have 891 accounts.  Arse.  I also went through my 31 different 2FA accounts. Getting rid of old employers&#039; email tokens, failed crypto wallet providers, Club Penguin etc.  I…]]></description>
										<content:encoded><![CDATA[<p>Last year, when doing some digital spring-cleaning, I realised that <a href="https://shkspr.mobi/blog/2019/02/i-have-800-passwords/">I had 800 different passwords</a>.</p>

<p>I tried going through them, removing long-dead websites, closing old accounts, and deleting anything incriminating.  I now have 891 accounts.</p>

<p>Arse.</p>

<p>I also went through <a href="https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/">my 31 different 2FA accounts</a>. Getting rid of old employers' email tokens, failed crypto wallet providers, Club Penguin etc.  I now have 40 different TOTP tokens.</p>

<p>So, about 4% of my accounts have 2FA security.</p>

<p>I don't know if that's good or not.  It feels like it <em>ought</em> to be more, but I'm not sure if I want the administrative burden. Even with a password manager and OTP manager, it's a headache.</p>

<p>I do have a Yubikey (<a href="https://shkspr.mobi/blog/2017/11/a-grumpy-look-at-using-a-yubico-neo-nfc-on-ubuntu-android/">which I hate</a>) but so few services support it. And, frankly, it's pain trying to find it and shove it in a USB socket.</p>

<p>A few services, like Steam, use <a href="https://support.steampowered.com/kb_article.php?ref=4440-RTUI-9218">their own special 2FA app</a>. And some only offer 2FA via email or SMS. Yeuch!  Google has a fancy set of push notifications on Android - but that only works with Google accounts.</p>

<p>Is this a problem?</p>

<p>Any of my accounts which handle payments are tied to my credit cards or PayPal - so I don't care too much if someone cracks my password to Pizza Planet; there's limited damage they can do.</p>

<p>But there has to be a better solution. Things like WebAuthN look interesting - but I worry that they're too complicated for mere mortals to understand. And I'm worried about how fragile it is to have all your credentials tied up on one physical token.  And I'm worried that <a href="https://twitter.com/Lady_Ada_King/status/1298636803067588608">credentials are tied to your browser</a>.</p>

<p>So what's the solution?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=36427&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/08/i-have-4-2fa-coverage/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[My 2FA Code was 000 000!]]></title>
		<link>https://shkspr.mobi/blog/2020/03/my-2fa-code-was-000-000/</link>
					<comments>https://shkspr.mobi/blog/2020/03/my-2fa-code-was-000-000/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 10 Mar 2020 12:58:31 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=34392</guid>

					<description><![CDATA[I stared at my TOTP generator. Surely this must be a bug? Leap Year related? Or a cold-start error? Or some freaky prank? How could my login code be 000000?!?!  A standard TOTP code is normally 6 digits long. There are a million combinations, from 000000 to 999999.  A million isn&#039;t a particularly big number. A million seconds is about 12 days. A TOTP code changes every 30 seconds. Assuming the…]]></description>
										<content:encoded><![CDATA[<p>I stared at my TOTP generator. Surely this must be a bug? Leap Year related? Or a cold-start error? Or some freaky prank? How could my login code be <code>000000</code>?!?!</p>

<p>A standard <a href="https://tools.ietf.org/html/rfc6238">TOTP code</a> is normally 6 digits long. There are a million combinations, from <code>000000</code> to <code>999999</code>.</p>

<p>A million isn't a particularly big number. A million seconds is about 12 days. A TOTP code changes every 30 seconds. Assuming the codes are evenly distributed (a big assumption!) we should see every combination in half-a-million minutes. Rather pleasingly, that's about a year.</p>

<p>If, like me, you have far too many 2FA tokens, and you use them most days, then it shouldn't be surprising if you occasionally see "weird" codes.</p>

<h2 id="million-to-one-chances-crop-up-nine-times-out-of-ten"><a href="https://shkspr.mobi/blog/2020/03/my-2fa-code-was-000-000/#million-to-one-chances-crop-up-nine-times-out-of-ten">Million-to-one chances crop up nine times out of ten</a></h2>

<p>This comes down to how humans perceive randomness. Famously, Apple had to make its shuffle algorithm less random - people were complaining that it would sometimes consecutively play songs by the same artist. Sure, it is random, but it doesn't <em>feel</em> random.</p>

<p>What a human thinks of as perfect randomness is <em>not</em> the same as actual randomness.</p>

<p>In the novel <a href="https://en.wikipedia.org/wiki/Cryptonomicon">Cryptonomicon</a> - the perils of human-biases are made clear. A captured spy explains how their cover was blown:</p>

<blockquote><p>"The one-time pads for Detachment 2702 are being created by Mrs. Tenney, a vicars wife. She uses a bingo machine, a cage filled with wooden balls with a letter stamped on each ball. She is supposed to close her eyes before reaching into the cage. But suppose she has become sloppy and no longer closes her eyes when she reaches into it."</p></blockquote>

<h2 id="does-this-have-consequences"><a href="https://shkspr.mobi/blog/2020/03/my-2fa-code-was-000-000/#does-this-have-consequences">Does this have consequences?</a></h2>

<p>Assuming a user takes any notice of their 2FA codes, do they <em>feel more secure</em> if they regularly receive codes which look significant?</p>

<p>How freaked out would you be if your 2FA Code displayed your date of birth? Your phone number? Your employee ID? Your credit card PIN?</p>

<p>But if we try removing all possible "special" numbers, we end up fatally weakening security.</p>

<p>So, the next time you get a 2FA code which feels a bit weird, don't panic. Everything is fine. 
Trust the algorithm.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=34392&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/03/my-2fa-code-was-000-000/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I have Thirty-One 2FA codes]]></title>
		<link>https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/</link>
					<comments>https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 03 Mar 2019 13:38:26 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31621</guid>

					<description><![CDATA[Last week I wrote about how I had 800 passwords in my password manager.  It was intended to highlight the ridiculous proliferation of online services, and how redecentralising identity comes with a manageability problem.  I now want to talk about 2FA - Two-Factor Authentication - the random codes you have to type in every time you log in somewhere secure.  This week, I&#039;ve moved all my 2FA tokens…]]></description>
										<content:encoded><![CDATA[<p>Last week I wrote about how <a href="https://shkspr.mobi/blog/2019/02/i-have-800-passwords/">I had 800 passwords</a> in my password manager.  It was intended to highlight the ridiculous proliferation of online services, and how redecentralising identity comes with a manageability problem.</p>

<p>I now want to talk about 2FA - Two-Factor Authentication - the random codes you have to type in every time you log in somewhere secure.</p>

<p>This week, I've moved all my 2FA tokens from Authy, to the <a href="https://github.com/andOTP/andOTP">open source andOTP</a> app.  It was <a href="https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93#gistcomment-2224133">mostly painless exporting the Authy keys</a> - but took a while to manually check each one.  Do I <em>really</em> need this many 2FA tokens?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/03/otp-screenshot-fs8.png" alt="A long list of 2FA tokens." width="480" height="930" class="aligncenter size-full wp-image-31622">

<p>It's good that my webhost uses 2FA - but annoying that they have two separate ones for my account and my control panel.</p>

<p>I've got a bunch of Gmail accounts - it is frustrating scrolling through remembering which G-icon goes with which G-service.</p>

<p>There's a few different Microsoft ones because I'm not sure of the collateral damage if I try to link my Xbox, Skype, and Outlook accounts.</p>

<p>And the usual smattering of hardly-used services which offered 2FA, so I set it up.</p>

<p>Oh, and a few services which don't use standard TOTP - and insist on using their own app or hardware token.</p>

<h2 id="is-this-secure"><a href="https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/#is-this-secure">Is This Secure?</a></h2>

<p>I don't know any more.</p>

<p>In security, we usually talk about the benefits of having your security split between something you know (a password) and something you have (a token).  But I've effectively combined them.  My phone stores passwords and tokens. If someone steals it <em>and</em> can break through my biometrics &amp; PINs - they've got the keys to my kingdom.</p>

<p>If a crappy service has leaked a passwords, which I've reused elsewhere, then this 2FA set-up provides extra security.  But fewer than 5% of my online accounts support 2FA - so that's a minor benefit.</p>

<h2 id="the-alternative"><a href="https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/#the-alternative">The Alternative?</a></h2>

<p>I <a href="https://shkspr.mobi/blog/2017/11/a-grumpy-look-at-using-a-yubico-neo-nfc-on-ubuntu-android/">tried using a YubiKey</a> - and I just couldn't get on with it. The software was too flaky, hardly any services support it, and my keyring is rarely to hand.</p>

<p>So I'd have to keep an easy-to-lose physical token - as well as a phone for every service which doesn't support it.</p>

<h2 id="text-for-details"><a href="https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/#text-for-details">Text For Details</a></h2>

<p>As well as the codes in my app, I have a bunch of services which will <em>only</em> use <a href="https://www.theverge.com/2017/9/18/16328172/sms-two-factor-authentication-hack-password-bitcoin">insecure SMS</a> for 2FA:</p>

<ul>
<li><a href="https://www.linkedin.com/help/linkedin/answer/531">LinkedIn</a></li>
<li><a href="https://www.paypal.com/us/webapps/mpp/security/security-protections">PayPal</a></li>
<li><a href="https://www.americanexpress.com/uk/security/safekey/index.html">American Express</a></li>
</ul>

<p>Quite why these services are stuck in the dark-ages is beyond me. Possibly they just want my phone number for marketing purposes?</p>

<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/#whats-next">What's Next?</a></h2>

<p>The username / password / token pattern is becoming increasingly unsustainable for me. Having a multitude of security apps is marginally more convenient than carrying around a big bunch of keys. But it is frustrating find the right app, searching through for the right icon, typing things in before the timer expires, and proving my identity multiple times daily.</p>

<p>I could turn off 2FA and re-use the same username/password everywhere. That would be a hell of a lot easier for me. But I don't want to reduce my security that much!</p>

<p>I could sign in to everything using Facebook. But even if that weren't ethically dubious, not every service supports that.</p>

<p>Both Google and Authy have a useful service whereby they send a push notification to your phone and ask you to confirm your login. Cool, and easy to use. But, again, limited support and the same risk of my phone being the single point of failure.</p>

<p>What's the alternative? If you know - please leave me a message in the comments.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31621&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/03/i-have-thirty-one-2fa-codes/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Some thoughts on Amazon's 2FA]]></title>
		<link>https://shkspr.mobi/blog/2016/12/some-thoughts-on-amazons-2fa/</link>
					<comments>https://shkspr.mobi/blog/2016/12/some-thoughts-on-amazons-2fa/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 29 Dec 2016 12:06:02 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[2fa]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=24512</guid>

					<description><![CDATA[Amazon now let you secure your account with Two-Factor-Authentication (2FA). This means you can log on with a one-time password which changes every minute.  For some reason, Amazon call it Two-Step-Verification (2SV) - but it is exactly the same as all the other 2FA solutions.  The Process  There&#039;s no direct link to 2FA settings.  So the process is slightly convoluted.  Assuming you are signed in …]]></description>
										<content:encoded><![CDATA[<p>Amazon now let you secure your account with Two-Factor-Authentication (2FA). This means you can log on with a one-time password which changes every minute.  For some reason, Amazon call it Two-Step-Verification (2SV) - but it is exactly the same as all the other 2FA solutions.</p>

<h2 id="the-process"><a href="https://shkspr.mobi/blog/2016/12/some-thoughts-on-amazons-2fa/#the-process">The Process</a></h2>

<p>There's no <em>direct</em> link to 2FA settings.  So the process is slightly convoluted.  Assuming you are signed in to your Amazon account, you need to</p>

<ul>
<li>Go to <a href="https://www.amazon.co.uk/your-account">https://www.amazon.co.uk/your-account</a></li>
<li>Click on "Login &amp; Security Settings"</li>
<li>Then "Advanced Security Settings"</li>
</ul>

<p>You can now start to add 2FA to your account.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/12/amazon-2fa-fs8.png" alt="A screen from Amazon showing how to use 2FA" width="721" height="610" class="aligncenter size-full wp-image-24513">

<p>There are two ways you can get your 2FA code.  The most secure way is by using an authenticator app like <a href="https://www.authy.com/">Authy</a> or <a href="https://freeotp.github.io/">FreeOTP</a>.</p>

<p>If you can't install apps - or just don't like them - you can get your code delivered to you via SMS.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/12/Amazon-phone-format-fs8.png" alt="Amazon asking for your phone number, they use a weird format" width="490" height="316" class="aligncenter size-full wp-image-24514">

<p>Let's ignore the American number formatting (<a href="https://web.archive.org/web/20171222020924/https://www.youtube.com/watch?v=Tl1OAx9u1ok">555</a>!) - is an SMS code sensible?</p>

<ul>
<li>SMS works everywhere, even on the dumbest phone.</li>
<li>No app needed.</li>
<li>Swap your SIM to a new phone and have instant access.</li>
</ul>

<p>That last one is the biggest weakness. It is <em>terrifyingly</em> easy for a scammer to ring up your phone company and get your number swapped to a new SIM.  If a scammer wants the codes off your app they have to physically steal your phone and then unlock it (you do have a secure password, right?).  With SMS, all they have to do is convince some hapless call centre worker that you need your number transferred.</p>

<p>There's also the little matter that SMS isn't encrypted - but if the security services desperately want access to your Amazon account, I'm sure they have their own means.</p>

<h2 id="2fa-problems"><a href="https://shkspr.mobi/blog/2016/12/some-thoughts-on-amazons-2fa/#2fa-problems">2FA Problems</a></h2>

<p>Far from being a scrappy start-up, Amazon is now a maze of interconnected legacy systems.  There are several ancient services with Amazon can't or won't update.  This means they don't get 2FA support.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/12/Amazon-2fa-problems-fs8.png" alt="Some of Amazon's apps don't support 2FA" width="724" height="505" class="aligncenter size-full wp-image-24516">

<p>This is a <a href="https://shkspr.mobi/blog/2016/06/paypal-doesnt-care-about-security/">problem which I recently encountered with PayPal</a>.  Old apps don't support new security - weakening the usefulness of security for everyone.</p>

<p>Of course, there's no mention of <em>which</em> apps don't support 2FA.  Their proposed solution of sticking your 2FA code to the end of your password is... interesting.  It implies that if the system doesn't recognise your password decrypted password, it will split it in two and try it again. I wonder if that leaves them open to subtle timing attacks, or any other issues?</p>

<p>The point of 2FA is that you use it <em>everywhere</em> - otherwise you're introducing a weak point in your security. Amazon will happily let you turn off 2FA on specific devices.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/12/Amazon-2FA-skip-codes-fs8.png" alt="A screen letting you know that you can disable 2FA on specific devices." width="723" height="170" class="aligncenter size-full wp-image-24515">

<p>I can <em>kinda</em> see their reasoning. It is annoying to be forced into using the 2FA on your regular handset. But that's also the point. Making it slightly harder for us makes it <em>extraordinarily</em> hard for an attacker.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/12/Amazon-Phone-Login-fs8.png" alt="A mobile phone screen showing the Amazon login page, there is an option to disable 2FA" width="480" height="523" class="aligncenter size-full wp-image-24518">

<p>Despite these shortcomings, I urge you to switch on 2FA. Amazon holds a <a href="https://medium.com/@espringe/amazon-s-customer-service-backdoor-be375b3428c4#.lfbb3yppi">surprising amount of your personal data</a> - and <a href="https://www.wired.com/2012/08/apple-amazon-mat-honan-hacking/">the consequences of your Amazon account being hacked can be dire</a>.</p>

<p>There are <a href="https://twofactorauth.org/">hundreds of sites which support 2FA</a>. You should make sure you use it wherever possible.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=24512&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2016/12/some-thoughts-on-amazons-2fa/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
