
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/" rel="self" type="application/rss+xml"/>
        <language>en-us</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Wed, 08 Apr 2026 10:40:52 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Introducing Ephemeral IDs: a new tool for fraud detection]]></title>
            <link>https://blog.cloudflare.com/turnstile-ephemeral-ids-for-fraud-detection/</link>
            <pubDate>Mon, 23 Sep 2024 13:00:00 GMT</pubDate>
            <description><![CDATA[ As the Internet evolves, Turnstile does too. Introducing Ephemeral IDs — a new dimension in detecting fraudulent activity, bot or human, that links behavior to a specific client instead of an IP address. This makes Turnstile better for everyone, everywhere. 
 ]]></description>
            <content:encoded><![CDATA[ <p>In the early days of the Internet, a single IP address was a reliable indicator of a single user. However, today’s Internet is more complex. Shared IP addresses are now common, with users connecting via mobile IP address pools, VPNs, or behind <a href="https://en.wikipedia.org/wiki/Carrier-grade_NAT"><u>CGNAT (Carrier Grade Network Address Translation)</u></a>. This makes relying on IP addresses alone a weak method to combat modern threats like automated attacks and fraudulent activity. Additionally, many Internet users have no option but to use an IP address which they don’t have sole control over, and as such, <a href="https://blog.cloudflare.com/consequences-of-ip-blocking/"><u>should not be penalized for that</u></a>.</p><p>At Cloudflare, we are solving this complexity with <a href="https://developers.cloudflare.com/turnstile/"><u>Turnstile</u></a>, our <a href="https://blog.cloudflare.com/turnstile-private-captcha-alternative/"><u>CAPTCHA alternative</u></a>. And now, we’re taking the next step in advancing security with Ephemeral IDs, a new feature that generates a unique short-lived ID, without relying on any network-level information.</p><p>When a website visitor interacts with Turnstile, we now calculate an Ephemeral ID that can link behavior to a specific client instead of an IP address. This means that even when attackers rotate through large pools of IP addresses, we can still identify and block malicious actions. For example, in attacks like <a href="https://www.cloudflare.com/learning/bots/what-is-credential-stuffing/"><u>credential stuffing</u></a> or account signups, where fraudsters attempt to disguise themselves using different IP addresses, Ephemeral IDs allow us to detect abuse patterns more accurately beyond just determining whether the visitor is a human or a bot. Multiple fraudulent actions from the same client are grouped together, improving our detection rate while reducing false positives.</p>
    <div>
      <h3>How Ephemeral IDs work</h3>
      <a href="#how-ephemeral-ids-work">
        
      </a>
    </div>
    <p>Turnstile detects bots by analyzing browser attributes and signals. Using these aggregated client-side signals, we generate a short-lived Ephemeral ID without setting any cookies or using similar client-side storage. These IDs are intentionally not 100% unique and have a brief lifespan, making them highly effective in identifying patterns of fraud and abuse, without compromising user privacy.</p><p>When the same visitor interacts with Turnstile widgets from different Cloudflare customers, they receive different Ephemeral IDs for each one. Additionally, because these IDs change frequently, they cannot be used to track a single visitor over multiple days.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2uGotegS95KA9Ea5qRsQgs/71f01ce9c9a8096e7c64cdfc470ddeb0/BLOG-2548_2.png" />
          </figure><p><sub><i>Blue: A single IP address | Green: A single Ephemeral ID</i></sub><sub>
</sub><sub><i>The bigger the node, the more frequently seen that ID or IP address was in our dataset.</i></sub></p><p>The graphic above illustrates the complex reality of the modern Internet, where the relationship between clients and IP addresses is far from a simple one-to-one mapping. While some straightforward mappings still exist, they are no longer the norm.</p><p>During a period where a site or service is under attack, we observe a “nest” of highly correlated Ephemeral IDs. In the example below, the correlation is based on both Ephemeral ID and IP address.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5Rk4QXW1nkrrIk46XgzXdA/52739f21e6a00643a511de77b47142f1/BLOG-2548_3.png" />
          </figure><p><sub><i>Nest in the center of the diagram visualizes thousands of IP addresses (blue) which are correlated by the commonly identified Ephemeral IDs (green). The bigger the node, the more frequently seen that ID or IP address was in our dataset.</i></sub></p><p>This is real-world data showing fraudulent activity on one of Cloudflare’s public-facing forms. Even with access to a broad range of IP addresses, attackers struggle to completely disguise their requests because Ephemeral IDs are generated based on patterns beyond IP addresses. This means that even if they rotate addresses, the underlying client characteristics are still detected, making it harder for them to evade our security measures. This makes it easier for us to group these requests and apply appropriate business logic, whether that means discarding the requests, requiring further validation, enforcing <a href="https://www.cloudflare.com/learning/access-management/what-is-multi-factor-authentication/"><u>multi-factor authentication (MFA)</u></a>, or other actions. </p><p>This new client identification technology seamlessly integrates into the broader advancements we’ve made to Turnstile over the past year. Whether you’re protecting <a href="https://developers.cloudflare.com/turnstile/tutorials/login-pages/"><u>login forms</u></a>, signup pages, or high value transactions, you’ll immediately benefit from this extra layer of abuse detection <b>without needing to change a single line of code</b>. We’ll take care of all the heavy lifting and analysis behind the scenes, and our system will continue to improve its accuracy and effectiveness over time.</p><p>What does this mean for you? Starting today, <a href="https://www.cloudflare.com/products/turnstile/"><u>Turnstile</u></a> will go beyond just identifying bots. <b>All</b> <b>websites protected by Turnstile will automatically benefit</b> from the integration of Ephemeral IDs into our detection logic. This means we can more effectively identify and penalize offending clients without impacting other users on the same network, or IP address, improving security and user experience for everyone.</p>
    <div>
      <h3>Ephemeral IDs in action</h3>
      <a href="#ephemeral-ids-in-action">
        
      </a>
    </div>
    <p>Everyone benefits from the addition of Ephemeral IDs to the Challenge Platform, but for those who want to use it beyond that, the Ephemeral ID is available through the Turnstile <a href="https://developers.cloudflare.com/turnstile/get-started/server-side-validation/"><u>siteverify</u></a> response. A practical use case for Ephemeral IDs is preventing fraudulent account signups. Imagine a bad actor, a real person using a real device, creating hundreds of fake accounts while rotating IP addresses to avoid detection. By ingesting Ephemeral IDs and logging them alongside your account creation logs, you can set up alerts based on account creation thresholds in real-time or retroactively investigate suspicious activity. Even though Ephemeral IDs are short-lived and may have changed by the time an investigation begins, they still provide valuable insights through aggregate analysis, and provide an extra dimension to identify fraud and abuse.</p><p>For our <b>Turnstile Enterprise </b>and<b> Bot Management Enterprise </b>customers, you now have the option to access Ephemeral IDs directly through the Turnstile siteverify response. Get in touch with your Account Executive to enable it on your account.</p><p>Below is an example of <a href="https://developers.cloudflare.com/turnstile/get-started/server-side-validation/"><u>siteverify</u></a> response for those who have enabled Ephemeral IDs.</p>
            <pre><code>curl 'https://challenges.cloudflare.com/turnstile/v0/siteverify' --data 'secret=verysecret&amp;response=&lt;RESPONSE&gt;'</code></pre>
            
            <pre><code>{
    "success": true,
    "error-codes": [],
    "challenge_ts": "2024-09-10T17:29:00.463Z",
    "hostname": "example.com",
    "metadata": {
        "ephemeral_id": "x:9f78e0ed210960d7693b167e"
    }
}
</code></pre>
            
    <div>
      <h2>What’s next for Turnstile?</h2>
      <a href="#whats-next-for-turnstile">
        
      </a>
    </div>
    <p>We launched Turnstile with a bold mission: to redefine CAPTCHAs with a frictionless, privacy-first solution that eliminates the annoyance of picking puzzles, selecting stoplights, and clicking crosswalks to prove our humanity. It’s incredible to think that Turnstile has been generally available for a whole year now! During this time, it has blocked over <b>one trillion bots</b>, and is actively protecting more than <b>350,000 domains</b> worldwide.</p><p>As we celebrate Turnstile’s second birthday, we’re proud of the progress we’ve made and thrilled to introduce our latest innovations. While Ephemeral IDs represent the newest evolution of Turnstile, they’re part of our ongoing commitment to continuous improvement. Over the past year, we’ve also introduced a <a href="https://blog.cloudflare.com/guide-to-cloudflare-pages-and-turnstile-plugin/"><u>Cloudflare Pages Plugin</u></a> and partnered with <a href="https://developers.cloudflare.com/turnstile/extensions/google-firebase/"><u>Google Firebase</u></a>, ensuring that developers have easy access to Turnstile.</p><p>Earlier this year, we also launched <a href="https://blog.cloudflare.com/integrating-turnstile-with-the-cloudflare-waf-to-challenge-fetch-requests/"><u>Pre-Clearance</u></a> for Turnstile, integrating it with Cloudflare WAF’s Challenge action, making it easier for customers to use Cloudflare’s Application Security products together. If you want to learn more about how to use Turnstile with Cloudflare’s Bot Management and WAF in more detail, check it out <a href="https://developers.cloudflare.com/turnstile/tutorials/integrating-turnstile-waf-and-bot-management"><u>here</u></a>!</p><p>We’re incredibly excited about what’s ahead. The introduction of Ephemeral IDs is just one of many innovations on the horizon. We’re committed to making the Internet a safer, more private place for everyone, eliminating the need for frustrating CAPTCHA puzzles while keeping security our top priority. And with our free tier remaining open and unlimited for all, there’s no barrier to getting started with Turnstile today.</p><p>Join us in revolutionizing online security –<b> </b><a href="https://developers.cloudflare.com/turnstile/get-started/"><b><u>get started with Turnstile</u></b></a><b> </b>now or dive straight into our<b> </b><a href="https://developers.cloudflare.com/turnstile/tutorials/"><b><u>how-to guides</u></b></a>. Let’s help make the Internet a better place, together!</p> ]]></content:encoded>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Turnstile]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Bots]]></category>
            <category><![CDATA[Privacy]]></category>
            <category><![CDATA[Network Services]]></category>
            <guid isPermaLink="false">6V6W6JxQO7bnM0CbhuO1OA</guid>
            <dc:creator>Oliver Payne</dc:creator>
            <dc:creator>Sally Lee</dc:creator>
            <dc:creator>Benedikt Wolters</dc:creator>
        </item>
        <item>
            <title><![CDATA[Building secure websites: a guide to Cloudflare Pages and Turnstile Plugin]]></title>
            <link>https://blog.cloudflare.com/guide-to-cloudflare-pages-and-turnstile-plugin/</link>
            <pubDate>Thu, 07 Mar 2024 14:00:52 GMT</pubDate>
            <description><![CDATA[ Learn how to use Cloudflare Pages and Turnstile to deploy your website quickly and easily while protecting it from bots, without compromising user experience. Follow our tutorial here for a seamless integration ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2K7WFOjmj3tTCZ2C90XOzp/1fd9487aaaf44a7b6f853f82f9e2be5f/image1-26.png" />
            
            </figure><p>Balancing developer velocity and security against bots is a constant challenge. Deploying your changes as quickly and easily as possible is essential to stay ahead of your (or your customers’) needs and wants. Ensuring your website is safe from malicious bots — without degrading user experience with alien hieroglyphics to decipher just to prove that you are a human — is no small feat. With <a href="https://pages.cloudflare.com/">Pages</a> and <a href="https://developers.cloudflare.com/turnstile/">Turnstile</a>, we'll walk you through just how easy it is to have the best of both worlds!</p><p><a href="https://pages.cloudflare.com/">Cloudflare Pages</a> offer a seamless platform for deploying and scaling your websites with ease. You can get started right away with configuring your websites with a quick integration using your git provider, and get set up with unlimited requests, bandwidth, collaborators, and projects.</p><p>Cloudflare Turnstile is Cloudflare’s <a href="https://www.cloudflare.com/products/turnstile/">CAPTCHA alternative solution</a> where your users don’t ever have to solve another puzzle to get to your website, no more stop lights and fire hydrants. You can protect your site without having to put your users through an annoying user experience. If you are already using another CAPTCHA service, we have made it easy for you to <a href="https://developers.cloudflare.com/turnstile/migration/">migrate over to Turnstile</a> with minimal effort needed. Check out the <a href="https://developers.cloudflare.com/turnstile/">Turnstile documentation</a> to get started.</p>
    <div>
      <h3>Alright, what are we building?</h3>
      <a href="#alright-what-are-we-building">
        
      </a>
    </div>
    <p>In this tutorial, we'll walk you through integrating Cloudflare Pages with Turnstile to secure your website against bots. You'll learn how to deploy Pages, embed the Turnstile widget, validate the token on the server side, and monitor Turnstile analytics. Let’s build upon <a href="https://developers.cloudflare.com/pages/tutorials/forms/">this tutorial</a> from Cloudflare’s developer docs, which outlines how to create an HTML form with Pages and Functions. We’ll also show you how to secure it by integrating with Turnstile, complete with client-side rendering and server-side validation, using the <a href="https://developers.cloudflare.com/pages/functions/plugins/turnstile/">Turnstile Pages Plugin</a>!</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4DaVCMwbVOKW17aOgthwZh/f756f3466f64bc4f889a5b9ea497b910/Screenshot-2024-03-07-at-11.52.43.png" />
            
            </figure>
    <div>
      <h3>Step 1: Deploy your Pages</h3>
      <a href="#step-1-deploy-your-pages">
        
      </a>
    </div>
    <p>On the Cloudflare Dashboard, select your account and go to Workers &amp; Pages to create a new Pages application with your git provider. Choose the repository where you cloned the tutorial project or any other repository that you want to use for this walkthrough.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5kZP90IyFiaZzl7fX608Dl/355af9d8c998c19e0c032df65d14c324/image2-23.png" />
            
            </figure><p>The Build settings for this project is simple:</p><ul><li><p><b>Framework preset</b>: None</p></li><li><p><b>Build command</b>: npm install @cloudflare/pages-plugin-turnstile</p></li><li><p><b>Build output directory</b>: public</p></li></ul><p>Once you select “Save and Deploy”, all the magic happens under the hood and voilà! The form is already deployed.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6I301dY7rRKreWxUwEuHs/7ea859c666d3c04b39c139c47d3b1c7f/image8-3.png" />
            
            </figure>
    <div>
      <h3>Step 2: Embed Turnstile widget</h3>
      <a href="#step-2-embed-turnstile-widget">
        
      </a>
    </div>
    <p>Now, let’s navigate to Turnstile and add the newly created Pages site.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5BadX97G4W7s5FUuMx82MV/891f196d7f6840d7773684c13d9173ab/image5-14.png" />
            
            </figure><p>Here are the widget configuration options:</p><ul><li><p><b>Domain</b>: All you need to do is add the domain for the Pages application. In this example, it’s “pages-turnstile-demo.pages.dev”. For each deployment, Pages generates a <a href="https://developers.cloudflare.com/pages/configuration/preview-deployments/">deployment specific preview</a> subdomain. Turnstile covers all subdomains automatically, so your Turnstile widget will work as expected even in your previews. This is covered more extensively in our <a href="https://developers.cloudflare.com/turnstile/reference/domain-management/">Turnstile domain management documentation</a>.</p></li><li><p><b>Widget Mode</b>: There are three types of <a href="https://developers.cloudflare.com/turnstile/reference/widget-types/">widget modes</a> you can choose from.</p></li><li><p><b>Managed</b>: This is the recommended option where Cloudflare will decide when further validation through the checkbox interaction is required to confirm whether the user is a human or a bot. This is the mode we will be using in this tutorial.</p></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/78AnsttFltsSDTWMXxFjnH/d1ee443938d095a4d44874607c046760/Screenshot-2024-03-07-at-11.54.30.png" />
            
            </figure><ul><li><p><b>Non-interactive</b>: This mode does not require the user to interact and check the box of the widget. It is a non-intrusive mode where the widget is still visible to users but requires no added step in the user experience.</p></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2EAIzU3P7JhQKFteYXb4Hq/1b39212a5393124a081bef94c7d9a07d/Screenshot-2024-03-07-at-11.55.00.png" />
            
            </figure><ul><li><p><b>Invisible</b>: Invisible mode is where the widget is not visible at all to users and runs in the background of your website.</p></li><li><p><b>Pre-Clearance setting</b>: With a clearance cookie issued by the Turnstile widget, you can configure your website to verify every single request or once within a session. To learn more about <a href="/integrating-turnstile-with-the-cloudflare-waf-to-challenge-fetch-requests">implementing pre-clearance with Turnstile</a>, check out this blog post.</p></li></ul><p>Once you create your widget, you will be given a sitekey and a secret key. The sitekey is public and used to invoke the Turnstile widget on your site. The secret key should be stored safely for security purposes.</p><p>Let’s embed the widget above the Submit button. Your index.html should look like this:</p>
            <pre><code>&lt;!doctype html&gt;
&lt;html lang="en"&gt;
	&lt;head&gt;
		&lt;meta charset="utf8"&gt;
		&lt;title&gt;Cloudflare Pages | Form Demo&lt;/title&gt;
		&lt;meta name="theme-color" content="#d86300"&gt;
		&lt;meta name="mobile-web-app-capable" content="yes"&gt;
		&lt;meta name="apple-mobile-web-app-capable" content="yes"&gt;
		&lt;meta name="viewport" content="width=device-width,initial-scale=1"&gt;
		&lt;link rel="icon" type="image/png" href="https://www.cloudflare.com/favicon-128.png"&gt;
		&lt;link rel="stylesheet" href="/index.css"&gt;
		&lt;script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=_turnstileCb" defer&gt;&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;

		&lt;main&gt;
			&lt;h1&gt;Demo: Form Submission&lt;/h1&gt;

			&lt;blockquote&gt;
				&lt;p&gt;This is a demonstration of Cloudflare Pages with Turnstile.&lt;/p&gt;
				&lt;p&gt;Pages deployed a &lt;code&gt;/public&lt;/code&gt; directory, containing a HTML document (this webpage) and a &lt;code&gt;/functions&lt;/code&gt; directory, which contains the Cloudflare Workers code for the API endpoint this &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; references.&lt;/p&gt;
				&lt;p&gt;&lt;b&gt;NOTE:&lt;/b&gt; On form submission, the API endpoint responds with a JSON representation of the data. There is no JavaScript running in this example.&lt;/p&gt;
			&lt;/blockquote&gt;

			&lt;form method="POST" action="/api/submit"&gt;
				&lt;div class="input"&gt;
					&lt;label for="name"&gt;Full Name&lt;/label&gt;
					&lt;input id="name" name="name" type="text" /&gt;
				&lt;/div&gt;

				&lt;div class="input"&gt;
					&lt;label for="email"&gt;Email Address&lt;/label&gt;
					&lt;input id="email" name="email" type="email" /&gt;
				&lt;/div&gt;

				&lt;div class="input"&gt;
					&lt;label for="referers"&gt;How did you hear about us?&lt;/label&gt;
					&lt;select id="referers" name="referers"&gt;
						&lt;option hidden disabled selected value&gt;&lt;/option&gt;
						&lt;option value="Facebook"&gt;Facebook&lt;/option&gt;
						&lt;option value="Twitter"&gt;Twitter&lt;/option&gt;
						&lt;option value="Google"&gt;Google&lt;/option&gt;
						&lt;option value="Bing"&gt;Bing&lt;/option&gt;
						&lt;option value="Friends"&gt;Friends&lt;/option&gt;
					&lt;/select&gt;
				&lt;/div&gt;

				&lt;div class="checklist"&gt;
					&lt;label&gt;What are your favorite movies?&lt;/label&gt;
					&lt;ul&gt;
						&lt;li&gt;
							&lt;input id="m1" type="checkbox" name="movies" value="Space Jam" /&gt;
							&lt;label for="m1"&gt;Space Jam&lt;/label&gt;
						&lt;/li&gt;
						&lt;li&gt;
							&lt;input id="m2" type="checkbox" name="movies" value="Little Rascals" /&gt;
							&lt;label for="m2"&gt;Little Rascals&lt;/label&gt;
						&lt;/li&gt;
						&lt;li&gt;
							&lt;input id="m3" type="checkbox" name="movies" value="Frozen" /&gt;
							&lt;label for="m3"&gt;Frozen&lt;/label&gt;
						&lt;/li&gt;
						&lt;li&gt;
							&lt;input id="m4" type="checkbox" name="movies" value="Home Alone" /&gt;
							&lt;label for="m4"&gt;Home Alone&lt;/label&gt;
						&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/div&gt;
				&lt;div id="turnstile-widget" style="padding-top: 20px;"&gt;&lt;/div&gt;
				&lt;button type="submit"&gt;Submit&lt;/button&gt;
			&lt;/form&gt;
		&lt;/main&gt;
	&lt;script&gt;
	// This function is called when the Turnstile script is loaded and ready to be used.
	// The function name matches the "onload=..." parameter.
	function _turnstileCb() {
	    console.debug('_turnstileCb called');

	    turnstile.render('#turnstile-widget', {
	      sitekey: '0xAAAAAAAAAXAAAAAAAAAAAA',
	      theme: 'light',
	    });
	}
	&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;</code></pre>
            <p>You can embed the Turnstile widget implicitly or explicitly. In this tutorial, we will explicitly embed the widget by injecting the JavaScript tag and related code, then specifying the placement of the widget.</p>
            <pre><code>&lt;script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=_turnstileCb" defer&gt;&lt;/script&gt;</code></pre>
            
            <pre><code>&lt;script&gt;
	function _turnstileCb() {
	    console.debug('_turnstileCb called');

	    turnstile.render('#turnstile-widget', {
	      sitekey: '0xAAAAAAAAAXAAAAAAAAAAAA',
	      theme: 'light',
	    });
	}
&lt;/script&gt;</code></pre>
            <p>Make sure that the <code>div id</code> you assign is the same as the <code>id</code> you specify in <code>turnstile.render</code> call. In this case, let’s use <code>“turnstile-widget”</code>. Once that’s done, you should see the widget show up on your site!</p>
            <pre><code>&lt;div id="turnstile-widget" style="padding-top: 20px;"&gt;&lt;/div&gt;</code></pre>
            
    <div>
      <h3>Step 3: Validate the token</h3>
      <a href="#step-3-validate-the-token">
        
      </a>
    </div>
    <p>Now that the Turnstile widget is rendered on the front end, let’s validate it on the server side and check out the Turnstile outcome. We need to make a call to the <code>/siteverify</code> API with the token in the submit function under <code>./functions/api/submit.js</code>.</p><p>First, grab the token issued from Turnstile under cf-turnstile-response. Then, call the <code>/siteverify</code> API to ensure that the token is valid. In this tutorial, we’ll attach the Turnstile outcome to the response to verify everything is working well. You can decide on the expected behavior and where to direct the user based on the <code>/siteverify</code> response.</p>
            <pre><code>/**
 * POST /api/submit
 */

import turnstilePlugin from "@cloudflare/pages-plugin-turnstile";

// This is a demo secret key. In prod, we recommend you store
// your secret key(s) safely. 
const SECRET_KEY = '0x4AAAAAAASh4E5cwHGsTTePnwcPbnFru6Y';

export const onRequestPost = [
    turnstilePlugin({
    	secret: SECRET_KEY,
    }),
    (async (context) =&gt; {
    	// Request has been validated as coming from a human
    	const formData = await context.request.formData()

    	var tmp, outcome = {};
	for (let [key, value] of formData) {
		tmp = outcome[key];
		if (tmp === undefined) {
			outcome[key] = value;
		} else {
			outcome[key] = [].concat(tmp, value);
		}
	}

	// Attach Turnstile outcome to the response
	outcome["turnstile_outcome"] = context.data.turnstile;

	let pretty = JSON.stringify(outcome, null, 2);

      	return new Response(pretty, {
      		headers: {
      			'Content-Type': 'application/json;charset=utf-8'
      		}
      	});
    })
];</code></pre>
            <p>Since Turnstile accurately decided that the visitor was not a bot, the response for “success” is “true” and “interactive” is “false”. The “interactive” being “false” means that the checkbox was automatically checked by Cloudflare as the visitor was determined to be human. The user was seamlessly allowed access to the website without having to perform any additional actions. If the visitor looks suspicious, Turnstile will become interactive, requiring the visitor to actually click the checkbox to verify that they are not a bot. We used the managed mode in this tutorial but depending on your application logic, you can choose the widget mode that works best for you.</p>
            <pre><code>{
  "name": "Sally Lee",
  "email": "sallylee@cloudflare.com",
  "referers": "Facebook",
  "movies": "Space Jam",
  "cf-turnstile-response": "0._OHpi7JVN7Xz4abJHo9xnK9JNlxKljOp51vKTjoOi6NR4ru_4MLWgmxt1rf75VxRO4_aesvBvYj8bgGxPyEttR1K2qbUdOiONJUd5HzgYEaD_x8fPYVU6uZPUCdWpM4FTFcxPAnqhTGBVdYshMEycXCVBqqLVdwSvY7Me-VJoge7QOStLOtGgQ9FaY4NVQK782mpPfgVujriDAEl4s5HSuVXmoladQlhQEK21KkWtA1B6603wQjlLkog9WqQc0_3QMiBZzZVnFsvh_NLDtOXykOFK2cba1mLLcADIZyhAho0mtmVD6YJFPd-q9iQFRCMmT2Sz00IToXz8cXBGYluKtxjJrq7uXsRrI5pUUThKgGKoHCGTd_ufuLDjDCUE367h5DhJkeMD9UsvQgr1MhH3TPUKP9coLVQxFY89X9t8RAhnzCLNeCRvj2g-GNVs4-MUYPomd9NOcEmSpklYwCgLQ.jyBeKkV_MS2YkK0ZRjUkMg.6845886eb30b58f15de056eeca6afab8110e3123aeb1c0d1abef21c4dd4a54a1",
  "turnstile_outcome": {
    "success": true,
    "error-codes": [],
    "challenge_ts": "2024-02-28T22:52:30.009Z",
    "hostname": "pages-turnstile-demo.pages.dev",
    "action": "",
    "cdata": "",
    "metadata": {
      "interactive": false
    }
  }
}</code></pre>
            
    <div>
      <h3>Wrapping up</h3>
      <a href="#wrapping-up">
        
      </a>
    </div>
    <p>Now that we've set up Turnstile, we can head to Turnstile analytics in the <a href="https://dash.cloudflare.com/?to=/:account/turnstile">Cloudflare Dashboard</a> to monitor the <a href="https://developers.cloudflare.com/turnstile/reference/tooltips/">solve rate</a> and widget traffic. Visitor Solve Rate indicates the percentage of visitors who successfully completed the Turnstile widget. A sudden drop in the Visitor Solve Rate could indicate an increase in bot traffic, as bots may fail to complete the challenge presented by the widget. API Solve Rate measures the percentage of visitors who successfully validated their token against the <code>/siteverify</code> API. Similar to the Visitor Solve Rate, a significant drop in the API Solve Rate may indicate an increase in bot activity, as bots may fail to validate their tokens. Widget Traffic provides insights into the nature of the traffic hitting your website. A high number of challenges requiring interaction may suggest that bots are attempting to access your site, while a high number of unsolved challenges could indicate that the Turnstile widget is effectively blocking suspicious traffic.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6LS7efg5RG5VVEE9VVh41n/0c4f7feaeb2c693ea47df2229efa2091/image6-4.png" />
            
            </figure>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4rZfKrfY91tTRuCvJgFFHU/3a689f0b7a066d2d85fb09725859bd20/image9-1.png" />
            
            </figure><p>And that’s it! We’ve walked you through how to easily secure your Pages with Turnstile. Pages and Turnstile are currently available for free for every Cloudflare user to get started right away. If you are looking for a seamless and speedy developer experience to get a secure website up and running, protected by Turnstile, head over to the <a href="https://dash.cloudflare.com/?to=/:account/turnstile">Cloudflare Dashboard</a> today!</p> ]]></content:encoded>
            <category><![CDATA[Security Week]]></category>
            <category><![CDATA[Turnstile]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Cloudflare Pages]]></category>
            <category><![CDATA[Bots]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <guid isPermaLink="false">1XOUeKfqYNFTbbeERuAxAg</guid>
            <dc:creator>Sally Lee</dc:creator>
        </item>
        <item>
            <title><![CDATA[Integrating Turnstile with the Cloudflare WAF to challenge fetch requests]]></title>
            <link>https://blog.cloudflare.com/integrating-turnstile-with-the-cloudflare-waf-to-challenge-fetch-requests/</link>
            <pubDate>Mon, 18 Dec 2023 14:00:17 GMT</pubDate>
            <description><![CDATA[ By editing or creating a new Turnstile widget with “Pre-Clearance” enabled, Cloudflare customers can now use Turnstile to issue a challenge when a page’s HTML loads, and enforce that all valid responses have a valid Turnstile token ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3UV6CnIMI92jBmCr4VeqCU/98b0de9d9ca221f3d60bc7d02213264c/image8.png" />
            
            </figure><p>Two months ago, we made Cloudflare Turnstile <a href="/turnstile-ga/">generally available</a> — giving website owners everywhere an easy way to fend off bots, without ever issuing a CAPTCHA. Turnstile allows any website owner to embed a frustration-free Cloudflare challenge on their website with a simple code snippet, making it easy to help ensure that only human traffic makes it through. In addition to protecting a website’s frontend, Turnstile also empowers web administrators to harden browser-initiated (AJAX) API calls running under the hood. These APIs are commonly used by dynamic single-page web apps, like those created with React, Angular, Vue.js.</p><p>Today, we’re excited to announce that we have integrated Turnstile with the <a href="https://www.cloudflare.com/application-services/products/waf/">Cloudflare Web Application Firewall (WAF)</a>. This means that web admins can add the Turnstile code snippet to their websites, and then configure the Cloudflare WAF to manage these requests. This is completely customizable using WAF Rules; for instance, you can allow a user authenticated by Turnstile to interact with all of an application’s API endpoints without facing any further challenges, or you can configure certain sensitive endpoints, like Login, to always issue a challenge.</p>
    <div>
      <h3>Challenging fetch requests in the Cloudflare WAF</h3>
      <a href="#challenging-fetch-requests-in-the-cloudflare-waf">
        
      </a>
    </div>
    <p>Millions of websites protected by Cloudflare’s WAF leverage our JS Challenge, Managed Challenge, and Interactive Challenge to stop bots while letting humans through. For each of these challenges, Cloudflare intercepts the matching request and responds with an HTML page rendered by the browser, where the user completes a basic task to demonstrate that they’re human. When a user successfully completes a challenge, they receive a <a href="https://developers.cloudflare.com/fundamentals/reference/policies-compliances/cloudflare-cookies/#additional-cookies-used-by-the-challenge-platform">cf_clearance cookie</a>, which tells Cloudflare that a user has successfully passed a challenge, the type of challenge, and when it was completed. A clearance cookie can’t be shared between users, and is only valid for the time set by the Cloudflare customer in their Security Settings dashboard.</p><p>This process works well, except when a browser receives a challenge on a fetch request and the browser has not previously passed a challenge. On a fetch request, or an XML HTTP Request (XHR), the browser expects to get back simple text (in JSON or XML formats) and cannot render the HTML necessary to run a challenge.</p><p>As an example, let’s imagine a pizzeria owner who built an online ordering form in React with a payment page that submits data to an API endpoint that processes payments. When a user views the web form to add their credit card details they can pass a Managed Challenge, but when the user submits their credit card details by making a fetch request, the browser won’t execute the code necessary for a challenge to run. The pizzeria owner’s only option for handling suspicious (but potentially legitimate) requests is to block them, which runs the risk of false positives that could cause the restaurant to lose a sale.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7fOg2KPmEgB5nyeywCc0X0/8ddf84d382f902ad633fb30a3f8226a2/Group-3955.png" />
            
            </figure><p>This is where Turnstile can help. Turnstile allows anyone on the Internet to embed a Cloudflare challenge anywhere on their website. Before today, the output of Turnstile was only a one-time use token. To enable customers to issue challenges for these fetch requests, Turnstile can now issue a clearance cookie for the domain that it's embedded on. Customers can issue their challenge within the HTML page before a fetch request, <i>pre-clearing</i> the visitor to interact with the Payment API.</p>
    <div>
      <h3>Turnstile Pre-Clearance mode</h3>
      <a href="#turnstile-pre-clearance-mode">
        
      </a>
    </div>
    <p>Returning to our pizzeria example, the three big advantages of using Pre-Clearance to integrate Turnstile with the Cloudflare WAF are:</p><ol><li><p><b>Improved user experience</b>: Turnstile’s embedded challenge can run in the background while the visitor is entering their payment details.</p></li><li><p><b>Blocking more requests at the edge</b>: Because Turnstile now issues a clearance cookie for the domain that it’s embedded on, our pizzeria owner can use a Custom Rule to issue a Managed Challenge for every request to the payment API. This ensures that automated attacks attempting to target the payment API directly are stopped by Cloudflare before they can reach the API.</p></li><li><p><b>(Optional) Securing the action and the user</b>: No backend code changes are necessary to get the benefit of Pre-Clearance. However, further Turnstile integration will increase security for the integrated API. The pizzeria owner can adjust their payment form to <a href="https://developers.cloudflare.com/turnstile/get-started/server-side-validation/">validate the received Turnstile token</a>, ensuring that every payment attempt is individually validated by Turnstile to protect their payment endpoint from session hijacking.</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1Er3Qa9TvxheeCOxbYeCQh/50afffa59cef839aba3a256484ea6ea5/Pre-clearance.png" />
            
            </figure><p>A Turnstile widget with Pre-Clearance enabled will still issue turnstile tokens, which gives customers the flexibility to decide if an endpoint is critical enough to require a security check on every request to it, or just once a session. Clearance cookies issued by a Turnstile widget are automatically applied to the Cloudflare zone the Turnstile widget is embedded on, with no configuration necessary. The clearance time the token is valid for is still controlled by the zone specific “Challenge Passage” time.</p>
    <div>
      <h3>Implementing Turnstile with Pre-Clearance</h3>
      <a href="#implementing-turnstile-with-pre-clearance">
        
      </a>
    </div>
    <p>Let’s make this concrete by walking through a basic implementation. Before we start, we’ve set up a simple demo application where we emulate a frontend talking to a backend on a <code>/your-api</code> endpoint.</p><p>To this end, we have the following code:</p>
            <pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
   &lt;title&gt;Turnstile Pre-Clearance Demo &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;main class="pre-clearance-demo"&gt;
    &lt;h2&gt;Pre-clearance Demo&lt;/h2&gt;
    &lt;button id="fetchBtn"&gt;Fetch Data&lt;/button&gt;
    &lt;div id="response"&gt;&lt;/div&gt;
&lt;/main&gt;

&lt;script&gt;
  const button = document.getElementById('fetchBtn');
  const responseDiv = document.getElementById('response');
  button.addEventListener('click', async () =&gt; {
  try {
    let result = await fetch('/your-api');
    if (result.ok) {
      let data = await result.json();
      responseDiv.textContent = JSON.stringify(data);
    } else {
      responseDiv.textContent = 'Error fetching data';
    }
  } catch (error) {
    responseDiv.textContent = 'Network error';
  }
});
&lt;/script&gt;</code></pre>
            <p>We've created a button. Upon clicking, Cloudflare makes a <code>fetch()</code> request to the <code>/your-api</code> endpoint, showing the result in the response container.</p><p>Now let’s consider that we have a Cloudflare WAF rule set up that protects the <code>/your-api</code> endpoint with a Managed Challenge.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1sjpmlJe4atSe3ztUjbL2M/99335880b870554a9c1dd3e5c8d70614/pasted-image-0-3.png" />
            
            </figure><p>Due to this rule, the app that we just wrote is going to fail for the reason described earlier (the browser is expecting a JSON response, but instead receives the challenge page as HTML).</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4HJrHiNoxjmSdRwEcZrYuA/a62895eaa382e160eb17fce51acde32c/Screenshot-2023-12-18-at-12.00.16.png" />
            
            </figure><p>If we inspect the Network Tab, we can see that the request to <code>/your-api</code> has been given a 403 response.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2DiC7Lus2CVxUJKw5pr7mi/ab45a3af70f411998ebb4892977a255d/image10.png" />
            
            </figure><p>Upon inspection, the Cf-Mitigated header shows that the response was challenged by Cloudflare’s firewall, as the visitor has not solved a challenge before.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2D81qpEEa60G1W1pZMUr2U/f04a2571ed6f52a16f6bf28adaee9ee4/image6.png" />
            
            </figure><p>To address this problem in our app, we set up a Turnstile Widget in Pre-Clearance mode for the Turnstile sitekey that we want to use.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6xLOm4TvNFK32gEf45I1XF/7e04c0a1fdc746a64dc8cf1e08ec3bf1/image2-4.png" />
            
            </figure><p>In our application, we override the <code>fetch()</code> function to invoke Turnstile once a Cf-Mitigated response has been received.</p>
            <pre><code>&lt;script&gt;
turnstileLoad = function () {
  // Save a reference to the original fetch function
  const originalFetch = window.fetch;

  // A simple modal to contain Cloudflare Turnstile
  const overlay = document.createElement('div');
  overlay.style.position = 'fixed';
  overlay.style.top = '0';
  overlay.style.left = '0';
  overlay.style.right = '0';
  overlay.style.bottom = '0';
  overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  overlay.style.border = '1px solid grey';
  overlay.style.zIndex = '10000';
  overlay.style.display = 'none';
  overlay.innerHTML =       '&lt;p style="color: white; text-align: center; margin-top: 50vh;"&gt;One more step before you proceed...&lt;/p&gt;&lt;div style=”display: flex; flex-wrap: nowrap; align-items: center; justify-content: center;” id="turnstile_widget"&gt;&lt;/div&gt;';
  document.body.appendChild(overlay);

  // Override the native fetch function
  window.fetch = async function (...args) {
      let response = await originalFetch(...args);

      // If the original request was challenged...
      if (response.headers.has('cf-mitigated') &amp;&amp; response.headers.get('cf-mitigated') === 'challenge') {
          // The request has been challenged...
          overlay.style.display = 'block';

          await new Promise((resolve, reject) =&gt; {
              turnstile.render('#turnstile_widget', {
                  'sitekey': ‘YOUR_TURNSTILE_SITEKEY',
                  'error-callback': function (e) {
                      overlay.style.display = 'none';
                      reject(e);
                  },
                  'callback': function (token, preClearanceObtained) {
                      if (preClearanceObtained) {
                          // The visitor successfully solved the challenge on the page. 
                          overlay.style.display = 'none';
                          resolve();
                      } else {
                          reject(new Error('Unable to obtain pre-clearance'));
                      }
                  },
              });
          });

          // Replay the original fetch request, this time it will have the cf_clearance Cookie
          response = await originalFetch(...args);
      }
      return response;
  };
};
&lt;/script&gt;
&lt;script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=turnstileLoad" async defer&gt;&lt;/script&gt;</code></pre>
            <p>There is a lot going on in the snippet above: First, we create a hidden overlay element and override the browser’s <code>fetch()</code> function. The <code>fetch()</code> function is changed to introspect the Cf-Mitigated header for ‘challenge’. If a challenge is issued, the initial result will be unsuccessful; instead, a Turnstile overlay (with Pre-Clearance enabled) will appear in our web application. Once the Turnstile challenge has been completed we will retry the previous request after Turnstile has obtained the cf_clearance cookie to get through the Cloudflare WAF.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1HNSoEaOmTMmQFuc8kKY2p/1877b884856e092cfc51637f3f050c2c/image1-2.png" />
            
            </figure><p>Upon solving the Turnstile widget, the overlay disappears, and the requested API result is shown successfully:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7aPtaSfD7JdV0jYb1iDX50/dd9807c4807f6234dcb453471f43db99/Screenshot-2023-12-18-at-12.02.56.png" />
            
            </figure>
    <div>
      <h3>Pre-Clearance is available to all Cloudflare customers</h3>
      <a href="#pre-clearance-is-available-to-all-cloudflare-customers">
        
      </a>
    </div>
    <p>Every Cloudflare user with a <a href="https://www.cloudflare.com/plans/free/">free plan</a> or above can use Turnstile in managed mode free for an unlimited number of requests. If you’re a Cloudflare user looking to improve your security and user experience for your critical API endpoints, head over to our dashboard and <a href="https://dash.cloudflare.com/?to=/:account/turnstile">create a Turnstile widget with Pre-Clearance</a> today.</p> ]]></content:encoded>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Bots]]></category>
            <category><![CDATA[Turnstile]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Micro-frontends]]></category>
            <guid isPermaLink="false">1aYnXBUBD1B2KvKgz0veFW</guid>
            <dc:creator>Adam Martinetti</dc:creator>
            <dc:creator>Benedikt Wolters</dc:creator>
            <dc:creator>Miguel de Moura</dc:creator>
        </item>
        <item>
            <title><![CDATA[Birthday Week recap: everything we announced — plus an AI-powered opportunity for startups]]></title>
            <link>https://blog.cloudflare.com/birthday-week-2023-wrap-up/</link>
            <pubDate>Mon, 02 Oct 2023 13:00:24 GMT</pubDate>
            <description><![CDATA[ Need a recap or refresher on all the big Birthday Week news this week? This recap has you covered ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3xrCvUVi0SgWrjDPrwi77i/2097296d3db2c219c5e0e904fe19adfb/image1-45.png" />
            
            </figure><p>This year, Cloudflare officially became a teenager, turning 13 years old. We celebrated this milestone with a series of announcements that benefit both our customers and the Internet community.</p><p>From developing applications in the age of AI to securing against the most advanced attacks that are yet to come, Cloudflare is proud to provide the tools that help our customers stay one step ahead.</p><p>We hope you’ve had a great time following along and for anyone looking for a recap of everything we launched this week, here it is:</p>
    <div>
      <h3>Monday</h3>
      <a href="#monday">
        
      </a>
    </div>
    <table><colgroup><col></col><col></col></colgroup><tbody><tr><td><p><span>What</span></p></td><td><p><span>In a sentence…</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/switching-cloudflare-cut-your-network-carbon-emissions-sbti/"><span>Switching to Cloudflare can cut emissions by up to 96%</span></a></p></td><td><p><span>Switching enterprise network services from on-prem to Cloudflare can cut related carbon emissions by up to 96%. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/traffic-transparency-unleashing-cloudflare-trace/"><span>Cloudflare Trace</span></a></p></td><td><p><span>Use Cloudflare Trace to see which rules and settings are invoked when an HTTP request for your site goes through our network. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/cloudflare-fonts-enhancing-website-privacy-speed/"><span>Cloudflare Fonts</span></a></p></td><td><p><span>Introducing Cloudflare Fonts. Enhance privacy and performance for websites using Google Fonts by loading fonts directly from the Cloudflare network. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/meet-traffic-manager/"><span>How Cloudflare intelligently routes traffic</span></a></p></td><td><p><span>Technical deep dive that explains how Cloudflare uses machine learning to intelligently route traffic through our vast network. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/cloudflare-stream-low-latency-hls-open-beta/"><span>Low Latency Live Streaming</span></a></p></td><td><p><span>Cloudflare Stream’s LL-HLS support is now in open beta. You can deliver video to your audience faster, reducing the latency a viewer may experience on their player to as little as 3 seconds. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/permissions-best-practices/"><span>Account permissions for all</span></a></p></td><td><p><span>Cloudflare account permissions are now available to all customers, not just Enterprise. In addition, we’ll show you how you can use them and best practices. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/incident-alerts/"><span>Incident Alerts</span></a></p></td><td><p><span>Customers can subscribe to Cloudflare Incident Alerts and choose when to get notified based on affected products and level of impact. </span></p></td></tr></tbody></table>
    <div>
      <h3>Tuesday</h3>
      <a href="#tuesday">
        
      </a>
    </div>
    <table><colgroup><col></col><col></col></colgroup><tbody><tr><td><p><span>What</span></p></td><td><p><span>In a sentence…</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/welcome-to-connectivity-cloud/"><span>Welcome to the connectivity cloud</span></a></p></td><td><p><span>Cloudflare is the world’s first connectivity cloud — the modern way to connect and protect your cloud, networks, applications and users. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/amazon-2bn-ipv4-tax-how-avoid-paying/"><span>Amazon’s $2bn IPv4 tax — and how you can avoid paying it</span></a><span> </span></p></td><td><p><span>Amazon will begin taxing their customers $43 for IPv4 addresses, so Cloudflare will give those \$43 back in the form of credits to bypass that tax. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/sippy-incremental-migration-s3-r2/"><span>Sippy</span></a></p><br /></td><td><p><span>Minimize egress fees by using Sippy to incrementally migrate your data from AWS to R2. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/merging-images-and-image-resizing/"><span>Cloudflare Images</span></a></p></td><td><p><span>All Image Resizing features will be available under Cloudflare Images and we’re simplifying pricing to make it more predictable and reliable.  </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/traffic-anomalies-notifications-radar/"><span>Traffic anomalies and notifications with Cloudflare Radar</span></a></p></td><td><p><span>Cloudflare Radar will be publishing anomalous traffic events for countries and Autonomous Systems (ASes).</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/detecting-internet-outages/"><span>Detecting Internet outages</span></a></p></td><td><p><span>Deep dive into how Cloudflare detects Internet outages, the challenges that come with it, and our approach to overcome these problems. </span></p></td></tr></tbody></table>
    <div>
      <h3>Wednesday</h3>
      <a href="#wednesday">
        
      </a>
    </div>
    <table><colgroup><col></col><col></col></colgroup><tbody><tr><td><p><span>What</span></p></td><td><p><span>In a sentence…</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/best-place-region-earth-inference/"><span>The best place on Region: Earth for inference</span></a></p></td><td><p><span>Now available: Workers AI, a serverless GPU cloud for AI, Vectorize so you can build your own vector databases, and AI Gateway to help manage costs and observability of your AI applications. </span></p><br /><p><span>Cloudflare delivers the best infrastructure for next-gen AI applications, supported by partnerships with NVIDIA, Microsoft, Hugging Face, Databricks, and Meta.</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/workers-ai/"><span>Workers AI </span></a></p></td><td><p><span>Launching Workers AI — AI inference as a service platform, empowering developers to run AI models with just a few lines of code, all powered by our global network of GPUs. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/partnering-with-hugging-face-deploying-ai-easier-affordable/"><span>Partnering with Hugging Face </span></a></p></td><td><p><span>Cloudflare is partnering with Hugging Face to make AI models more accessible and affordable to users. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/vectorize-vector-database-open-beta/"><span>Vectorize</span></a></p></td><td><p><span>Cloudflare’s vector database, designed to allow engineers to build full-stack, AI-powered applications entirely on Cloudflare's global network — available in Beta. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/announcing-ai-gateway/"><span>AI Gateway</span></a></p></td><td><p><span>AI Gateway helps developers have greater control and visibility in their AI apps, so that you can focus on building without worrying about observability, reliability, and scaling. AI Gateway handles the things that nearly all AI applications need, saving you engineering time so you can focus on what you're building.</span></p><br /><p><span> </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/webgpu-in-workers/"><span>You can now use WebGPU in Cloudflare Workers</span></a></p></td><td><p><span>Developers can now use WebGPU in Cloudflare Workers. Learn more about why WebGPUs are important, why we’re offering them to customers, and what’s next. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/ai-companies-building-cloudflare/"><span>What AI companies are building with Cloudflare</span></a></p></td><td><p><span>Many AI companies are using Cloudflare to build next generation applications. Learn more about what they’re building and how Cloudflare is helping them on their journey. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/writing-poems-using-llama-2-on-workers-ai/"><span>Writing poems using LLama 2 on Workers AI</span></a></p></td><td><p><span>Want to write a poem using AI? Learn how to run your own AI chatbot in 14 lines of code, running on Cloudflare’s global network. </span></p></td></tr></tbody></table>
    <div>
      <h3>Thursday</h3>
      <a href="#thursday">
        
      </a>
    </div>
    <table><colgroup><col></col><col></col></colgroup><tbody><tr><td><p><span>What</span></p></td><td><p><span>In a sentence…</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/hyperdrive-making-regional-databases-feel-distributed/"><span>Hyperdrive</span></a></p></td><td><p><span>Cloudflare launches a new product, Hyperdrive, that makes existing regional databases much faster by dramatically speeding up queries that are made from Cloudflare Workers.</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/d1-open-beta-is-here/"><span>D1 Open Beta</span></a></p></td><td><p><span>D1 is now in open beta, and the theme is “scale”: with higher per-database storage limits and the ability to create more databases, we’re unlocking the ability for developers to build production-scale applications on D1.</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/race-ahead-with-build-caching/"><span>Pages Build Caching</span></a></p></td><td><p><span>Build cache is a feature designed to reduce your build times by caching and reusing previously computed project components — now available in Beta. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/running-serverless-puppeteer-workers-durable-objects/"><span>Running serverless Puppeteer with Workers and Durable Objects</span></a></p></td><td><p><span>Introducing the Browser Rendering API, which enables developers to utilize the Puppeteer browser automation library within Workers, eliminating the need for serverless browser automation system setup and maintenance</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/cloudflare-now-powering-microsoft-edge-secure-network/"><span>Cloudflare partners with Microsoft to power their Edge Secure Network</span></a></p></td><td><p><span>We partnered with Microsoft Edge to provide a fast and secure VPN, right in the browser. Users don’t have to install anything new or understand complex concepts to get the latest in network-level privacy: Edge Secure Network VPN is available on the latest consumer version of Microsoft Edge in most markets, and automatically comes with 5GB of data. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/workers-playground/"><span>Re-introducing the Cloudflare Workers playground</span></a></p></td><td><p><span>We are revamping the playground that demonstrates the power of Workers, along with new development tooling, and the ability to share your playground code and deploy instantly to Cloudflare’s global network</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/cloudflare-integrations-marketplace-new-partners-sentry-momento-turso/"><span>Cloudflare integrations marketplace expands</span></a></p></td><td><p><span>Introducing the newest additions to Cloudflare’s Integration Marketplace. Now available: Sentry, Momento and Turso. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/socket-api-works-javascript-runtimes-wintercg-polyfill-connect/"><span>A Socket API that works across Javascript runtimes — announcing WinterCG spec and polyfill for connect()</span></a></p></td><td><p><span>Engineers from Cloudflare and Vercel have published a draft specification of the connect() sockets API for review by the community, along with a Node.js compatible polyfill for the connect() API that developers can start using.</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/workers-pricing-scale-to-zero/"><span>New Workers pricing</span></a></p></td><td><p><span>Announcing new pricing for Cloudflare Workers, where you are billed based on CPU time, and never for the idle time that your Worker spends waiting on network requests and other I/O.</span></p></td></tr></tbody></table>
    <div>
      <h3>Friday</h3>
      <a href="#friday">
        
      </a>
    </div>
    <table><colgroup><col></col><col></col></colgroup><tbody><tr><td><p><span>What</span></p></td><td><p><span>In a sentence…</span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/post-quantum-cryptography-ga/"><span>Post Quantum Cryptography goes GA</span></a><span> </span></p></td><td><p><span>Cloudflare is rolling out post-quantum cryptography support to customers, services, and internal systems to proactively protect against advanced attacks. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/announcing-encrypted-client-hello/"><span>Encrypted Client Hello</span></a></p></td><td><p><span>Announcing a contribution that helps improve privacy for everyone on the Internet. Encrypted Client Hello, a new standard that prevents networks from snooping on which websites a user is visiting, is now available on all Cloudflare plans. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/threats-lurking-office-365-cloudflare-email-retro-scan/"><span>Email Retro Scan</span></a><span> </span></p></td><td><p><span>Cloudflare customers can now scan messages within their Office 365 Inboxes for threats. The Retro Scan will let you look back seven days to see what threats your current email security tool has missed. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/turnstile-ga/"><span>Turnstile is Generally Available</span></a></p></td><td><p><span>Turnstile, Cloudflare’s CAPTCHA replacement, is now generally available and available for free to everyone and includes unlimited use. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/ai-bots/"><span>AI crawler bots</span></a></p></td><td><p><span>Any Cloudflare user, on any plan, can choose specific categories of bots that they want to allow or block, including AI crawlers. We are also recommending a new standard to robots.txt that will make it easier for websites to clearly direct how AI bots can and can’t crawl.</span></p><br /></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/detecting-zero-days-before-zero-day/"><span>Detecting zero-days before zero-day</span></a></p></td><td><p><span>Deep dive into Cloudflare’s approach and ongoing research into detecting novel web attack vectors in our WAF before they are seen by a security researcher. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/deep-dive-privacy-preserving-measurement/"><span>Privacy Preserving Metrics</span></a></p></td><td><p><span>Deep dive into the fundamental concepts behind the Distributed Aggregation Protocol (DAP) protocol with examples on how we’ve implemented it into Daphne, our open source aggregator server. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/post-quantum-to-origins/"><span>Post-quantum cryptography to origin</span></a></p></td><td><p><span>We are rolling out post-quantum cryptography support for outbound connections to origins and Cloudflare Workers fetch() calls. Learn more about what we enabled, how we rolled it out in a safe manner, and how you can add support to your origin server today. </span></p></td></tr><tr><td><p><a href="http://staging.blog.mrk.cfdata.org/network-performance-update-birthday-week-2023/"><span>Network performance update</span></a></p></td><td><p><span>Cloudflare’s updated benchmark results regarding network performance plus a dive into the tools and processes that we use to monitor and improve our network performance. </span></p></td></tr></tbody></table>
    <div>
      <h3>One More Thing</h3>
      <a href="#one-more-thing">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1e1X3l01L7kc5DgRUgAoU5/76d3d1955e15044bbbd14c57ee05877c/image1-51.png" />
            
            </figure><p>When Cloudflare turned 12 last year, we announced the <a href="https://www.cloudflare.com/lp/workers-launchpad/">Workers Launchpad Funding Program</a> - you can think of it like a startup accelerator program for companies building on Cloudlare’s Developer Platform, with no restrictions on your size, stage, or geography.</p><p><b>A refresher on how the Launchpad works:</b> Each quarter, we admit a group of startups who then get access to a wide range of technical advice, mentorship, and fundraising opportunities. That includes our Founders Bootcamp, Open Office Hours with our Solution Architects, and Demo Day. Those who are ready to fundraise will also be connected to our community of 40+ leading global Venture Capital firms.</p><p>In exchange, we just ask for your honest feedback. We want to know what works, what doesn’t and what you need us to build for you. We don’t ask for a stake in your company, and we don’t ask you to pay to be a part of the program.</p><blockquote><p>Targum (my startup) was one of the first AI companies (w/ <a href="https://twitter.com/jamdotdev?ref_src=twsrc%5Etfw">@jamdotdev</a> ) in the Cloudflare workers launchpad!</p><p>In return to tons of stuff we got from CF 🙏 they asked for feedback, and my main one was, let me do everything end to end on CF, I don't want to rent GPU servers… <a href="https://t.co/0j2ZymXpsL">https://t.co/0j2ZymXpsL</a></p><p>— Alex Volkov (@altryne) <a href="https://twitter.com/altryne/status/1707034613699547433?ref_src=twsrc%5Etfw">September 27, 2023</a></p></blockquote><p>Over the past year, we’ve received applications from nearly 60 different countries. We’ve had a chance to work closely with 50 amazing early and growth-stage startups admitted into the first two cohorts, and have grown our VC partner community to 40+ firms and more than $2 billion in potential investments in startups building on Cloudflare.</p><p><b>Next up: Cohort #3!</b> Between recently wrapping up Cohort #2 (check out their <a href="https://cloudflare.tv/shows/workers-launchpad-demo-day/workers-launchpad-demo-day-cohort-2/3vVqLOgq">Demo Day</a>!), celebrating the Launchpad’s 1st birthday, and the heaps of announcements we made last week, we thought that everyone could use a little extra time to catch up on all the news - which is why we are extending the deadline for Cohort #3 a few weeks to <b>October 13, 2023. AND</b> we’re <b>reserving 5 spots in the class for those who are already using any of last Wednesday’s AI announcements.</b> Just be sure to mention what you’re using in your application.</p><p>So once you’ve had a chance to check out the announcements and pour yourself a cup of coffee, check out the <a href="https://www.cloudflare.com/lp/workers-launchpad/"><b>Workers Launchpad</b></a>. Applying is a breeze — you’ll be done long before your coffee gets cold.</p>
    <div>
      <h3>Until next time</h3>
      <a href="#until-next-time">
        
      </a>
    </div>
    <p>That’s all for Birthday Week 2023. We hope you enjoyed the ride, and we’ll see you at our next innovation week!</p><blockquote><p>i hate <a href="https://twitter.com/Cloudflare?ref_src=twsrc%5Etfw">@Cloudflare</a> launch week</p><p>most launch weeks are underwhelming</p><p>cloudflare always makes me rethink everything i’m doing</p><p>— Dax (@thdxr) <a href="https://twitter.com/thdxr/status/1707575791234560377?ref_src=twsrc%5Etfw">September 29, 2023</a></p></blockquote><p></p> ]]></content:encoded>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[AI]]></category>
            <category><![CDATA[Turnstile]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[Machine Learning]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Connectivity Cloud]]></category>
            <category><![CDATA[undefined]]></category>
            <category><![CDATA[D1]]></category>
            <category><![CDATA[Beta]]></category>
            <guid isPermaLink="false">7umrrlVzTKNvArNCqoQUSI</guid>
            <dc:creator>Dina Kozlov</dc:creator>
            <dc:creator>Mia Wang</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare is free of CAPTCHAs; Turnstile is free for everyone]]></title>
            <link>https://blog.cloudflare.com/turnstile-ga/</link>
            <pubDate>Fri, 29 Sep 2023 13:00:00 GMT</pubDate>
            <description><![CDATA[ Now that we’ve eliminated CAPTCHAs at Cloudflare, we want to hasten the demise of CAPTCHAs across the internet. We’re thrilled to announce that Turnstile is generally available, and Turnstile’s ‘Managed’ mode is now completely free to everyone for unlimited use.  ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2562yydO3PNFG88W5iTE0P/ee8cda8c9929f566e738c0e0f75b2a9b/image3-37.png" />
            
            </figure><p>For years, we’ve <a href="/moving-from-recaptcha-to-hcaptcha/">written</a> that CAPTCHAs drive us crazy. Humans give up on CAPTCHA puzzles <a href="https://www.math.unipd.it/~gaggi/doc/ads20.pdf">approximately 15% of the time</a> and, maddeningly, <a href="https://www.usenix.org/conference/usenixsecurity23/presentation/searles">CAPTCHAs are significantly easier for bots</a> to solve than they are for humans. We’ve spent the past three and a half years working to build a better experience for humans that’s just as effective at stopping bots. As of this month, we’ve finished replacing every CAPTCHA issued by Cloudflare with Turnstile, our new <a href="https://www.cloudflare.com/products/turnstile/">CAPTCHA replacement</a> (pictured below). Cloudflare will never issue another visual puzzle to anyone, for any reason.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/10LzRAr38KzxAANQIVxwZT/0fe5ec0867c70f8217a6deff4b244f9b/image2.gif" />
            
            </figure><p>Now that we’ve eliminated CAPTCHAs at Cloudflare, we want to make it easy for anyone to do the same, even if they don’t use other Cloudflare services. We’ve decoupled Turnstile from our platform so that any website operator on any platform can use it just by adding <a href="https://github.com/cloudflare/turnstile-demo-workers/blob/main/src/explicit.html#L74-L85">a few lines of code</a>. We’re thrilled to announce that Turnstile is now generally available, and <b>Turnstile’s ‘Managed’ mode is now completely free to everyone for unlimited use</b>.</p>
    <div>
      <h3>Easy on humans, hard on bots, private for everyone</h3>
      <a href="#easy-on-humans-hard-on-bots-private-for-everyone">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6DQmrvGrrHUPlLMHrknjyY/99ea339af6278970204cb33bcdf5520f/image6-5.png" />
            
            </figure><p>There’s a lot that goes into Turnstile’s simple checkbox to ensure that it’s easy for everyone, preserves user privacy, and does its job stopping <a href="https://www.cloudflare.com/learning/bots/what-is-a-bot/">bots</a>. Part of making challenges better for everyone means that everyone gets the same great experience, no matter what browser you’re using. Because we do not employ a visual puzzle, users with low vision or blindness get the same easy to use challenge flow as everyone else.</p><p>It was particularly important for us to avoid falling back to audio CAPTCHAs to offer an experience accessible to everyone. Audio CAPTCHAs are often much worse than even visual CAPTCHAs for humans to solve, with only <a href="https://web.stanford.edu/~jurafsky/burszstein_2010_captcha.pdf">31.2% of audio challenges</a> resulting in a three-person agreement on what the correct solution actually is. The prevalence of free speech-to-text services has made it easy for bots to solve audio CAPTCHAs as well, with <a href="https://uncaptcha.cs.umd.edu/papers/uncaptcha_woot17.pdf">a recent study</a> showing bots can accurately solve audio CAPTCHAs in over 85% of attempts. We’re proud to state that Turnstile is WCAG 2.1 Level AA compliant, while eliminating the need for audio CAPTCHAs as well as visual ones.</p><p>We also created Turnstile to be privacy focused. Turnstile meets <a href="https://www.cloudflare.com/learning/privacy/what-is-eprivacy-directive/">ePrivacy Directive</a>, <a href="https://www.cloudflare.com/learning/privacy/what-is-the-gdpr/">GDPR</a> and <a href="https://www.cloudflare.com/learning/privacy/what-is-the-ccpa/">CCPA</a> compliance requirements, as well as the strict requirements of our own privacy commitments. In addition, Cloudflare's <a href="https://marketplace.fedramp.gov/products/FR2000863987">FedRAMP Moderate authorized package</a>, "Cloudflare for Government" now includes Turnstile. We don’t rely on tracking user data, like what other websites someone has visited, to determine if a user is a human or robot. Our business is protecting websites, not selling ads, so operators can deploy Turnstile knowing that their users’ data is safe.</p><p>With all of our emphasis on how <i>easy</i> it is to pass a Turnstile challenge, you would be right to ask how it can stop a bot. If a bot can find <a href="https://www.vox.com/22436832/captchas-getting-harder-ai-artificial-intelligence">all images with crosswalks</a> in grainy photos faster than we can, surely it can check a box as well. Bots definitely can check a box, and they can even <a href="https://arxiv.org/abs/1903.01003">mimic the erratic path of human mouse movement</a> while doing so. For Turnstile, the actual act of checking a box isn’t important, it’s the background data we’re analyzing while the box is checked that matters. We find and stop bots by running a series of in-browser tests, checking browser characteristics, native browser APIs, and asking the browser to pass lightweight tests (ex: proof-of-work tests, proof-of-space tests) to prove that it’s an actual browser. The current deployment of Turnstile checks billions of visitors every day, and we are able to identify browser abnormalities that bots exhibit while attempting to pass those tests.</p><p>For over one year, <a href="/end-cloudflare-captcha/">we used our Managed Challenge</a> to rotate between CAPTCHAs and our own Turnstile challenge to compare our effectiveness. We found that <b>even without asking users for any interactivity at all</b>, Turnstile was just as effective as a CAPTCHA. Once we were sure that the results were effective at coping with the response from bot makers, we replaced the CAPTCHA challenge with our own checkbox solution. We present this extra test when we see potentially suspicious signals, and it helps us provide an even greater layer of security.</p>
    <div>
      <h3>Turnstile is great for fighting fraud</h3>
      <a href="#turnstile-is-great-for-fighting-fraud">
        
      </a>
    </div>
    <p>Like all sites that offer services for free, Cloudflare sees our fair share of automated account signups, which can include “new account fraud,” where bad actors automate the creation of many different accounts to abuse our platform. To help combat this abuse, we’ve rolled out Turnstile’s invisible mode to protect our own signup page. This month, we’ve blocked <b>over</b> <b>1 million automated signup attempts</b> using Turnstile, without a reported false positive or any change in our self-service billings that rely on this signup flow.  </p>
    <div>
      <h3>Lessons from the Turnstile beta</h3>
      <a href="#lessons-from-the-turnstile-beta">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6Fiihb5s0WfTPdtLrqx4ro/7b93471efb6a16ba777e5249405ee726/image5-11.png" />
            
            </figure><p>Over the past twelve months, we’ve been grateful to see how many people are eager to try, then rely on, and integrate Turnstile into their web applications. It’s been rewarding to see the developer community embrace Turnstile as well. We list some of the community created Turnstile integrations <a href="https://developers.cloudflare.com/turnstile/community-resources/">here</a>, including integrations with <a href="https://www.cloudflare.com/integrations/wordpress/">WordPress</a>, Angular, Vue, and a Cloudflare recommended <a href="https://www.npmjs.com/package/@marsidev/react-turnstile">React library</a>. We’ve listened to customer feedback, and added support for <a href="https://developers.cloudflare.com/turnstile/reference/supported-languages/">17 new languages</a>, <a href="https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/">new callbacks</a>, and <a href="https://developers.cloudflare.com/turnstile/reference/client-side-errors/">new error codes</a>.</p><p>76,000+ users have signed up, but our biggest single test by far was the <a href="/how-cloudflare-scaled-and-protected-eurovision-2023-voting/">Eurovision final vote</a>. Turnstile runs on challenge pages on over 25 million Cloudflare websites. Usually, that makes Cloudflare the far and away biggest Turnstile consumer, until the final Eurovision vote. During that one hour, challenge traffic from the Eurovision voting site outpaced the use of challenge pages on those 25 million sites combined! Turnstile handled the enormous spike in traffic without a hitch.</p><p>While a lot went well during the Turnstile beta, we also encountered some opportunities for us to learn. We were initially resistant to disclosing why a Turnstile challenge failed. After all, if bad actors know what we’re looking for, it becomes easier for bots to fool our challenges until we introduce new detections. However, during the Turnstile beta, we saw a few scenarios where legitimate users could not pass a challenge. These scenarios made it clear to us that we need to be transparent about why a challenge failed to help aid any individual who might modify their browser in a way that causes them to get caught by Turnstile. We now publish detailed client-side error codes to surface the reason why a challenge has failed. Two scenarios came up on several occasions that we didn’t expect:</p><p>First, we saw that desktop computers at least 10 years old frequently had expired motherboard batteries, and computers with bad motherboard batteries very often keep inaccurate time. This is because without the motherboard battery, a desktop computer’s clock will stop operating when the computer is off. Turnstile checks your computer’s system time to detect when a website operator has accidentally configured a challenge page to be cached, as caching a challenge page will cause it to become impassable. Unfortunately, this same check was unintentionally catching humans who just needed to update the time. When we see this issue, we now surface a clear error message to the end user to update their system time. We’d prefer to never have to surface an error in the first place, so we’re working to develop new ways to check for cached content that won’t impact real people.</p><p>Second, we find that a few privacy-focused users often ask their browsers to go beyond standard practices to preserve their anonymity. This includes changing their user-agent (something bots will do to evade detection as well), and preventing third-party scripts from executing entirely. Issues caused by this behavior can now be displayed clearly in a Turnstile widget, so those users can immediately understand the issue and make a conscientious choice about whether they want to allow their browser to pass a challenge.</p><p>Although we have some of the most sensitive, thoroughly built monitoring systems at Cloudflare, we did not catch either of these issues on our own. We needed to talk to users affected by the issue to help us understand what the problem was. Going forward, we want to make sure we always have that direct line of communication open. We’re rolling out a new feedback form in the Turnstile widget, to ensure any future corner cases are addressed quickly and with urgency.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/cydzYwhoIVTnaMCPmrYVV/f7ff6163cf69dee1abe00f7b5421cd8f/Screenshot-2023-09-29-at-11.37.58.png" />
            
            </figure>
    <div>
      <h3>Turnstile: GA and Free for Everyone</h3>
      <a href="#turnstile-ga-and-free-for-everyone">
        
      </a>
    </div>
    <p>Announcing Turnstile’s General Availability means that Turnstile is now completely production ready, available for free for unlimited use via our visible widget in Managed mode. Turnstile Enterprise includes SaaS platform support and a visible mode without the Cloudflare logo. Self-serve customers can expect a pay-as-you-go option for advanced features to be available in early 2024. Users can continue to access Turnstile’s advanced features below our 1 million siteverify request limit, as has been the case during the beta. If you’ve been waiting to try Turnstile, head over to our <a href="https://www.cloudflare.com/products/turnstile/">signup page</a> and create an account!</p> ]]></content:encoded>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Turnstile]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Bots]]></category>
            <guid isPermaLink="false">3ijPrY6Heu8jsF4JTYQtx6</guid>
            <dc:creator>Benedikt Wolters</dc:creator>
            <dc:creator>Maxime Guerreiro</dc:creator>
            <dc:creator>Adam Martinetti</dc:creator>
        </item>
        <item>
            <title><![CDATA[Announcing Turnstile, a user-friendly, privacy-preserving alternative to CAPTCHA]]></title>
            <link>https://blog.cloudflare.com/turnstile-private-captcha-alternative/</link>
            <pubDate>Wed, 28 Sep 2022 13:01:00 GMT</pubDate>
            <description><![CDATA[ Any website can use a simple API to replace CAPTCHAs with our invisible alternative, whether they’re on the Cloudflare network or not. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Today, we’re announcing the open beta of Turnstile, an invisible <a href="https://www.cloudflare.com/products/turnstile/">alternative to CAPTCHA</a>. Anyone, anywhere on the Internet, who wants to replace CAPTCHA on their site will be able to call a simple API, without having to be a Cloudflare customer or sending traffic through the Cloudflare global network. <a href="http://www.cloudflare.com/lp/turnstile/">Sign up here for free</a>.</p><p>There is no point in rehashing the fact that CAPTCHA provides a terrible user experience. It's been discussed in detail before <a href="/moving-from-recaptcha-to-hcaptcha/">on this blog</a>, and countless times elsewhere. The creator of the CAPTCHA has even publicly lamented that he “unwittingly created a system that was <a href="https://thewalrus.ca/human-resources/">frittering away, in ten-second increments, millions of hours</a> of a most precious resource: human brain cycles.” We hate it, you hate it, everyone hates it. Today we’re giving everyone a better option.</p><div></div><p>Turnstile is our smart CAPTCHA alternative. It automatically chooses from a rotating suite of non-intrusive browser challenges based on telemetry and client behavior exhibited during a session. We talked in an earlier post about how we’ve <a href="/end-cloudflare-captcha/">used our Managed Challenge system to reduce our use of CAPTCHA by 91%</a>. Now anyone can take advantage of this same technology to stop using CAPTCHA on their own site.</p>
    <div>
      <h3>UX isn’t the only big problem with CAPTCHA — so is privacy</h3>
      <a href="#ux-isnt-the-only-big-problem-with-captcha-so-is-privacy">
        
      </a>
    </div>
    <p>While having to solve a CAPTCHA is a frustrating user experience, there is also a potential hidden tradeoff a website must make when using CAPTCHA. If you are a small site using CAPTCHA today, you essentially have one option: an 800 pound gorilla with <a href="https://trends.builtwith.com/widgets/captcha">98% of the CAPTCHA</a> market share. This tool is free to use, but in fact it has a privacy cost: you have to give your data to an ad sales company.</p><p>According to security researchers, one of the signals that Google uses to decide if you are malicious is whether you have a Google cookie in your browser, and if you have this cookie, Google <a href="https://web.archive.org/web/20220826231627/https://www.fastcompany.com/90369697/googles-new-recaptcha-has-a-dark-side">will give you a higher score</a>. Google says they don’t use this information for ad targeting, but at the end of the day, Google is an ad sales company. Meanwhile, at Cloudflare, we make money when customers choose us to <a href="https://www.cloudflare.com/security/">protect their websites</a> and make their services run better. It's a simple, direct relationship that perfectly aligns our incentives.</p>
    <div>
      <h3>Less data collection, more privacy, same security</h3>
      <a href="#less-data-collection-more-privacy-same-security">
        
      </a>
    </div>
    <p>In June, we announced an effort <a href="/eliminating-captchas-on-iphones-and-macs-using-new-standard/">with Apple to use Private Access Tokens</a>. Visitors using operating systems that support these tokens, including the upcoming versions of macOS or iOS, can now prove they’re human without completing a CAPTCHA or giving up personal data.</p><p>By collaborating with third parties like device manufacturers, who already have the data that would help us validate a device, we are able to abstract portions of the validation process, and confirm data without actually collecting, touching, or storing that data ourselves. Rather than interrogating a device directly, we ask the device vendor to do it for us.</p><p>Private Access Tokens are built directly into Turnstile. While Turnstile has to look at some session data (like headers, user agent, and browser characteristics) to validate users without challenging them, Private Access Tokens allow us to minimize data collection by asking Apple to validate the device for us. In addition, Turnstile never looks for <a href="https://www.cloudflare.com/learning/privacy/what-are-cookies/">cookies</a> (like a login cookie), or uses cookies to collect or store information of any kind. Cloudflare has a <a href="/next-generation-privacy-protocols/">long</a> track <a href="/announcing-the-results-of-the-1-1-1-1-public-dns-resolver-privacy-examination/">record</a> of <a href="/certifying-our-commitment-to-your-right-to-information-privacy/">investing</a> in <a href="/zaraz-privacy-features-in-response-to-cnil/">user privacy</a>, which we will continue with Turnstile.</p>
    <div>
      <h3>We are opening our CAPTCHA replacement to everyone</h3>
      <a href="#we-are-opening-our-captcha-replacement-to-everyone">
        
      </a>
    </div>
    <p>To improve the Internet for everyone, we decided to open up the technology that powers our <a href="/end-cloudflare-captcha/">Managed Challenge</a> to everyone in beta as a standalone product called Turnstile.</p><p>Rather than try to unilaterally deprecate and replace CAPTCHA with a single alternative, we built a platform to test many alternatives and rotate new challenges in and out as they become more or less effective. With Turnstile, we adapt the actual challenge outcome to the individual visitor/browser. First we run a series of small non-interactive JavaScript challenges gathering more signals about the visitor/browser environment. Those challenges include proof-of-work, proof-of-space, probing for web APIs, and various other challenges for detecting browser-quirks and human behavior. As a result, we can fine-tune the difficulty of the challenge to the specific request.</p><p>Turnstile also includes <a href="https://www.cloudflare.com/learning/ai/what-is-machine-learning/">machine learning models</a> that detect common features of end visitors who were able to pass a challenge before. The computational hardness of those initial challenges may vary by visitor, but is targeted to run fast.</p>
    <div>
      <h3>Swap out your existing CAPTCHA in a few minutes</h3>
      <a href="#swap-out-your-existing-captcha-in-a-few-minutes">
        
      </a>
    </div>
    <p>You can take advantage of Turnstile and stop bothering your visitors with a CAPTCHA even without being on the <a href="https://www.cloudflare.com/network/">Cloudflare network</a>. While we make it as easy as possible to use our network, we don't want this to be a barrier to improving privacy and user experience.</p><p>To switch from a CAPTCHA service, all you need to do is:</p><ol><li><p><a href="https://dash.cloudflare.com/?to=/:account/turnstile">Create a Cloudflare account</a>, navigate to the `Turnstile` tab on the navigation bar, and get a sitekey and secret key.</p></li><li><p>Copy our JavaScript from the dashboard and paste over your old CAPTCHA JavaScript.</p></li><li><p>Update the server-side integration by replacing the old siteverify URL with ours.</p></li></ol><p>There is more detail on the process below, including options you can configure, but that’s really it. We’re excited about the simplicity of making a change.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2o1JdkC5Dh44zULVVl4ktw/0ebbef92b61e7f1707232f06997be24e/image2-55.png" />
            
            </figure>
    <div>
      <h3>Deployment options and analytics</h3>
      <a href="#deployment-options-and-analytics">
        
      </a>
    </div>
    <p>To use Turnstile, first create an account and get your site and secret keys.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3FAcI6beB4iWixsqmoJmeQ/05817ed2836d5aec236250669111f0d8/image3-39.png" />
            
            </figure><p>Then, copy and paste our HTML snippet:</p><p><code>&lt;script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer&gt;&lt;/script&gt;</code></p><p>Once the script is embedded, you can use implicit rendering. Here, the HTML is scanned for elements that have a <code>cf-turnstile</code> class:</p>
            <pre><code>&lt;form action="/login" method="POST"&gt;
  &lt;div class="cf-turnstile" data-sitekey="yourSiteKey"&gt;&lt;/div&gt;
  &lt;input type="submit"&gt;
&lt;/form&gt;</code></pre>
            <p>Once a challenge has been solved, a token is injected in your form, with the name <code>cf-turnstile-response</code>. This token can be used with our <code>siteverify</code> endpoint to validate a challenge response. A token can only be validated once, and a token cannot be redeemed twice. The validation can be done on the server side or even in the cloud, for <a href="https://demo.turnstile.workers.dev/">example</a> using a simple Workers fetch (<a href="https://github.com/cloudflare/turnstile-demo-workers">see a demo here</a>):</p>
            <pre><code>async function handleRequest() {
    // ... Receive token
    let formData = new FormData();
    formData.append('secret', turnstileISecretKey);
    formData.append('response', receivedToken);
 
    await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify',
        {
            body: formData,
            method: 'POST'
        });
    // ...
}</code></pre>
            <p>For more complex use cases, the challenge can be invoked explicitly via JavaScript:</p>
            <pre><code>&lt;script&gt;
    window.turnstileCallbackFunction = function () {
        const turnstileOptions = {
            sitekey: 'yourSitekey',
            callback: function(token) {
                console.log(`Challenge Success: ${token}`);
            }
        };
        turnstile.render('#container', turnstileOptions);
    };
&lt;/script&gt;
&lt;div id="container"&gt;&lt;/div&gt;</code></pre>
            <p>You can also create what we call 'Actions'. Custom labels that allow you to distinguish between different pages where you're using Turnstile, like a login, checkout, or account creation page.</p><p>Once you’ve deployed Turnstile, you can go back to the dashboard and see analytics on where you have widgets deployed, how users are solving them, and view any defined actions.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4wP8P97T96SukNsOdZ6pnn/eea084506bef00ee817db94750bde22a/image1-64.png" />
            
            </figure>
    <div>
      <h3>Why are we giving this away for free?</h3>
      <a href="#why-are-we-giving-this-away-for-free">
        
      </a>
    </div>
    <p>While this is sometimes hard for people outside to believe, helping build a better Internet truly is <a href="https://www.cloudflare.com/careers/people/#:~:text=%E2%80%9CCloudflare's%20mission%20is%20to%20help,quantum%20algorithms%20at%20Cloudflare%20scale.%E2%80%9D">our mission</a>. This isn’t the first time we’ve built <a href="/1111-warp-better-vpn/">free tools</a> that we think will <a href="/announcing-1111/">make the Internet better</a>, and it won’t be the last. It's really important to us.</p><p>So whether or not you’re a Cloudflare customer today, if you’re using a CAPTCHA, try Turnstile for free, instead. You’ll make your users happier, and minimize the data you send to third parties.</p><p>Visit <a href="http://www.cloudflare.com/lp/turnstile/">this page</a> to sign up for the best invisible, privacy-first, CAPTCHA replacement and to retrieve your Turnstile beta sitekey.</p><p>If you want to read more, refer to our <a href="https://developers.cloudflare.com/turnstile/">documentation</a>.</p><p>
</p> ]]></content:encoded>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Turnstile]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Bots]]></category>
            <category><![CDATA[Privacy]]></category>
            <category><![CDATA[Free]]></category>
            <guid isPermaLink="false">2EwI6qWhe8xClQaOJd1GP8</guid>
            <dc:creator>Reid Tatoris</dc:creator>
            <dc:creator>Benedikt Wolters</dc:creator>
            <dc:creator>Maxime Guerreiro</dc:creator>
            <dc:creator>Miguel de Moura</dc:creator>
        </item>
        <item>
            <title><![CDATA[How to enable Private Access Tokens in iOS 16 and stop seeing CAPTCHAs]]></title>
            <link>https://blog.cloudflare.com/how-to-enable-private-access-tokens-in-ios-16-and-stop-seeing-captchas/</link>
            <pubDate>Fri, 23 Sep 2022 10:47:35 GMT</pubDate>
            <description><![CDATA[ Nobody likes CAPTCHAs. Now, with iOS 16 on iPhones, a small enabled toggle can make them disappear while improving privacy on your device. Here’s how to check if it’s “on” and try it out ]]></description>
            <content:encoded><![CDATA[ <p></p><p>You go to a website or service, but before access is granted, there’s a visual challenge that forces you to select bikes, buses or traffic lights in a set of images. That can be an exasperating experience. Now, if you have iOS 16 on your iPhone, those days could be over and are just a one-time toggle enabled away.</p><blockquote><p><a href="https://en.wikipedia.org/wiki/CAPTCHA"><i>CAPTCHA</i></a> <i>= "Completely Automated Public Turing test to tell Computers and Humans Apart"</i></p></blockquote><p>In 2021 and 2022, we took direct steps to <a href="/end-cloudflare-captcha/">end the madness</a> that <a href="/introducing-cryptographic-attestation-of-personhood/">wastes humanity about 500 years per day</a> called CAPTCHAs, that have been making sure you’re human and not a bot. In August 2022, we announced <a href="/eliminating-captchas-on-iphones-and-macs-using-new-standard/">Private Access Tokens</a>. With that, we’re able to eliminate CAPTCHAs on iPhones, iPads and Macs (and more to come) with open privacy-preserving standards.</p><p>On September 12, iOS 16 became generally available (<a href="https://developer.apple.com/wwdc22/10077">iPadOS 16 and macOS 13</a> should arrive in October) and on the settings of your device there’s a toggle that can enable the Private Access Token (PAT) technology that will eliminate the need for those CAPTCHAs, and automatically validate that you are a real human visiting a site. If you already have iOS 16, here’s what you should do to confirm that the toggle is “on” (usually it is):</p><p><i>Settings &gt; Apple ID &gt; Password &amp; Security &gt; Automatic Verification (should be enabled)</i></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/10VbYsaYNdnoeAK5LCU9tU/754bcbaa6db7906acd41b5ede3ea2cb2/image2.jpg" />
            
            </figure><p>What will you get? A completely invisible, private way to validate yourself, and for a website, a way to automatically verify that real users are visiting the site without the horrible CAPTCHA user experience.</p><p>Visitors using operating systems that support these tokens, including <a href="https://developer.apple.com/wwdc22/10077">the upcoming versions of iPadOS and macOS</a>, can now prove they’re human without completing a CAPTCHA or giving up personal data.</p><p>Let’s recap from our August 2022 announcement <a href="/eliminating-captchas-on-iphones-and-macs-using-new-standard/">blog post</a> what this means for different users:</p><p>If you’re an <b>Internet user</b>:</p><ul><li><p>We’re helping make your mobile web experience more pleasant and more private.</p></li><li><p>You won’t see a CAPTCHA on a supported iOS or Mac device (other devices coming soon!) accessing the Cloudflare network.</p></li></ul><p>If you’re a <b>web or application developer</b>:</p><ul><li><p>You’ll know your users are humans coming from an authentic device and signed application, verified by the device vendor directly.</p></li><li><p>And you’ll validate users without maintaining a cumbersome SDK.</p></li></ul><p>If you’re a <b>Cloudflare customer</b>:</p><ul><li><p>You don’t have to do anything! Cloudflare will automatically ask for and use Private Access Tokens when using <a href="https://developers.cloudflare.com/fundamentals/get-started/concepts/cloudflare-challenges/">Managed Challenge</a>.</p></li><li><p>Your visitors won’t see a CAPTCHA.</p></li></ul><p>It’s all about simplicity, without compromising on privacy. The work done over a year was a collaboration between Cloudflare and Apple, Google, and other industry leaders to extend the <a href="https://www.ietf.org/archive/id/draft-ietf-privacypass-auth-scheme-01.html">Privacy Pass protocol</a> with support for a new cryptographic token.</p><p>These tokens simplify application security for developers and security teams, and obsolete legacy, third-party SDK-based approaches for determining if a human is using a device. They work for browsers, APIs called by browsers, and APIs called within apps. After <a href="https://developer.apple.com/wwdc22/10077">Apple announced in August that PATs would be incorporated</a> into iOS 16, iPadOS 16, and macOS 13, the process of ending CAPTCHAs got a big boost. And we expect additional vendors to announce support in the near future.</p><p>Cloudflare has already incorporated PATs into our <a href="/end-cloudflare-captcha/">Managed Challenge platform</a>, so any customer using this feature will automatically take advantage of this new technology to improve the browsing experience for supported devices.</p><p>In our August <a href="/eliminating-captchas-on-iphones-and-macs-using-new-standard/">in-depth blog post</a> about PATs, you can learn more about how CAPTCHAs don’t work in mobile environments and PATs remove the need for them, and how when sites can’t challenge a visitor with a CAPTCHA, they collect private data.</p>
    <div>
      <h3>Improved privacy</h3>
      <a href="#improved-privacy">
        
      </a>
    </div>
    <p>In that blog post, we also explain how Private Access Tokens vastly improve privacy by validating without fingerprinting. So, by partnering with third parties like device manufacturers, who already have the data that would help us validate a device, we are able to abstract portions of the validation process, and confirm data <b><i>without actually collecting, touching, or storing that data ourselves</i></b>. Rather than interrogating a device directly, we ask the device vendor to do it for us.</p><p>Most customers won’t have to do anything to utilize Private Access Tokens. Why? To take advantage of PATs, all you have to do is choose Managed Challenge rather than Legacy CAPTCHA as a response option in a Firewall rule. More than 65% of Cloudflare customers are already doing this.</p><p>Now, if you have iOS 16 on your iPhone, it’s your turn.</p> ]]></content:encoded>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Partners]]></category>
            <guid isPermaLink="false">6cNycZdugSo0vV1oXpCPVi</guid>
            <dc:creator>João Tomé</dc:creator>
        </item>
        <item>
            <title><![CDATA[Private Access Tokens: eliminating CAPTCHAs on iPhones and Macs with open standards]]></title>
            <link>https://blog.cloudflare.com/eliminating-captchas-on-iphones-and-macs-using-new-standard/</link>
            <pubDate>Wed, 08 Jun 2022 16:01:46 GMT</pubDate>
            <description><![CDATA[ Today we’re announcing Private Access Tokens, a completely invisible, private way to validate that real users are visiting your site ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1MXprIYDqrhnoQhWnQ9V5x/b7e3b0d906f122a54dbca8f3636de8d6/Private-Authentication-Token-open-source-standard-to-eliminate-CAPTCHAs.png" />
            
            </figure><p>Today we’re announcing Private Access Tokens, a completely invisible, private way to validate that real users are visiting your site. Visitors using operating systems that support these tokens, including <a href="https://developer.apple.com/wwdc22/10077">the upcoming versions of macOS or iOS</a>, can now prove they’re human without completing a CAPTCHA or giving up personal data. This will eliminate nearly 100% of CAPTCHAs served to these users.</p><p>What does this mean for you?</p><p>If you’re an Internet user:</p><ul><li><p>We’re making your mobile web experience more pleasant and more private than other networks at the same time.</p></li><li><p>You won’t see a CAPTCHA on a supported iOS or Mac device (other devices coming soon!) accessing the Cloudflare network.</p></li></ul><p>If you’re a web or application developer:</p><ul><li><p>Know your user is coming from an authentic device and signed application, verified by the device vendor directly.</p></li><li><p>Validate users without maintaining a cumbersome SDK.</p></li></ul><p>If you’re a Cloudflare customer:</p><ul><li><p>You don’t have to do anything!  Cloudflare will automatically ask for and utilize Private Access Tokens</p></li><li><p>Your visitors won’t see a CAPTCHA, and we’ll ask for less data from their devices.</p></li></ul>
    <div>
      <h3>Introducing Private Access Tokens</h3>
      <a href="#introducing-private-access-tokens">
        
      </a>
    </div>
    <p>Over the past year, Cloudflare has collaborated with Apple, Google, and other industry leaders to extend the <a href="https://www.ietf.org/archive/id/draft-ietf-privacypass-auth-scheme-01.html">Privacy Pass protocol</a> with support for a new cryptographic token. These tokens simplify application security for developers and security teams, and obsolete legacy, third-party SDK based approaches to determining if a human is using a device. They work for browsers, APIs called by browsers, and APIs called within apps. We call these new tokens Private Access Tokens (PATs). This morning, <a href="https://developer.apple.com/wwdc22/10077">Apple announced that PATs will be incorporated</a> into iOS 16, iPad 16, and macOS 13, and we expect additional vendors to announce support in the near future.</p><p>Cloudflare has already incorporated PATs into our <a href="/end-cloudflare-captcha/">Managed Challenge platform</a>, so any customer using this feature will automatically take advantage of this new technology to improve the browsing experience for supported devices.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2t6bhh7vQcRRbOVZheNgPH/53dcccd448967d62b28d7e4b77bbe376/image2-4.png" />
            
            </figure>
    <div>
      <h3>CAPTCHAs don’t work in mobile environments, PATs remove the need for them</h3>
      <a href="#captchas-dont-work-in-mobile-environments-pats-remove-the-need-for-them">
        
      </a>
    </div>
    <p>We’ve <a href="/end-cloudflare-captcha/">written</a> <a href="/introducing-cryptographic-attestation-of-personhood/">numerous</a> <a href="/moving-from-recaptcha-to-hcaptcha/">times</a> about how CAPTCHAs are a terrible user experience. However, we haven’t discussed specifically how much worse the user experience is on a mobile device. CAPTCHA as a technology was built and optimized for a browser-based world. They are deployed via a widget or iframe that is generally one size fits all, leading to rendering issues, or the input window only being partially visible on a device. The smaller real estate on mobile screens inherently makes the technology less accessible and solving any CAPTCHA more difficult, and the need to render JavaScript and image files slows down image loads while consuming excess customer bandwidth.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1nIPAH3gWctx5emjDD4Yp4/0f4843b09702b44e53e95aff6ca305ab/image5-2.png" />
            
            </figure><p>Usability aside, mobile environments present an additional challenge in that they are increasingly <a href="https://www.cloudflare.com/learning/security/api/what-is-an-api/">API-driven</a>. CAPTCHAs simply cannot work in an API environment where JavaScript can’t be rendered, or a WebView can’t be called. So, mobile app developers often have no easy option for challenging a user when necessary. They sometimes resort to using a clunky SDK to embed a CAPTCHA directly into an app. This requires work to embed and customize the CAPTCHA, continued maintenance and monitoring, and results in higher abandonment rates. For these reasons, when our customers choose to show a CAPTCHA today, it's only shown on mobile 20% of the time.</p><p>We recently posted about how we used our Managed Challenge platform to <a href="/end-cloudflare-captcha/">reduce our CAPTCHA use by 91%</a>. But because the CAPTCHA experience is so much worse on mobile, we’ve been separately working on ways we can specifically reduce CAPTCHA use on mobile even further.</p>
    <div>
      <h3>When sites can’t challenge a visitor, they collect more data</h3>
      <a href="#when-sites-cant-challenge-a-visitor-they-collect-more-data">
        
      </a>
    </div>
    <p>So, you either can’t use CAPTCHA to protect an API, or the UX is too terrible to use on your mobile website. What options are left for confirming whether a visitor is real? A common one is to look at client-specific data, commonly known as fingerprinting.</p><p>You could ask for device IMEI and security patch versions, look at screen sizes or fonts, check for the presence of APIs that indicate human behavior, like interactive touch screen events and compare those to expected outcomes for the stated client. However, all of this data collection is expensive and, ultimately, not respectful of the end user. As a company that deeply cares about privacy and helping make the Internet better, we want to use as little data as possible without compromising the security of the services we provide.</p><p>Another alternative is to use system-level APIs that offer device validation checks. This includes <a href="https://developer.apple.com/documentation/devicecheck">DeviceCheck</a> on Apple platforms and <a href="https://developer.android.com/training/safetynet/attestation">SafetyNet</a> on Android. <a href="https://www.cloudflare.com/application-services/">Application services</a> can use these client APIs with their own services to assert that the clients they’re communicating with are valid devices. However, adopting these APIs requires both application and server changes, and can be just as difficult to maintain as SDKs.</p>
    <div>
      <h3>Private Access Tokens vastly improve privacy by validating without fingerprinting</h3>
      <a href="#private-access-tokens-vastly-improve-privacy-by-validating-without-fingerprinting">
        
      </a>
    </div>
    <p>This is the most powerful aspect of PATs. By partnering with third parties like device manufacturers, who already have the data that would help us validate a device, we are able to abstract portions of the validation process, and confirm data <b><i>without actually collecting</i></b><i>, </i><b><i>touching, or storing that data ourselves</i></b>. Rather than interrogating a device directly, we ask the device vendor to do it for us.</p><p>In a traditional website setup, using the most common CAPTCHA provider:</p><ul><li><p>The website you visit knows the URL, your IP, and some additional user agent data.</p></li><li><p>The CAPTCHA provider knows what website you visit, your IP, your device information, collects interaction data on the page, AND ties this data back to other sites where they have seen you. This builds a profile of your browsing activity across both sites and devices, plus how you personally interact with a page.</p></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2vnMi2aTbGheZegJ6jupiC/e7631b1b0b279ce7f8524cafcbc21ce7/Screen-Shot-2022-06-07-at-10.24.12-AM.png" />
            
            </figure><p>When PATs are used, device data is isolated and explicitly NOT exchanged between the involved parties (the manufacturer and Cloudflare)</p><ul><li><p>The website knows only your URL and IP, which it has to know to make a connection.</p></li><li><p>The device manufacturer (attester) knows only the device data required to attest your device, but can't tell what website you visited, and doesn’t know your IP.</p></li><li><p>Cloudflare knows the site you visited, but doesn’t know any of your device or interaction information.</p></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6vRC2wIaTHgP8zLJ8EJIO5/f87537648020532a565a1636254685c2/image3-2.png" />
            
            </figure><p>We don’t actually need or want the underlying data that’s being collected for this process, we just want to verify if a visitor is faking their device or user agent. Private Access Tokens allow us to capture that validation state directly, without needing any of the underlying data. They allow us to be more confident in the authenticity of important signals, without having to look at those signals directly ourselves.</p>
    <div>
      <h3>How Private Access Tokens compartmentalize data</h3>
      <a href="#how-private-access-tokens-compartmentalize-data">
        
      </a>
    </div>
    <p>With <a href="https://www.ietf.org/archive/id/draft-ietf-privacypass-auth-scheme-01.html#name-security-considerations">Private Access Tokens</a>, four parties agree to work in concert with a common framework to generate and exchange anonymous, unforgeable tokens. Without all four parties in the process, PATs won’t work.</p><ol><li><p>An <b>Origin</b>. A website, application, or API that receives requests from a client. When a website receives a request to their origin, the origin must know to look for and request a token from the client making the request. For Cloudflare customers, Cloudflare acts as the origin (on behalf of customers) and handles the requesting and processing of tokens.</p></li><li><p>A <b>Client</b>. Whatever tool the visitor is using to attempt to access the Origin. This will usually be a web browser or mobile application. In our example, let’s say the client is a <a href="https://developer.apple.com/wwdc22/10077">mobile Safari Browser</a>.</p></li><li><p>An <b>Attester</b>. The Attester is who the client asks to prove something (i.e that a mobile device has a valid IMEI) before a token can be issued. In our example below, the Attester is Apple, the device vendor.</p></li><li><p>An <b>Issuer</b>. The issuer is the only one in the process that actually generates, or issues, a token. The Attester makes an API call to whatever Issuer the Origin has chosen to trust,  instructing the Issuer to produce a token. In our case, Cloudflare will also be the Issuer.</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4ho7MHd8tHAhHpStG8ItWQ/51b3f08744f6ceb855fbb2fc4c623930/Screen-Shot-2022-06-07-at-2.01.38-PM.png" />
            
            </figure><p>In the example above, a visitor opens the Safari browser on their iPhone and tries to visit example.com.</p><ol><li><p>Since Example uses Cloudflare to host their Origin, Cloudflare will ask the browser for a token.</p></li><li><p>Safari supports PATs, so it will make an API call to Apple’s Attester, asking them to attest.</p></li><li><p>The Apple attester will check various device components, confirm they are valid, and then make an API call to the Cloudflare Issuer (since Cloudflare acting as an Origin chooses to use the Cloudflare Issuer).</p></li><li><p>The Cloudflare Issuer generates a token, sends it to the browser, which in turn sends it to the origin.</p></li><li><p>Cloudflare then receives the token, and uses it to determine that we don’t need to show this user a CAPTCHA.</p></li></ol><p>This probably sounds a bit complicated, but the best part is that <b><i>the website took no action</i></b> in this process. Asking for a token, validation, token generation, passing, all takes place behind the scenes by third parties that are invisible to both the user and the website. By working together, Apple and Cloudflare have just made this request more secure, reduced the data passed back and forth, and prevented a user from having to see a CAPTCHA. And we’ve done it by both collecting and exchanging less user data than we would have in the past.</p>
    <div>
      <h3>Most customers won’t have to do anything to utilize Private Access Tokens</h3>
      <a href="#most-customers-wont-have-to-do-anything-to-utilize-private-access-tokens">
        
      </a>
    </div>
    <p>To take advantage of PATs, all you have to do is choose Managed Challenge rather than Legacy CAPTCHA as a response option in a Firewall rule. More than 65% of Cloudflare customers are already doing this. Our Managed Challenge platform will automatically ask every request for a token, and when the client is compatible with Private Access Tokens, we’ll receive one. Any of your visitors using an iOS or macOS device will automatically start seeing fewer CAPTCHAs once they’ve upgraded their OS.</p><p>This is just step one for us. We are actively working to get other clients and device makers utilizing the PAT framework as well. Any time a new client begins utilizing the PAT framework, traffic coming to your site from that client will automatically start asking for tokens, and your visitors will automatically see fewer CAPTCHAs.</p><p>We will be incorporating PATs into other security products very soon. Stay tuned for some announcements in the near future.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Partners]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">0uuhhCXz6zKtDutK7x0yh</guid>
            <dc:creator>Reid Tatoris</dc:creator>
            <dc:creator>Maxime Guerreiro</dc:creator>
        </item>
        <item>
            <title><![CDATA[The end of the road for Cloudflare CAPTCHAs]]></title>
            <link>https://blog.cloudflare.com/end-cloudflare-captcha/</link>
            <pubDate>Fri, 01 Apr 2022 13:31:08 GMT</pubDate>
            <description><![CDATA[ We decided we’re going to stop using CAPTCHAs. Before we talk about how we did it, and how you can help, let's first start with a simple question. Why in the world is CAPTCHA still used anyway? ]]></description>
            <content:encoded><![CDATA[ <p></p><p>There is no point in rehashing the fact that <a href="https://www.cloudflare.com/learning/bots/how-captchas-work/">CAPTCHA</a> provides a terrible user experience. It's been discussed in detail before <a href="/moving-from-recaptcha-to-hcaptcha/">on this blog</a>, and countless times elsewhere. One of the creators of the CAPTCHA has publicly lamented that he “unwittingly created a system that was <a href="https://thewalrus.ca/human-resources/">frittering away, in ten-second increments, millions of hours</a> of a most precious resource: human brain cycles.” We don’t like them, and you don’t like them.</p><p>So we decided we’re going to stop using CAPTCHAs. Using an iterative platform approach, <b>we have already reduced the number of CAPTCHAs we choose to serve by 91%</b> over the past year.</p><p>Before we talk about how we did it, and how you can help, let's first start with a simple question.</p>
    <div>
      <h3>Why in the world is CAPTCHA still used anyway?</h3>
      <a href="#why-in-the-world-is-captcha-still-used-anyway">
        
      </a>
    </div>
    <p>If everyone agrees CAPTCHA is so bad, if there have been calls to get rid of it for 15 years, if the creator regrets creating it, why is it still widely used?</p><p>The frustrating truth is that CAPTCHA remains an effective tool for differentiating real human users from bots despite the existence of CAPTCHA-solving services. Of course, this comes with a huge trade off in terms of usability, but generally the alternatives to CAPTCHA are blocking or allowing traffic, which will inherently increase either false positives or false negatives. With a choice between increased errors and a poor user experience (CAPTCHA), many sites choose CAPTCHA.</p><p>CAPTCHAs are also a safe choice because so many other sites use them. They delegate abuse response to a third party, and remove the risk from the website with a simple integration. Using the most common solution will rarely get you into trouble. Plug, play, forget.</p><p>Lastly, CAPTCHA is useful because it has a long history of a known and stable baseline. We’ve tracked a metric called CAPTCHA (or Challenge) Solve Rate for many years. CAPTCHA solve rate is the number of CAPTCHAs solved, divided by the number of page loads. For our purposes both failing or not attempting to solve the CAPTCHA count as a failure, since in either case a user cannot access the content they want to. We find this metric to typically be stable for any particular website. That is, if the solve rate is 1%, it tends to remain at 1% over time. We also find that any change in solve rate – up or down – is a strong indicator of an attack in progress. <a href="https://developers.cloudflare.com/bots/concepts/challenge-solve-rate/">Customers can scan their logs to monitor for solve rate</a> changes, then investigate what might be happening.</p><p>Many alternatives to CAPTCHA have been tried, including our own <a href="/introducing-cryptographic-attestation-of-personhood/">Cryptographic Attestation</a>. However, to date, none have seen the amount of widespread adoption of CAPTCHAs. We believe attempting to replace CAPTCHA with a single alternative is the main reason why. When you replace CAPTCHA, you lose the stable history of the solve rate, and making decisions becomes more difficult. If you switch from deciphering text to picking images, you will get vastly different results. How do you know if those results are good or bad? So, we took a different approach.</p>
    <div>
      <h3>Many solutions, not one</h3>
      <a href="#many-solutions-not-one">
        
      </a>
    </div>
    <p>Rather than try to unilaterally deprecate and replace CAPTCHA with a single alternative, we built a platform to test many alternatives and see which had the best potential to replace CAPTCHA. We call this Cloudflare Managed Challenge.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/bea8fFfhozl0zs4YaANEV/b993fdc8ae1922c672464db938c5b984/image3.png" />
            
            </figure><p>Managed Challenge is a smarter solution than CAPTCHA. It defers the decision about whether to serve a visual puzzle to a later point in the flow after more information is available from the browser. Previously, a Cloudflare customer could only choose between either a CAPTCHA or JavaScript Challenge as the action of a security or firewall rule. Now, the Managed Challenge option will decide to show a visual puzzle or other means of proving humanness to visitors based on the client behavior exhibited <i>during</i> a challenge and based on the telemetry we receive from the visitor. A customer simply tells us, "<i>I want you (Cloudflare) to take appropriate actions to challenge this type of traffic as you see necessary.</i>"</p><p>With Managed Challenge, we adapt the actual challenge outcome to the individual visitor/browser. As a result, we can fine-tune the difficulty of the challenge itself and avoid showing visual puzzles to more than 90% of human requests, while at the same time presenting harder challenges to visitors that exhibit non-human behaviors.</p><p>When a visitor encounters a Managed Challenge, we first run a series of small non-interactive JavaScript challenges gathering more signals about the visitor/browser environment. This means we deploy in-browser detections and challenges at the time the request is made. Challenges are selected based on what characteristics the visitor emits and based on the initial information we have about the visitor. Those challenges include, but are not limited to, proof-of-work, proof-of-space, probing for web APIs, and various challenges for detecting browser-quirks and human behavior.</p><p>They also include <a href="https://www.cloudflare.com/learning/ai/what-is-machine-learning/">machine learning models</a> that detect common features of end visitors who were able to pass a CAPTCHA before. The computational hardness of those initial challenges may vary by visitor, but is targeted to run fast. Managed Challenge is also integrated into the <a href="/cloudflare-bot-management-machine-learning-and-more/">Cloudflare Bot Management</a> and <a href="/super-bot-fight-mode/">Super Bot Fight Mode</a> systems by consuming signals and data from the bot detections.</p><p>After our non-interactive challenges have been run, we evaluate the gathered signals. If by the combination of those signals we are confident that the visitor is likely human, no further action is taken, and the visitor is redirected to the destined page without any interaction required. However, in some cases, if the signal is weak, we present a visual puzzle to the visitor to prove their humanness. In the context of Managed Challenge, we’re also experimenting with <a href="/introducing-cryptographic-attestation-of-personhood/">other privacy-preserving means of attesting</a> humanness, to continue reducing the portion of time that Managed Challenge uses a visual puzzle step.</p><p>We started testing Managed Challenge last year, and initially, we chose from a rotating subset of challenges, one of them being CAPTCHA. At the start, CAPTCHA was still used in the vast majority of cases. We compared the solve rate for the new challenge in question, with the existing, stable solve rate for CAPTCHA. We thus used CAPTCHA solve rate as a goal to work towards as we improved our CAPTCHA alternatives, getting better and better over time. The challenge platform allows our engineers to easily create, deploy, and test new types of challenges without impacting customers. When a challenge turns out to not be useful, we simply deprecate it. When it proves to be useful, we increase how often it is used. In order to preserve ground-truth, we also randomly choose a small subset of visitors to always solve a visual puzzle to validate our signals.</p>
    <div>
      <h3>Managed Challenge performs better than CAPTCHA</h3>
      <a href="#managed-challenge-performs-better-than-captcha">
        
      </a>
    </div>
    <p>The Challenge Platform now has the same stable solve rate as previously used CAPTCHAs.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4OBYoKWypTH4XZbBFzKWdS/1385d0b02278881fcacb3caeac86e447/image4.png" />
            
            </figure><p>Using an iterative platform approach, <b>we have reduced the number of CAPTCHAs we serve by 91%</b>. This is only the start. By the end of the year, we will reduce our use of CAPTCHA as a challenge to less than 1%. By skipping the visual puzzle step for almost all visitors, we are able to reduce the visitor time spent in a challenge from an average of 32 seconds to an average of just one second to run our non-interactive challenges. We also see churn improvements: our telemetry indicates that visitors with human properties are <b>31% less likely to abandon</b> a Managed Challenge than on the traditional CAPTCHA action.</p><p>Today, the Managed Challenge platform rotates between many challenges. A Managed Challenge instance consists of many sub-challenges: some of them are established and effective, whereas others are new challenges we are experimenting with. All of them are much, much faster and easier for humans to complete than CAPTCHA, and almost always require no interaction from the visitor.</p>
    <div>
      <h3>Managed Challenge replaces CAPTCHA for Cloudflare</h3>
      <a href="#managed-challenge-replaces-captcha-for-cloudflare">
        
      </a>
    </div>
    <p>We have now deployed Managed Challenge across the entire Cloudflare network. Any time we show a CAPTCHA to a visitor, it’s via the Managed Challenge platform, and only as a benchmark to confirm our other challenges are performing as well.</p><p>All Cloudflare customers can now <a href="https://developers.cloudflare.com/firewall/cf-firewall-rules/actions/">choose Managed Challenge</a> as a response option to any Firewall rule instead of CAPTCHA. We’ve also updated our dashboard to encourage all Cloudflare customers to make this choice.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4DuK6g4cLulBlDRNGQIbDb/0be6f7f969b976731333449a4df6bea0/image5.png" />
            
            </figure><p>You’ll notice that we changed the name of the CAPTCHA option to ‘Legacy CAPTCHA’. This more accurately describes what CAPTCHA is: an outdated tool that we don’t think people should use. As a result, the usage of CAPTCHA across the Cloudflare network has dropped significantly, and usage of managed challenge has increased dramatically.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4TZAEqYf9KGS3YrrFZAcec/e9b5173caedfae16fcc1362629de437d/image2-1.png" />
            
            </figure><p>As noted above, today CAPTCHA represents 9% of Managed Challenge solves (light blue), but that number will decrease to less than 1% by the end of the year. You’ll also see the gray bar above, which shows when our customers have chosen to show a CAPTCHA as a response to a Firewall rule triggering. We want that number to go to zero, but the good news is that 63% of customers now choose Managed Challenge rather than CAPTCHA when they create a Firewall rule with a challenge response action.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3esUPPcHGlKTY5oYoatGHK/c6c5063878186c2ed55320799458d3d0/image6.png" />
            
            </figure><p>We expect this number to increase further over time.</p><p>If you’re using the Cloudflare WAF, <a href="https://dash.cloudflare.com/?to=/:account/:zone/security/waf/firewall-rules">log into the Dashboard</a> today and look at all of your Firewall rules. If any of your rules are using “<i>Legacy CAPTCHA”</i> as a response, please change it now! Select the “<i>Managed Challenge</i>” response option instead. You’ll give your users a better experience, while maintaining the same level of protection you have today. If you’re not currently a Cloudflare customer, stay tuned for ways you can reduce your own use of CAPTCHA.</p> ]]></content:encoded>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[WAF]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Bots]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">40gb1Z00ELZoco7W5bc09a</guid>
            <dc:creator>Reid Tatoris</dc:creator>
            <dc:creator>Benedikt Wolters</dc:creator>
        </item>
        <item>
            <title><![CDATA[Privacy Pass v3: the new privacy bits]]></title>
            <link>https://blog.cloudflare.com/privacy-pass-v3/</link>
            <pubDate>Tue, 12 Oct 2021 12:59:19 GMT</pubDate>
            <description><![CDATA[ A new version of Privacy Pass for reducing the number of CAPTCHAs. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>In November 2017, we <a href="/cloudflare-supports-privacy-pass/">released</a> our implementation of a privacy preserving protocol to let users prove that they are humans without enabling tracking. When you install <a href="https://privacypass.github.io/">Privacy Pass’s browser extension</a>, you get tokens when you solve a Cloudflare CAPTCHA which can be used to avoid needing to solve one again... The redeemed token is cryptographically unlinkable to the token originally provided by the server. That is why Privacy Pass is privacy preserving.</p><p>In October 2019, Privacy Pass reached another milestone. We released <a href="/supporting-the-latest-version-of-the-privacy-pass-protocol/">Privacy Pass Extension v2.0</a> that includes a <a href="https://www.hcaptcha.com/privacy-pass">new service provider</a> (hCaptcha) which provides a way to redeem a token not only with CAPTCHAs in the Cloudflare challenge pages but also hCaptcha CAPTCHAs in any website. When you encounter any hCaptcha CAPTCHA in any website, including the ones not behind Cloudflare, you can redeem a token to pass the CAPTCHA.</p><p>We believe Privacy Pass solves an important problem — balancing privacy and security for bot mitigation— but we think there’s more to be done in terms of both the <a href="https://github.com/privacypass/challenge-bypass-extension/tree/v3-rc">codebase</a> and the protocol. We improved the codebase by redesigning how the service providers interact with the core extension. At the same time, we made progress on the standardization at IETF and improved the protocol by adding metadata which allows us to do more fabulous things with Privacy Pass.</p>
    <div>
      <h2>Announcing Privacy Pass Extension v3.0</h2>
      <a href="#announcing-privacy-pass-extension-v3-0">
        
      </a>
    </div>
    <p>The current implementation of our extension is functional, but it is difficult to maintain two Privacy Pass service providers: Cloudflare and hCaptcha. So we decided to <a href="https://www.cloudflare.com/learning/cloud/how-to-refactor-applications/">refactor</a> the browser extension to improve its maintainability. We also used this opportunity to make following improvements:</p><ul><li><p>Implement the extension using TypeScript instead of plain JavaScript.</p></li><li><p>Build the project using a module bundler instead of custom build scripts.</p></li><li><p>Refactor the code and define the API for the cryptographic primitive.</p></li><li><p>Treat provider-specific code as an encapsulated software module rather than a list of configuration properties.</p></li></ul><p>As a result of the improvements listed above, the extension will be less error-prone and each service provider will have more flexibility and can be integrated seamlessly with other providers.</p><p>In the new extension we use TypeScript instead of plain JavaScript because its syntax is a kind of extension to JavaScript, and we already use TypeScript in <a href="/bootstrapping-a-typescript-worker/">Workers</a>. One of the things that makes TypeScript special is that it has features that are only available in modern programming languages, like <a href="https://en.wikipedia.org/wiki/Void_safety">null safety</a>.</p>
    <div>
      <h2>Support for Future Service Providers</h2>
      <a href="#support-for-future-service-providers">
        
      </a>
    </div>
    <p>Another big improvement in v3.0 is that it is designed for modularity, meaning that it will be very easy to add a new potential service provider in the future. A new provider can use an API provided by us to implement their own request flow to use the Privacy Pass protocol and to handle the HTTP requests. By separating the provider-specific code from the core extension code using the API, the extension will be easier to update when there is a need for more service providers.</p><p>On a technical level, we allow each service provider to have its own <a href="https://developer.chrome.com/extensions/webRequest">WebRequest API</a> event listeners instead of having central event listeners for all the providers. This allows providers to extend the browser extension's functionality and implement any request handling logic they want.</p><p>Another major change that enables us to do this is that we moved away from configuration to programmable modularization.</p>
    <div>
      <h2>Configuration vs Modularization</h2>
      <a href="#configuration-vs-modularization">
        
      </a>
    </div>
    <p><a href="/supporting-the-latest-version-of-the-privacy-pass-protocol/">As mentioned in 2019</a>, it would be impossible to expect different service providers to all abide by the same exact request flow, so we decided to use a JSON configuration file in v2.0 to define the request flow. The configuration allows the service providers to easily modify the extension characteristics without dealing too much with the core extension code. However, recently we figured out that we can improve it without using a configuration file, and using modules instead.</p><p>Using a configuration file limits the flexibility of the provider by the number of possible configurations. In addition, when the logic of each provider evolves and deviates from one another, the size of configuration will grow larger and larger which makes it hard to document and keep track of. So we decided to refactor how we determine the request flow from using a configuration file to using a module file written specifically for each service provider instead.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/34G52zSZ9ukkaa0h079EBV/287aaf7e3245f7fe1071ee0d4270a95f/image2-19.png" />
            
            </figure><p>By using a programmable module, the providers are not limited by the available fields in the configuration. In addition, the providers can use the available implementations of the necessary cryptographic primitives in any point of the request flow because we factored out the crypto bits into a separate module which can be used by any provider. In the future, if the cryptographic primitives ever change, the providers can update the code and use it any time.</p>
    <div>
      <h2>Towards Standard Interoperability</h2>
      <a href="#towards-standard-interoperability">
        
      </a>
    </div>
    <p>The Privacy Pass protocol was first published at the <a href="https://www.petsymposium.org/2018/files/papers/issue3/popets-2018-0026.pdf">PoPETS</a> symposium in 2018. As explained in this <a href="/privacy-pass-the-math/">previous post</a>, the core of the Privacy Pass protocol is a secure way to generate tokens between server and client. To that end, the protocol requires evaluating a pseudorandom function that is oblivious and verifiable. The first property prevents the server from learning information about the client’s tokens, while the client learns nothing about the server’s private key. This is useful to protect the privacy of users. The token generation must also be verifiable in the sense that the client can attest to the fact that its token was minted using the server’s private key.</p><p>The original implementation of Privacy Pass has seen real-world use in our browser extension, helping to reduce CAPTCHAs for hundreds of thousands of people without compromising privacy. But to guarantee interoperability between services implementing Privacy Pass, what's required is an accurate specification of the protocol and its operations. With this motivation, the Privacy Pass protocol was proposed as an Internet draft at the <a href="https://www.ietf.org/">Internet Engineering Task Force</a> (IETF) — to know more about our participation at IETF <a href="/cloudflare-and-the-ietf">look at the post</a>.</p><p>In March 2020, the protocol was presented at IETF-107 for the first time. The session was a <a href="https://www.ietf.org/how/bofs/">Birds-of-a-Feather</a>, a place where the IETF community discusses the creation of new working groups that will write the actual standards. In the session, the working group’s charter is presented and proposes to develop a secure protocol for redeeming unforgeable tokens that attest to the validity of some attribute being held by a client. The charter was later approved, and three documents were integrated covering the protocol, the architecture, and an HTTP API for supporting Privacy Pass. The working group at IETF can be found at <a href="https://datatracker.ietf.org/wg/privacypass/about/">https://datatracker.ietf.org/wg/privacypass/</a>.</p><p>Additionally, to its core functionality, the Privacy Pass protocol can be extended to improve its usability or to add new capabilities. For instance, adding a mechanism for public verifiability will allow a third party, someone who did not participate in the protocol, to verify the validity of tokens. Public verifiability can be implemented using a <i>blind-signature scheme</i> — this is a special type of digital signatures firstly proposed by <a href="https://link.springer.com/chapter/10.1007/978-1-4757-0602-4_18">David Chaum</a> in which signers can produce signatures on messages without learning the content of the message. A diversity of algorithms to implement blind-signatures exist; however, there is still work to be done to define a good candidate for public verifiability.</p><p>Another extension for Privacy Pass is the support for including metadata in the tokens. As this is a feature with high impact on the protocol, we devote a larger section to explain the benefits of supporting metadata in the face of hoarding attacks.</p>
    <div>
      <h2>Future work: metadata</h2>
      <a href="#future-work-metadata">
        
      </a>
    </div>
    <p>What is research without new challenges that arise? What does development look like if there are no other problems to solve? During the design and development of Privacy Pass (both as a service, as an idea, and as a protocol), a potential vector for abuse was noted, which will be referred to as a “hoarding” or “farming” attack. This attack consists of individual users or groups of users that can gather tokens over a long period of time and redeem them all at once with the aim of, for example, overwhelming a website and making the service unavailable for other users. In a more complex scenario, an attacker can build up a stock of tokens that they could then redistribute amongst other clients. This redistribution ability is possible as tokens are not linked to specific clients, which is a property of the Privacy Pass protocol.</p><p>There have been several proposed solutions to this attack. One can, for example, make the verification of tokens procedure very efficient, so attackers will need to hoard an even larger amount of tokens in order to overwhelm a service. But the problem is not only about making verification times faster, and, therefore, this does not completely solve the problem. Note that in Privacy Pass, a successful token redemption could be exchanged for a single-origin cookie. These cookies allow clients to avoid future challenges for a particular domain without using more tokens. In the case of a hoarding attack, an attacker could trade in their hoarded number of tokens for a number of cookies. An attacker can, then, mount a layer 7 DDoS attack with the “hoarded” cookies, which would render the service unavailable.</p><p>In the next sections, we will explore other different solutions to this attack.</p>
    <div>
      <h3>A simple solution and its limitations: key rotation</h3>
      <a href="#a-simple-solution-and-its-limitations-key-rotation">
        
      </a>
    </div>
    <p>What does “key rotation” mean in the context of Privacy Pass? In Privacy Pass, each token is attested by keys held by the service. These keys are further used to verify the honesty of a token presented by a client when trying to access a challenge-protected service. “Key rotation” means updating these keys with regard to a chosen epoch (meaning, for example, that every two weeks — the epoch —, the keys will be rotated). Regular key rotation, then, implies that tokens belong to these epochs and cannot be used outside them, which prevents stocks of tokens from being useful for longer than the epoch they belong to.</p><p>Keys, however, should not be rotated frequently as:</p><ul><li><p>Rotating a key can lead to security implications</p></li><li><p>Establishing trust in a frequently-rotating key service can be a challenging problem</p></li><li><p>The unlinkability of the client when using tokens can be diminished</p></li></ul><p>Let’s explore these problems one by one now:</p><p><b>Rotating a key can lead to security implications</b>, as past keys need to be deleted from secure storage locations and replaced with new ones. This process is prone to failure if done regularly, and can lead to potential key material leakage.</p><p><b>Establishing trust in a frequently-rotating key service</b> can be a challenging problem, as keys will have to be verified by the needed parties each time they are regenerated. Keys need to be verified as it has to be attested that they belong to the entity one is trying to communicate with. If keys rotate too frequently, this verification procedure will have to happen frequently as well, so that an attacker will not be able to impersonate the honest entity with a “fake” public key.</p><p><b>The unlinkability of the client when using tokens can be diminished</b> as a savvy attacker (a malicious server, for example) could link token generation and token future-use. In the case of a malicious server, it can, for example, rotate their keys too often to violate unlinkability or could pick a separate public key for each client issuance. In these cases, this attack can be solved by the usage of public mechanisms to record which server’s public keys are used; but this requires further infrastructure and coordination between actors. Other cases are not easily solvable by this “public verification”: if keys are rotated every minute, for example, and a client was the only one to visit a “privacy pass protected” site in that minute, then, it's not hard to infer (to “link”) that the token came only from this specific client.</p>
    <div>
      <h3>A novel solution: Metadata</h3>
      <a href="#a-novel-solution-metadata">
        
      </a>
    </div>
    <p>A novel solution to this “hoarding” problem that does not require key rotation or further optimization of verification times is the addition of metadata. This approach was introduced in the paper “<a href="https://eprint.iacr.org/2021/864.pdf">A Fast and Simple Partially Oblivious PRF, with Applications</a>”, and it is called the “POPRF with metadata” construction. The idea is to add a metadata field to the token generation procedure in such a way that tokens are cryptographically linked to this added metadata. The added metadata can be, for example, a number that signals which epoch this token belongs to. The service, when presented with this token on verification, promptly checks that it corresponds to its internal epoch number (this epoch number can correspond to a period of time, a threshold of number of tokens issued, etc.). If it does not correspond, this token is expired and cannot be further used. Metadata, then, can be used to expire tokens without performing key rotations, thereby avoiding some issues outlined above.</p><p>Other kinds of metadata can be added to the Partially Oblivious PRF (PO-PRF) construction as well. Geographic location can be added, which signals that tokens can only be used in a specific region.</p>
    <div>
      <h3>The limits of metadata</h3>
      <a href="#the-limits-of-metadata">
        
      </a>
    </div>
    <p>Note, nevertheless, that the addition of this “metadata” should be carefully considered as adding, in the case of “time-metadata”, an explicit time bound signal will diminish the unlikability set of the tokens. If an explicit time-bound signal is added (for example, the specific time — year, month, day, hour, minute and seconds — in which this token was generated and the amount of time it is valid for), it will allow a malicious server to link generation and usage. The recommendation is to use “opaque metadata”: metadata that is public to both client and service but that only the service knows its precise meaning. A server, for example, can set a counter that gets increased after a period of time (for example, every two weeks). The server will add this counter as metadata rather than the period of time. The client, in this case, publicly knows what this counter is but does not know to which period it refers to.</p><p>Geographic location metadata should be coarse as well: it should refer to a large geographical area, such as a continent, or political and economic union rather than an explicit location.</p>
    <div>
      <h2>Wrap up</h2>
      <a href="#wrap-up">
        
      </a>
    </div>
    <p>The Privacy Pass protocol provides users with a secure way for redeeming tokens. At Cloudflare, we use the protocol to reduce the number of CAPTCHAs improving the user experience while browsing websites. A natural evolution of the protocol is expected, ranging from its standardization to innovating with new capabilities that help to prevent abuse of the service.</p><p>On the service side, we refactored the Privacy Pass browser extension aiming to improve the quality of the code, so bugs can be detected in earlier phases of the development. The code is available at the <a href="https://github.com/privacypass/challenge-bypass-extension/tree/v3-rc">challenge-bypass-extension</a> repository, and we invite you to try the release candidate version.</p><p>An appealing extension for Privacy Pass is the inclusion of metadata as it provides a non-cumbersome way to solve hoarding attacks, while preserving the anonymity (in general, the privacy) of the protocol itself. <a href="https://eprint.iacr.org/2021/864.pdf">Our paper</a> provides you more information about the technical details behind this idea.</p><p>The application of the Privacy Pass protocol in other use cases or to create other service providers requires a certain degree of compatibility. People wanting to implement Privacy Pass must be able to have a standard specification, so implementations can interoperate. The efforts along these lines are centered on the <a href="https://datatracker.ietf.org/wg/privacypass/about/">Privacy Pass working group</a> at IETF, a space open for anyone to participate in delineating the future of the protocol. Feel free to be part of these efforts too.</p><p>We are continuously working on new ways of improving our services and helping the Internet be a better and a more secure place. You can join us on this effort and can reach us at <a href="https://research.cloudflare.com">research.cloudflare.com</a>. See you next time.</p> ]]></content:encoded>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Privacy Pass]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <guid isPermaLink="false">nnk7WdvORjw4nOJUFyE1z</guid>
            <dc:creator>Pop Chunhapanya</dc:creator>
            <dc:creator>Armando Faz-Hernández</dc:creator>
            <dc:creator>Sofía Celi</dc:creator>
        </item>
        <item>
            <title><![CDATA[Humanity wastes about 500 years per day on CAPTCHAs. It’s time to end this madness]]></title>
            <link>https://blog.cloudflare.com/introducing-cryptographic-attestation-of-personhood/</link>
            <pubDate>Thu, 13 May 2021 13:00:00 GMT</pubDate>
            <description><![CDATA[ We want to remove CAPTCHAs completely. The idea is rather simple: a real human should be able to touch or look at their device to prove they are human, without revealing their identity. Let's explore! ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Select all the buses. Click on bikes. Does this photo have traffic lights? As ridiculous as these questions are, you’re almost guaranteed to have seen one recently. They are a way for online services to separate humans from bots, and they’re called <a href="https://en.wikipedia.org/wiki/CAPTCHA">CAPTCHAs</a>. CAPTCHAs strengthen the security of online services. But while they do that, there’s a very real cost associated with them.</p><p>Based on our data, it takes a user on average 32 seconds to complete a CAPTCHA challenge. There are 4.6 billion global Internet users. We assume a typical Internet user sees approximately one CAPTCHA every 10 days.</p><p>This very simple back of the envelope math equates to somewhere in the order of 500 human years wasted every single day — just for us to prove our humanity.</p><p>Today, we are launching an experiment to end this madness. We want to get rid of CAPTCHAs completely. The idea is rather simple: a real human should be able to touch or look at their device to prove they are human, without revealing their identity. We want you to be able to prove that you are human without revealing which human you are! You may ask if this is even possible? And the answer is: Yes! We’re starting with trusted USB keys (like <a href="https://www.yubico.com/">YubiKey</a>) that have been around for a while, but increasingly phones and computers come equipped with this ability by default.</p><p>Today marks the beginning of the end for fire hydrants, cross walks, and traffic lights on the Internet.</p>
    <div>
      <h2>Why CAPTCHAs?</h2>
      <a href="#why-captchas">
        
      </a>
    </div>
    <p>In many instances, businesses need a way to tell whether an online user is human or not. Typically, those reasons relate to security, or abuse of an online service. Back at the turn of the century, CAPTCHAs were created to do just that. The first one <a href="https://en.wikipedia.org/wiki/CAPTCHA#:~:text=The%20term%20was%20coined%20in,two%20groups%20working%20in%20parallel.">was developed back in 1997</a>, and the term ("Completely Automated Public Turing test to tell Computers and Humans Apart") was coined in 2003 by Luis von Ahn, Manuel Blum, Nicholas J. Hopper, and John Langford.</p><p>By their very nature, the challenge-response nature of CAPTCHAs have to be automated: so they can scale across both humans and the bots they need to catch.</p>
    <div>
      <h2>Why get rid of CAPTCHAs?</h2>
      <a href="#why-get-rid-of-captchas">
        
      </a>
    </div>
    <p>Put simply: we all hate them.</p><p>The best we’ve been able to do to date has been to minimize them. For example, at Cloudflare, we’ve continuously <a href="/cloudflare-bot-management-machine-learning-and-more/">improved our Bot management solution</a> to get as smart as possible about when to serve a CAPTCHA to the user. However, over the years the web moved from simple CAPTCHAs based on text recognition against backgrounds to OCRing old books to identifying objects from pictures as <a href="https://www.cloudflare.com/learning/ai/what-is-artificial-intelligence/">AI</a> has improved (see <a href="https://arxiv.org/abs/1312.6082">Google paper on Street Numbers</a>). This creates some real problems for the human users of the Internet:</p><ol><li><p>Productivity: Time is lost — as is focus on the task at hand — and often in exchange for some frustration.</p></li><li><p>Accessibility: Users are assumed to have the physical and cognitive capabilities required to solve the tests, which may not be the case. A visual disability, for example, may make it impossible to perform a CAPTCHA-solving task.</p></li><li><p>Cultural Knowledge: The people on the planet who have seen a US fire hydrant are in the minority, as are the number who speak English. Cabs are yellow in New York City, and black in London — heck, ‘cabs’ are only cabs in a few places, and ‘taxis’ everywhere else!</p></li><li><p>Interactions on Mobile Devices: Phones and mobile devices are the primary — and most often only — means of Internet access for a large part of the world. CAPTCHAs put a strain on their data plans and battery usage, in addition to being more difficult on small screens.</p></li></ol><p>In fact, the World Wide Web Consortium (W3C) worked on multiple drafts — as early as 2003 — pointing out the <a href="https://www.w3.org/TR/turingtest/">inaccessibility of CAPTCHAs</a>.</p><p><i>And this is just from the user side</i>. Inflicting all these costs on users has very real costs for businesses, too. There’s a reason why businesses spend so much time optimizing the performance and layout of their websites and applications. That work stops users from bouncing when you want them to register. It stops shopping carts getting abandoned when you want them to end in the checkout. In general, you want to stop customers from getting frustrated and simply not come back.</p><p>CAPTCHAs are effectively businesses putting friction in front of their users, and as anyone who has managed a high performing online business will tell you, it’s not something you want to do unless you have no choice.</p><p>We started tackling these issues when we <a href="/moving-from-recaptcha-to-hcaptcha/">moved from Google reCAPTCHA to hCAPTCHA</a>. Today, we are going further.</p>
    <div>
      <h2>CAPTCHA without Picture: Cryptographic Attestation of Personhood</h2>
      <a href="#captcha-without-picture-cryptographic-attestation-of-personhood">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1WeboSgc6BWaS2HxVOGRcb/590fba693766943506c4587a3172ed15/image4-4.png" />
            
            </figure><p>Hardware security keys are devices with an embedded secret that can connect to your computer or your phone</p><p>From a user perspective, a Cryptographic Attestation of Personhood works as follows:</p><ol><li><p>The user accesses a website protected by Cryptographic Attestation of Personhood, such as <a href="http://cloudflarechallenge.com">cloudflarechallenge.com</a>.</p></li><li><p>Cloudflare serves a challenge.</p></li><li><p>The user clicks I am human (beta) and gets prompted for a security device.</p></li><li><p>User decides to use a Hardware Security Key.</p></li><li><p>The user plugs the device into their computer or taps it to their phone for wireless signature (using NFC).</p></li><li><p>A cryptographic attestation is sent to Cloudflare, which allows the user in upon verification of the <a href="https://w3c.github.io/webauthn/#test-of-user-presence">user presence test</a>.</p></li></ol><p>Completing this flow takes five seconds. More importantly, this challenge protects users' privacy since the attestation is not uniquely linked to the user device. All device manufacturers trusted by Cloudflare are part of the FIDO Alliance. As such, each hardware key shares its identifier with other keys manufactured in the same batch (see <a href="https://fidoalliance.org/specs/fido-u2f-overview-ps-20150514.pdf">Universal 2nd Factor Overview, Section 8</a>). From Cloudflare’s perspective, your key looks like all other keys in the batch.</p><p>There are at most three clicks required to complete a Cryptographic Attestation of Personhood. There is no looping, where a user is asked to click on buses 10 times in a row.</p><p>While there is a variety of hardware security keys, our initial rollout is limited to a set of USB and NFC keys that are both certified by the FIDO alliance and have no known security issues according to the FIDO metadata service (MDS). Our demo only includes support for YubiKeys, which we had the chance to use and test; HyperFIDO keys; and Thetis FIDO U2F keys.</p><blockquote><p>“Driving open authentication standards like WebAuthn has long been at the heart of Yubico’s mission to deliver powerful security with a delightful user experience,” said Christopher Harrell, Chief Technology Officer at Yubico. “By offering a CAPTCHA alternative via a single touch backed by YubiKey hardware and public key cryptography, Cloudflare’s Cryptographic Attestation of Personhood experiment could help further reduce the cognitive load placed on users as they interact with sites under strain or attack. I hope this experiment will enable people to accomplish their goals with minimal friction and strong privacy, and that the results will show it is worthwhile for other sites to consider using hardware security for more than just authentication.”</p></blockquote>
    <div>
      <h2>How does it work?</h2>
      <a href="#how-does-it-work">
        
      </a>
    </div>
    <p>The Cryptographic Attestation of Personhood relies on <a href="https://www.w3.org/TR/webauthn-2/#sctn-attestation">Web Authentication (WebAuthn) Attestation</a>. This is an API that has been standardized at the W3C and is already implemented in most modern web browsers and operating systems. It aims to provide a standard interface to authenticate users on the web and use the cryptography capability of their devices.</p><p>As the need for stronger security with improved usability increases, we envision the deployment instances of WebAuthn to rise.</p><table><tr><td><p><b>Platform</b></p></td><td><p><b>Compatible Browsers</b></p></td></tr><tr><td><p>iOS 14.5</p></td><td><p>All browsers</p></td></tr><tr><td><p>Android 10 and later</p></td><td><p>Chrome</p></td></tr><tr><td><p>Windows</p></td><td><p>All browsers</p></td></tr><tr><td><p>macOS</p></td><td><p>All browsers</p></td></tr><tr><td><p>Ubuntu</p></td><td><p>All browsers</p></td></tr></table><p>Assuming you are using a hardware device with a compatible configuration, you might be wondering what is happening behind the scenes.</p>
    <div>
      <h3>The elevator pitch</h3>
      <a href="#the-elevator-pitch">
        
      </a>
    </div>
    <p>The short version is that your device has an embedded secure module containing a unique secret sealed by your manufacturer. The security module is capable of proving it owns such a secret without revealing it. Cloudflare asks you for proof and checks that your manufacturer is legitimate.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5msss4WaXkkCMEgBwldIwi/196f2f1e6caec88053f575f4c3e342c8/image7.png" />
            
            </figure>
    <div>
      <h3>The technical explanation</h3>
      <a href="#the-technical-explanation">
        
      </a>
    </div>
    <p>The longer version is that this verification involves public-key cryptography and digital certificates.</p><p>Public-key cryptography provides a way to produce unforgeable digital signatures. A user generates a signing key that can sign messages and a verification key that can be used by anyone to verify a message is authentic. This is akin to a <a href="https://en.wikipedia.org/wiki/Seal_(emblem)#Signet_rings">signet ring</a>, where the imprint of the ring is the signature and the ring itself the signing key.</p><p>Signature schemes are used widely to prove authenticity. Right now, your browser has verified that the server claiming to be “blog.cloudflare.com” is legitimate by verifying a signature made by someone who has a signing key associated with “blog.cloudflare.com”. To show the verification key is legitimate, the server provides a certificate that links the verification key to “blog.cloudflare.com”, itself signed by another verification key in another certificate. This chain goes all the way up to a root certificate from a <i>Certificate Authority</i> built into your browser.</p><p>Let's take another example. Alice owns a laptop with a secure module embedded. This module holds a signing key, sk_a. Alice says she sent a love letter to Bob yesterday. However, Bob is suspicious. Despite the letter stating "Hi Bob, it's Alice", Bob would like to be sure this letter comes from Alice. To do so, Bob asks Alice to provide her signature for the following message "musical-laboratory-ground". Since Bob chooses the message, if Alice can provide a signature associated with her verification key (pk_a), Bob would be convinced the love letter is from Alice. Alice does provide the signature, sk_a(“musical-laboratory-ground”). Bob confirms sk_a(“musical-laboratory-ground”) is associated with pk_a. He can now securely engage in their cryptographer relationship.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2az1pFbAuzJIcBMppOa1YC/19a6ebd82f20d88e7db696b42182025e/image1-4.png" />
            
            </figure><p>Thinking back to the Cryptographic Attestation of Personhood, you now know that your hardware key embeds a signing key. However, Cloudflare does not and cannot know the signing keys of all users of the Internet. To alleviate this problem, Cloudflare requests a different kind of proof. When asked if you are a human, we ask you to prove you are in control of a public key signed by a trusted manufacturer. When shipping devices with a secure module, <a href="https://fidoalliance.org/specs/fido-security-requirements/fido-authenticator-security-requirements-v1.4-fd-20201102.html">manufacturers sign</a> the associated attestation public key with a digital certificate.</p><p>Digital certificates usually contain a public key, information about the organization they are provisioned for, a validity period, the allowed usage, and a signature from a Certificate Authority making sure the certificate is legitimate. They allow metadata to be associated with a public key and therefore provide information about the issuer of a signature.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7zLUNHHDgaWpnCniSwkThu/3236b7b22b54c8319e30aa17c78937a3/image6-1.png" />
            
            </figure><p>So when Cloudflare asks you to provide a signature, it verifies your public key has been signed by the public key of a manufacturer. Since manufacturers have multiple levels of certificates, your device provides a chain of certificates that Cloudflare is able to verify. Each link in the chain is signed by its predecessor and signs its successor. Cloudflare trusts the root certificate of manufacturers. Because their numbers are limited, we have the capacity to verify them manually.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/O9TXLinQvwKA19xqCzcGb/332b024322a0ea832073e7e3ef98bfd7/image5-3.png" />
            
            </figure>
    <div>
      <h2>Privacy first</h2>
      <a href="#privacy-first">
        
      </a>
    </div>
    <p>Designing a challenge asking users to prove they are in control of a key from a certain manufacturer comes with a privacy and security challenge.</p><p>The privacy properties of the Cryptographic Attestation of Personhood are summarized in the following table.</p><table><tr><td><p><b>Property</b></p></td><td><p><b>Cloudflare Could</b></p></td><td><p><b>Cloudflare Does</b></p></td></tr><tr><td><p>Get your fingerprints or face</p></td><td><p>NO</p></td><td><p>N/A</p></td></tr><tr><td><p>Know the manufacturer of your key</p></td><td><p>YES - limited to the number of keys in your batch*</p></td><td><p>YES</p></td></tr><tr><td><p>Associate a unique ID to your key</p></td><td><p>YES**</p></td><td><p>NO</p></td></tr></table><p><i>* There must be 100,000 or more keys per batch (</i><a href="https://fidoalliance.org/specs/fido-uaf-v1.1-ps-20170202/fido-uaf-protocol-v1.1-ps-20170202.html#full-basic-attestation"><i>FIDO UAF Protocol Specification #4.1.2.1.1</i></a><i>). However, self-signed keys and keys from certain manufacturers have been found to</i> <a href="https://www.chromium.org/security-keys"><i>not meet this requirement</i></a><i>.</i></p><p><i>**This would require that we set a separate and distinct cookie to track your key. This is antithetical to privacy on the Internet, and to the goals of this project. You can learn more about how we are removing cookies like</i> <a href="/deprecating-cfduid-cookie/"><i>__cfduid here</i></a><i>.</i></p>
    <div>
      <h3>Attestation without collecting biometrics</h3>
      <a href="#attestation-without-collecting-biometrics">
        
      </a>
    </div>
    <p>The aim of this project: we want to know <i>that</i> you’re human. But we’re not interested in <i>which</i> human you are.</p><p>Happily, the WebAuthn API goes a long way to take care of this for us. Not that we want it, but the WebAuthn API prevents the collection of biometrics, such as a fingerprint. When your device asks for a biometric authentication — such as via a fingerprint sensor — it all happens locally. The verification is meant to unlock the secure module of your device, which provides a signature associated with your platform.</p><p>For our challenge, we leverage the <a href="https://w3c.github.io/webauthn/#sctn-sample-registration">WebAuthn registration</a> process. It has been designed to perform multiple authentications, which we do not have a use for. Therefore, we do assign the same constant value to the required username field. It protects users from deanonymization.</p>
    <div>
      <h3>No hidden work</h3>
      <a href="#no-hidden-work">
        
      </a>
    </div>
    <p>A common use of CAPTCHA is to label datasets that AI has difficulty identifying. This could be for books, street numbers, or fire hydrants. While this is useful for science, it has also been used as a way for companies to leverage human recognition ability for commercial gain without their users’ knowledge.</p><p>With the Cryptographic Attestation of Personhood, this does not happen. We have more flexibility designing the user flow, as we are not constrained by the CAPTCHA challenge model any more.</p>
    <div>
      <h3>What Cloudflare is doing to push privacy even further</h3>
      <a href="#what-cloudflare-is-doing-to-push-privacy-even-further">
        
      </a>
    </div>
    <p>While the Cryptographic Attestation of Personhood has a lot of upsides in terms of privacy, it is not perfect. Cloudflare still needs to know your manufacturer to let you in. As WebAuthn works with any certificate, we need to make sure Cloudflare receives certificates from untampered hardware keys. We would prefer to not have that information, further preserving your privacy.</p><p>We have worked on privacy standards in the past, leading the efforts with Privacy Pass for instance. <a href="http://privacypass.cloudflare.com/">Privacy Pass</a> allows you to solve a challenge once and provide a proof you passed it, meaning you don’t have to solve multiple CAPTCHAs. It greatly improved the user experience of VPN users, who face more challenges than other Internet users.</p><p>For the Cryptographic Attestation of Personhood, we dig into an emerging field in cryptography called <a href="https://en.wikipedia.org/wiki/Zero-knowledge_proof">Zero Knowledge proofs</a> (ZK proof). It allows our users to prove their manufacturer is part of a set of manufacturers trusted by Cloudflare. Using a ZK proof, the devices from a single manufacturer become indistinguishable from each other, as well as from devices from other manufacturers. This new system requires more technical details and deserves a dedicated blog post. Stay tuned.</p>
    <div>
      <h2>A never-ending quest</h2>
      <a href="#a-never-ending-quest">
        
      </a>
    </div>
    <p>Designing a challenge aimed at protecting millions of Internet properties is no easy task. In the current setup, we believe Cryptographic Attestation of Personhood offers strong security and usability guarantees compared to traditional CAPTCHA challenges. During a preliminary user study, users indicated a strong preference for touching their hardware key over clicking on pictures. Nevertheless, we know that this is a new system with room for improvements.</p><p>This experiment will be available on a limited basis in English-speaking regions. This allows us to have diversity in the pool of users and test this process in various locations. However, we recognize this is insufficient coverage, and we intend to test further. If you have specific needs, feel free to reach out.</p><p>Another issue that we keep a close eye on is security. The security of this challenge depends on the underlying hardware provided by trusted manufacturers. We have confidence they are secured. If any breach were to occur, we would be able to quickly deauthorize manufacturers’ public keys at various levels of granularity.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3hbowSpXCTcXvLzs9vgpGV/8b46a33594c8b7f70f268dff8d05d44a/image3-3.png" />
            
            </figure><p>We also have to consider the possibility of facing automated button-pressing systems. A <a href="https://en.wikipedia.org/wiki/Drinking_bird">drinking bird</a> able to press the capacitive touch sensor could pass the Cryptographic Attestation of Personhood. At best, the bird solving rate matches the time it takes for the hardware to generate an attestation. With our current set of trusted manufacturers, this would be slower than the solving rate of professional CAPTCHA-solving services, while allowing legitimate users to pass through with certainty. In addition, existing Cloudflare mitigations would remain in place, efficiently protecting Internet properties.</p>
    <div>
      <h2>Final words</h2>
      <a href="#final-words">
        
      </a>
    </div>
    <p>For Cloudflare, it always comes back to: helping build a better Internet. The very idea that we’re all wasting 500 years per day on the Internet — that nobody had revisited the fundamental assumptions of CAPTCHAs since the turn of the century — seemed absurd to us.</p><p>We’re very proud of the work we’ve done here to release the Cryptographic Attestation of Personhood. This challenge has been built with a user-first approach while maintaining a high level of security for accessing Internet properties sitting behind Cloudflare’s global network. We’re now in the process of augmenting our existing humanity challenge with the Cryptographic Attestation of Personhood. You should expect to see it more frequently as time passes. You can try it out today at <a href="https://cloudflarechallenge.com">cloudflarechallenge.com</a>.</p><p>We want to acknowledge the work of other teams at Cloudflare. While this work is led by the Research team, we have been extremely privileged to get support from all across the company. If you want to help us build a better Internet, <a href="https://www.cloudflare.com/careers/jobs/?department=Technology%20Research&amp;location=default">we are hiring</a>.</p><p>Finally: we’re excited to bring about the demise of the fire hydrant on the Internet. It’s no longer needed.</p>
    <div>
      <h2>Feedback and Common errors</h2>
      <a href="#feedback-and-common-errors">
        
      </a>
    </div>
    <p>As this is currently an experimental project from the Cloudflare Research Team only USB or NFC security keys work today. We’re happy for the feedback and will look into adding other authenticators as soon as possible. If you use a non-supported device then you’re likely to get a somewhat difficult to understand error message from your browser. On Google Chrome you would see:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2DhXRbBd40SKy0GhKMfMXT/73a01215e4eaf839fce6e8bf73598d4a/Chrome-WebAuth-Fail-Screenshot.png" />
            
            </figure><p>If you would like to give us feedback on the Cryptographic Attestation of Personhood please fill out our <a href="https://forms.gle/HQxJtXgryg4oRL3e8">Google Form</a>.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <guid isPermaLink="false">XSbvOPEifCz8EVsPEDM4h</guid>
            <dc:creator>Thibault Meunier</dc:creator>
        </item>
        <item>
            <title><![CDATA[Privacy Pass - “The Math”]]></title>
            <link>https://blog.cloudflare.com/privacy-pass-the-math/</link>
            <pubDate>Thu, 09 Nov 2017 16:05:00 GMT</pubDate>
            <description><![CDATA[ During a recent internship at Cloudflare, I had the chance to help integrate support for improving the accessibility of websites that are protected by the Cloudflare edge network.  ]]></description>
            <content:encoded><![CDATA[ <p><i>This is a guest post by Alex Davidson, a PhD student in Cryptography at Royal Holloway, University of London, who is part of the team that developed </i><a href="https://privacypass.github.io"><i>Privacy Pass</i></a><i>. Alex worked at Cloudflare for the summer on deploying Privacy Pass on the Cloudflare network</i>.</p><p>During a recent internship at Cloudflare, I had the chance to help integrate support for improving the accessibility of websites that are protected by the Cloudflare edge network. Specifically, I helped develop an open-source browser extension named ‘Privacy Pass’ and added support for the Privacy Pass protocol within Cloudflare infrastructure. Currently, Privacy Pass works with the Cloudflare edge to help honest users to reduce the number of Cloudflare CAPTCHA pages that they see when browsing the web. However, the operation of Privacy Pass is not limited to the Cloudflare use-case and we envisage that it has applications over a wider and more diverse range of applications as support grows.</p><p>In summary, this browser extension allows a user to generate cryptographically ‘blinded’ tokens that can then be signed by supporting servers following some receipt of authenticity (e.g. a CAPTCHA solution). The browser extension can then use these tokens to ‘prove’ honesty in future communications with the server, without having to solve more authenticity challenges.</p><p>The ‘blind’ aspect of the protocol means that it is infeasible for a server to link tokens token that it signs to tokens that are redeemed in the future. This means that a client using the browser extension should not compromise their own privacy with respect to the server they are communicating with.</p><p>In this blog post we hope to give more of an insight into how we have developed the protocol and the security considerations that we have taken into account. We have made use of some interesting and modern cryptographic techniques that we believe could have a future impact on a wide array of problems.</p>
    <div>
      <h3>Previously…</h3>
      <a href="#previously">
        
      </a>
    </div>
    <p>The research team released a specification last year for a “blind signing” protocol (very similar to the original proposal of <a href="#Cha82">Chaum</a> using a variant of RSA known as ‘blind RSA’. Blind RSA simply uses the homomorphic properties of the textbook RSA signature scheme to allow the user to have messages signed <i>obliviously</i>. Since then, George Tankersley and Filippo Valsorda gave a talk at <a href="https://youtu.be/GqY7YUv8b5Y">Real World Crypto 2017</a> explaining the idea in more detail and how the protocol could be implemented. The intuition behind a blind signing protocol is also given in <a href="/cloudflare-supports-privacy-pass">Nick’s blog post</a>.</p><p>A blind signing protocol between a server A and a client B roughly takes the following form:</p><ul><li><p>B generates some value <code>t</code> that they require a signature from A for.</p></li><li><p>B calculates a ‘blinded’ version of <code>t</code> that we will call <code>bt</code></p></li><li><p>B sends <code>bt</code> to A</p></li><li><p>A signs <code>bt</code> with their secret signing key and returns a signature <code>bz</code> to B</p></li><li><p>B receives <code>bz</code> and ‘unblinds’ to receive a signature <code>z</code> for value <code>t</code>.</p></li></ul><p>Due to limitations arising from the usage of RSA (e.g. large signature sizes, slower operations), there were efficiency concerns surrounding the extra bandwidth and computation time on the client browser. Fortunately, we received a lot of feedback from many notable individuals (full acknowledgments below). In short, this helped us to come up with a protocol with much lower overheads in storage, bandwidth and computation time using elliptic curve cryptography as the foundation instead.</p>
    <div>
      <h3>Elliptic curves (a very short introduction)</h3>
      <a href="#elliptic-curves-a-very-short-introduction">
        
      </a>
    </div>
    <p>An elliptic curve is defined over a finite field modulo some prime <code>p</code>. Briefly, an <code>(x,y)</code> coordinate is said to lie on the curve if it satisfies the following equation:</p><p><code>y^2 = x^3 + a*x + b (modulo p)</code></p><p>Nick Sullivan wrote an introductory <a href="/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/">blog post</a> on the use of elliptic curves in cryptography a while back, so this may be a good place to start if you’re new to the area.</p><p>Elliptic curves have been studied for use in cryptography since the independent works of Koblitz and Miller (1984-85). However, EC-based ciphers and signature algorithms have rapidly started replacing older primitives in the Internet-space due to large improvements in the choice of security parameters available. What this translates to is that encryption/signing keys can be much smaller in EC cryptography when compared to more traditional methods such as RSA. This comes with huge efficiency benefits when computing encryption and signing operations, thus making EC cipher suites perfect for use on an Internet-wide scale.</p><p>Importantly, there are many different elliptic curve configurations that are defined by the choice of <code>p</code>, <code>a</code> and <code>b</code> for the equation above. These prevent different security and efficiency benefits; some have been standardized by NIST. In this work, we will be using the NIST specified <a href="https://csrc.nist.gov/publications/detail/fips/186/4/final">P256 curve</a>, however, this choice is largely agnostic to the protocol that we have designed.</p>
    <div>
      <h4>Blind signing via elliptic curves</h4>
      <a href="#blind-signing-via-elliptic-curves">
        
      </a>
    </div>
    <p>Translating our blind signing protocol from RSA to elliptic curves required deriving a whole new protocol. Some of the suggestions pointed out cryptographic constructions known as “oblivious pseudorandom functions”. A pseudorandom function or PRF is a mainstay of the traditional cryptographic arsenal and essentially takes a key and some string as input and outputs some cryptographically random value.</p><p>Let F be our PRF, then the security requirement on such a function is that evaluating:</p><p><code>y = F(K,x)</code></p><p>is indistinguishable from evaluating:</p><p><code>y’ = f(x)</code></p><p>where f is a randomly chosen function with outputs defined in the same domain as <code>F(K,-)</code>. Choosing a function f at random undoubtedly leads to random outputs, however for <code>F</code>, randomness is derived from the choice of key <code>K</code>. In practice, we would instantiate a PRF using something like HMAC-SHA256.</p>
    <div>
      <h4>Oblivious PRFs</h4>
      <a href="#oblivious-prfs">
        
      </a>
    </div>
    <p>An oblivious PRF (OPRF) is actually a protocol between a server S and a client C. In the protocol, S holds a key <code>K</code> for some PRF <code>F</code> and C holds an input <code>x</code>. The security goal is that C receives the output <code>y = F(K,x)</code> without learning the key <code>K</code> and S does not learn the value <code>x</code>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5LG1M3dg4OwiUYd1TFWIWJ/8e26d23ae4dd905c599cece4cf9c1cbd/image3-1.png" />
            
            </figure><p>It may seem difficult to construct such a functionality without revealing the input x or the key K. However, there are numerous (and very efficient) constructions of OPRFs with applications to many different cryptographic problems such as <a href="https://eprint.iacr.org/2016/799">private set intersection</a>, <a href="https://eprint.iacr.org/2016/144">password-protected secret-sharing</a> and <a href="http://webee.technion.ac.il/~hugo/sphinx.pdf">cryptographic password storage</a> to name a few.</p>
    <div>
      <h4>OPRFs from elliptic curves</h4>
      <a href="#oprfs-from-elliptic-curves">
        
      </a>
    </div>
    <p>A simple instantiation of an OPRF from elliptic curves was given by Jarecki et al. <a href="#jkk14">JKK14</a>, we use this as the foundation for our blind signing protocol.</p><ul><li><p>Let <code><b>G</b></code> be a cyclic group of prime-order</p></li><li><p>Let <code>H</code> be a collision-resistant hash function hashing into <code>G</code></p></li><li><p>Let <code>k</code> be a private key held by S</p></li><li><p>Let <code>x</code> be a private input held by C</p></li></ul><p>The protocol now proceeds as:</p><ul><li><p>C sends <code>H(x)</code> to S</p></li><li><p>S returns <code>kH(x)</code> to C</p></li></ul><p>Clearly, this is an exceptionally simple protocol, security is established since:</p><ul><li><p>The collision-resistant hash function prevents S from reversing <code>H(x)</code> to learn <code>x</code></p></li><li><p>The hardness of the discrete log problem (DLP) prevents C from learning <code>k</code> from <code>kH(x)</code></p></li><li><p>The output <code>kH(x)</code> is pseudorandom since <code><b>G</b></code> is a prime-order group and <code>k</code> is chosen at random.</p></li></ul>
    <div>
      <h4>Blind signing via an OPRF</h4>
      <a href="#blind-signing-via-an-oprf">
        
      </a>
    </div>
    <p>Using the OPRF design above as the foundation, the research team wrote a variation that we can use for a blind signing protocol; we detail this construction below. In our ‘blind signing’ protocol we require that:</p><ul><li><p>The client/user can have random values signed obliviously by the edge server</p></li><li><p>The client can ‘unblind’ these values and present them in the future for verification</p></li><li><p>The edge can commit to the secret key publicly and prove that it is used for signing all tokens globally</p></li></ul><p>The blind signing protocol is split into two phases.</p><p>Firstly, there is a <b>blind signing phase</b> that is carried out between the user and the edge after the user has successfully solved a challenge. The result is that the user receives a number of <code>signed</code> tokens (default 30) that are unblinded and stored for future use. Intuitively, this mirrors the execution of the OPRF protocol above.</p><p>Secondly, there is a <b>redemption phase</b> where an unblinded token is used for bypassing a future iteration of the challenge.</p><p>Let <code><b>G</b></code> be a cyclic group of prime-order <code>q</code>. Let <code>H_1</code>,<code>H_2</code> be a pair of collision-resistant hash functions; <code>H_1</code> hashes into the group <code><b>G</b></code> as before, <code>H_2</code> hashes into a binary string of length <code>n</code>.</p><p>In the following, we will slightly different notation to make it consistent with existing literature. Let <code>x</code> be a private key held by the server S. Let <code>t</code> be the input held by the user/client C. Let <code>ZZ_q</code> be the ring of integers modulo <code>q</code>. We write all operations in their scalar multiplication form to be consistent with EC notation. Let <code>MAC_K()</code> be a <a href="https://en.wikipedia.org/wiki/Message_authentication_code">message-authentication code</a> algorithm keyed by a key <code>K</code>.</p>
    <div>
      <h4>Signing phase</h4>
      <a href="#signing-phase">
        
      </a>
    </div>
    <ul><li><p>C samples a random ‘blind’ <code>r ← ZZ_q</code></p></li><li><p>C computes <code>T = H_1(t)</code> and then blinds it by computing <code>rT</code></p></li><li><p>C sends <code>M = rT</code> to S</p></li><li><p>S computes <code>Z = xM</code> and returns <code>Z</code> to C</p></li><li><p>C computes <code>(1/r)*Z = xT = N</code> and stores the pair <code>(t,N)</code> for some point in the future</p></li></ul><p>We think of <code>T = H_1(t)</code> as a token, these objects form the backbone of the protocol that we use to bypass challenges.Notice, that the only difference between this protocol and the OPRF above is the blinding factor <code>r</code> that we use.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3LJYvqKAwDw1Rh6oPlGeZy/ef4c5d38cf87ce48480c6e7680d17444/image2.png" />
            
            </figure>
    <div>
      <h4>Redemption phase</h4>
      <a href="#redemption-phase">
        
      </a>
    </div>
    <ul><li><p>C calculates request binding data <code>req</code> and chooses an unspent token <code>(t,N)</code></p></li><li><p>C calculates a shared key <code>sk = H_2(t,N)</code> and sends <code>(t, MAC_sk(req))</code> to S</p></li><li><p>S recalculates <code>req'</code> based on the request data that it witnesses</p></li><li><p>S checks that <code>t</code> has not been spent already and calculates <code>T = H_1(t)</code>, <code>N = xT</code>, and <code>sk = H_2(t,N)</code></p></li><li><p>Finally S checks that <code>MAC_sk(req') =?= MAC_sk(req)</code>, and stores <code>t</code> to check against future redemptions</p></li></ul><p>If all the steps above pass, then the server validates that the user has a validly signed token. When we refer to ‘passes’ we mean the pair <code>(t, MAC_sk(req))</code> and if verification is successful the edge server grants the user access to the requested resource.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5UrTr7lpAY9Fin8rctVoLa/61fbb098340ac56a5012b6f03a13acc0/image1-1.png" />
            
            </figure>
    <div>
      <h3>Cryptographic security of protocol</h3>
      <a href="#cryptographic-security-of-protocol">
        
      </a>
    </div>
    <p>There are many different ways in which we need to ensure that the protocol remains “secure”. Clearly one of the main features is that the user remains anonymous in the transaction. Furthermore, we need to show that the client is unable to leverage the protocol in order to learn the private key of the edge, or arbitrarily gain infinite tokens. We give two security arguments for our protocol that we can easily reduce to cryptographic assumptions on the hardness of widely-used problems. There are a number of other security goals for the protocol but we consider the two arguments below as fundamental security requirements.</p>
    <div>
      <h4>Unlinkability in the presence of an adversarial edge</h4>
      <a href="#unlinkability-in-the-presence-of-an-adversarial-edge">
        
      </a>
    </div>
    <p>Similarly to the RSA blind signing protocol, the blind r is used to prevent the edge from learning the value of <code>T</code>, above. Since <code>r</code> is not used in the redemption phase of the protocol, there is no way that the server can link a blinded token <code>rT</code> in the signing phase to any token in a given redemption phase. Since S recalculates <code>T</code> during redemption, it may be tempting to think that S could recover <code>r</code> from <code>rT</code>. However, the hardness of the discrete log problem prevents S from launching this attack. Therefore, the server has no knowledge of <code>r</code>.</p><p>As mentioned and similarly to the <a href="#jkk14">JKK14</a> OPRF protocol above, we rely on the hardness of standard cryptographic assumptions such as the discrete log problem (DLP), and collision-resistant hash functions. Using these hardness assumptions it is possible to write a proof of security in the presence of a dishonest server. The proof of security shows that assuming that these assumptions are hard, then a dishonest server is unable to link an execution of the signing phase with any execution of the redemption phase with probability higher than just randomly guessing.</p><p>Intuitively, in the signing phase, C sends randomly distributed data due to the blinding mechanism and so S cannot learn anything from this data alone. In the redemption phase, C unveils their token, but the transcript of the signing phase witnessed by S is essentially random and so it cannot be used to learn anything from the redemption phase.</p><p>This is not a full proof of security but gives an idea as to how we can derive cryptographic hardness for the underlying protocol. We hope to publish a more detailed cryptographic proof in the near future to accompany our protocol design.</p>
    <div>
      <h3>Key privacy for the edge</h3>
      <a href="#key-privacy-for-the-edge">
        
      </a>
    </div>
    <p>It is also crucial to prove that the exchange does not reveal the secret key <code>x</code> to the user. If this were to happen, then the user would be able to arbitrarily sign their own tokens, giving them an effectively infinite supply.</p><p>Notice that the only time when the client is exposed to the key is when they receive <code>Z = xM</code>. In elliptic-curve terminology, the client receives their blinded token scalar multiplied with <code>x</code>. Notice, that this is also identical to the interaction that an adversary witnesses in the discrete log problem. In fact, if the client was able to compute <code>x</code> from <code>Z</code>, then the client would also be able to solve the DLP — which is thought to be very hard for established key sizes. In this way, we have a sufficient guarantee that an adversarial client would not be able to learn the key from the signing interaction.</p>
    <div>
      <h4>Preventing further deanonymization attacks using “Verifiable” OPRFs</h4>
      <a href="#preventing-further-deanonymization-attacks-using-verifiable-oprfs">
        
      </a>
    </div>
    <p>While the proof of security above gives some assurances about the cryptographic design of the protocol, it does not cover the possibility of possible out-of-band deanonymization. For instance, the edge server can sign tokens with a new secret key each time. Ignoring the cost that this would incur, the server would be able to link token signing and redemption phases by simply checking the validation for each private key in use.</p><p>There is a solution known as a ‘discrete log equivalence proof’ (DLEQ proof). Using this, a server commits to a secret key <code>x</code> by publicly posting a pair <code>(G, xG)</code> for a generator <code>G</code> of the prime-order group <code><b>G</b></code>. A DLEQ proof intuitively allows the server to prove to the user that the signed tokens <code>Z = xrT</code> and commitment <code>xG</code> both have the same discrete log relation <code>x</code>. Since the commitment is posted publicly (similarly to a <a href="https://www.certificate-transparency.org/">Certificate Transparency Log</a>) this would be verifiable by all users and so the deanonymization attack above would not be possible.</p>
    <div>
      <h4>DLEQ proofs</h4>
      <a href="#dleq-proofs">
        
      </a>
    </div>
    <p>The DLEQ proof objects take the form of a Chaum-Pedersen <a href="#cp93">CP93</a> non-interactive zero-knowledge (NIZK) proof. Similar proofs were used in <a href="#jkk14">JKK14</a> to show that their OPRF protocol produced “verifiable” randomness, they defined their construction as a VOPRF. In the following, we will describe how these proofs can be augmented into the signing phase above.</p><p><i>The DLEQ proof verification in the extension is still in development and is not completely consistent with the protocol below. We hope to complete the verification functionality in the near future.</i></p><p>Let <code>M = rT</code> be the blinded token that C sends to S, let <code>(G,Y) = (G,xG)</code> be the commitment from above, and let H_3 be a new hash function (modelled as a random oracle for security purposes). In the protocol below, we can think of S playing the role of the 'prover' and C the 'verifier' in a traditional NIZK proof system.</p><ul><li><p>S computes <code>Z = xM</code>, as before.</p></li><li><p>S also samples a random nonce <code>k ← ZZ_q</code> and commits to the nonce by calculating <code>A = kG</code> and <code>B = kM</code></p></li><li><p>S constructs a challenge <code>c ← H_3(G,Y,M,Z,A,B)</code> and computes <code>s = k-cx (mod q)</code></p></li><li><p>S sends <code>(c,s)</code> to the user C</p></li><li><p>C recalculates <code>A' = sG + cY</code> and <code>B' = s*M + c*Z</code> and hashes <code>c' = H_3(G,Y,M,Z,A’,B’)</code>.</p></li><li><p>C verifies that <code>c' =?= c</code>.</p></li></ul><p>Note that correctness follows since</p>
            <pre><code>A' = sG + cY = (k-cx)G + cxG = kG and B' = sM + cZ = r(k-cx)T + crxT = krT = kM </code></pre>
            <p>We write DLEQ(Z/M == Y/G) to denote the proof that is created by S and validated by C.In summary, if both parties have a consistent view of <code>(G,Y)</code> for the same epoch then the proof should verify correctly. As long as the discrete log problem remains hard to solve, then this proof remains zero-knowledge (in the random oracle model). For our use-case the proof verifies that the same key <code>x</code> is used for each invocation of the protocol, as long as <code>(G,Y)</code> does not change.</p>
    <div>
      <h4>Batching the proofs</h4>
      <a href="#batching-the-proofs">
        
      </a>
    </div>
    <p>Unfortunately, a drawback of the proof above is that it has to be instantiated for each individual token sent in the protocol. Since we send 30 tokens by default, this would require the server to also send 30 DLEQ proofs (with two EC elements each) and the client to verify each proof individually.</p><p>Interestingly, Henry showed that it was possible to batch the above NIZK proofs into one object with only one verification required <a href="#hen14">Hen14</a>. Using this batching technique substantially reduces the communication and computation cost of including the proof.</p><p>Let <code>n</code> be the number of tokens to be signed in the interaction, so we have <code>M_i = r_i*T_i</code> for the set of blinded tokens corresponding to inputs <code>t_i</code>.</p><ul><li><p>S generates corresponding <code>Z_i = x*M_i</code></p></li><li><p>S also computes a seed <code>z = H_3(G,Y,M_1,...,M_n,Z_1,...,Z_n)</code></p></li><li><p>S then initializes a pseudorandom number generator PRNG with the seed <code>z</code> and outputs <code>c_1, ... , c_n ← PRNG(z)</code> where the output domain of PRNG is <code>ZZ_q</code></p></li><li><p>S generates composite group elements:</p></li></ul>
            <pre><code>M = (c_1*M_1) + ... + (c_n*M_n), Z = (c_1*Z_1) + ... + (c_n*Z_n)</code></pre>
            <ul><li><p>S calculates <code>(c,s) ← DLEQ(M:Z == G:Y)</code> and sends <code>(c,s)</code> to C, where <code>DLEQ(Z/M == Y/G)</code> refers to the proof protocol used in the non-batching case.</p></li><li><p>C computes <code>c’_1, … , c’_n ← PRNG(z)</code> and re-computes <code>M’</code>, <code>Z’</code> and checks that <code>c’ =?= c</code></p></li></ul><p>To see why this works, consider the reduced case where m = 2:</p>
            <pre><code>Z_1 = x(M_1),
Z_2 = x(M_2),
(c_1*Z_1) = c_1(x*M_1) = x(c_1*M_1),
(c_2*Z_2) = c_2(x*M_2) = x(c_2*M_2),
(c_1*Z_1) + (c_2*Z_2) = x[(c_1*M_1) + (c_2*M_2)]
</code></pre>
            <p>Therefore, all the elliptic curve points will have the same discrete log relation as each other, and hence equal to the secret key that is committed to by the edge.</p>
    <div>
      <h4>Benefits of V-OPRF vs blind RSA</h4>
      <a href="#benefits-of-v-oprf-vs-blind-rsa">
        
      </a>
    </div>
    <p>While the blind RSA specification that we released fulfilled our needs, we make the following concrete gains</p><ul><li><p>Simpler, faster primitives</p></li><li><p>10x savings in pass size (~256 bits using P-256 instead of ~2048)</p></li><li><p>The only thing edge to manage is a private scalar. No certificates.</p></li><li><p>No need for public-key encryption at all, since the derived shared key used to calculate each MAC is never transmitted and cannot be found from passive observation without knowledge of the edge key or the user's blinding factor.</p></li><li><p>Exponentiations are more efficient due to use of elliptic curves.</p></li><li><p>Easier key rotation. Instead of managing certificates pinned in TBB and submitted to CT, we can use the DLEQ proofs to allow users to positively verify they're in the same anonymity set with regard to the edge secret key as everyone else.</p></li></ul>
    <div>
      <h4>Download</h4>
      <a href="#download">
        
      </a>
    </div>
    <p>Privacy Pass v1.0 is available as a browser extension for <a href="https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi">Chrome</a> and <a href="https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/">Firefox</a>. If you find any issues while using then <a href="https://privacypass.github.io">let us know</a>.</p>
    <div>
      <h4>Source code</h4>
      <a href="#source-code">
        
      </a>
    </div>
    <p>The code for the browser extension and server has been open-sourced and can be found at <a href="https://github.com/privacypass/challenge-bypass-extension">https://github.com/privacypass/challenge-bypass-extension</a> and <a href="https://github.com/privacypass/challenge-bypass-server">https://github.com/privacypass/challenge-bypass-server</a> respectively. We are welcoming contributions if you happen to notice any improvements that can be made to either component. If you would like to get in contact with the Privacy Pass team then find us at our <a href="https://privacypass.github.io">website</a>.</p>
    <div>
      <h4>Protocol details</h4>
      <a href="#protocol-details">
        
      </a>
    </div>
    <p>More information about the protocol can be found <a href="https://privacypass.github.io/protocol">here</a>.</p>
    <div>
      <h4>Acknowledgements</h4>
      <a href="#acknowledgements">
        
      </a>
    </div>
    <p>The creation of Privacy Pass has been a joint effort by the team made up of George Tankersley, Ian Goldberg, Nick Sullivan, Filippo Valsorda and myself.</p><p>I'd also like to thank Eric Tsai for creating the logo and extension design, Dan Boneh for helping us develop key parts of the protocol, as well as Peter Wu and Blake Loring for their helpful code reviews. We would also like to acknowledge Sharon Goldberg, Christopher Wood, Peter Eckersley, Brian Warner, Zaki Manian, Tony Arcieri, Prateek Mittal, Zhuotao Liu, Isis Lovecruft, Henry de Valence, Mike Perry, Trevor Perrin, Zi Lin, Justin Paine, Marek Majkowski, Eoin Brady, Aaran McGuire, and many others who were involved in one way or another and whose efforts are appreciated.</p>
    <div>
      <h4>References</h4>
      <a href="#references">
        
      </a>
    </div>
    <p>Cha82: Chaum. <a href="https://dl.acm.org/citation.cfm?doid=4372.4373">Blind signatures for untraceable payments. CRYPTO’82</a>CP93: Chaum, Pedersen. <a href="http://chaum.com/publications/Wallet_Databases.pdf">Wallet Databases with Observers. CRYPTO'92.</a>Hen14: Ryan Henry. <a href="https://uwspace.uwaterloo.ca/bitstream/handle/10012/8621/Henry_Ryan.pdf">Efficient Zero-Knowledge Proofs and Applications, August 2014.</a>JKK14: Jarecki, Kiayias, Krawczyk. <a href="https://eprint.iacr.org/2014/650.pdf">Round-Optimal Password-Protected Secret Sharing and T-PAKE in the Password-Only model.</a>JKKX16: Jarecki, Kiayias, Krawczyk, Xu. <a href="https://eprint.iacr.org/2016/144.pdf">Highly-Efficient and Composable Password-Protected Secret Sharing.</a></p> ]]></content:encoded>
            <category><![CDATA[Privacy Pass]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Chrome]]></category>
            <category><![CDATA[Firefox]]></category>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[Cryptography]]></category>
            <guid isPermaLink="false">41Lr8xZtaEnIidX8Q0fvEX</guid>
            <dc:creator>Alex Davidson</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare supports Privacy Pass]]></title>
            <link>https://blog.cloudflare.com/cloudflare-supports-privacy-pass/</link>
            <pubDate>Thu, 09 Nov 2017 16:00:00 GMT</pubDate>
            <description><![CDATA[ Cloudflare supports Privacy Pass, a recently-announced privacy-preserving protocol developed in collaboration with researchers from Royal Holloway and the University of Waterloo.  ]]></description>
            <content:encoded><![CDATA[ <p></p>
    <div>
      <h3>Enabling anonymous access to the web with privacy-preserving cryptography</h3>
      <a href="#enabling-anonymous-access-to-the-web-with-privacy-preserving-cryptography">
        
      </a>
    </div>
    <p>Cloudflare supports Privacy Pass, a <a href="https://medium.com/@alxdavids/privacy-pass-6f0acf075288">recently-announced</a> privacy-preserving protocol developed in collaboration <a href="https://privacypass.github.io">with researchers from Royal Holloway and the University of Waterloo</a>. Privacy Pass leverages an idea from cryptography — zero-knowledge proofs — to let users prove their identity across multiple sites anonymously without enabling tracking. Users can now use the Privacy Pass browser extension to reduce the number of challenge pages presented by Cloudflare. We are happy to support this protocol and believe that it will help improve the browsing experience for some of the Internet’s least privileged users.</p><p>The Privacy Pass extension is available for both <a href="https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi">Chrome</a> and <a href="https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/">Firefox</a>. When people use anonymity services or shared IPs, it makes it more difficult for <a href="https://www.cloudflare.com/learning/security/how-to-secure-a-website/">website protection services</a> like Cloudflare to identify their requests as coming from legitimate users and not bots. Privacy Pass helps reduce the friction for these users—which include some of the most vulnerable users online—by providing them a way to prove that they are a human across multiple sites on the Cloudflare network. This is done without revealing their identity, and without exposing Cloudflare customers to additional threats from malicious bots. As the first service to support Privacy Pass, we hope to help demonstrate its usefulness and encourage more Internet services to adopt it.</p><p>Adding support for Privacy Pass is part of a broader initiative to help make the Internet accessible to as many people as possible. Because Privacy Pass will only be used by a small subset of users, we are also working on other improvements to our network in service of this goal. For example, we are making improvements in our request categorization logic to better identify bots and to improve the web experience for legitimate users who are negatively affected by Cloudflare’s current bot protection algorithms. As this system improves, users should see fewer challenges and site operators should see fewer requests from unwanted bots. We consider Privacy Pass a piece of this puzzle.</p><p>Privacy Pass is fully open source under a BSD license and the code is available <a href="https://github.com/privacypass/challenge-bypass-extension">on GitHub</a>. We encourage anyone who is interested to download the source code, play around with the implementations and contribute to the project. The Pass Team have also open sourced a <a href="https://github.com/privacypass/challenge-bypass-server">reference implementation of the server</a> in Go if you want to test both sides of the system. Privacy Pass support at Cloudflare is currently in beta. If you find a bug, please let the team know by creating an issue on GitHub.</p><p>In this blog post I'll be going into depth about the problems that motivated our support for this project and how you can use it to reduce the annoyance factor of CAPTCHAs and other user challenges online.</p>
    <div>
      <h3>Enabling universal access to content</h3>
      <a href="#enabling-universal-access-to-content">
        
      </a>
    </div>
    <p>Cloudflare believes that the <a href="/ensuring-that-the-web-is-for-everyone/">web is for everyone</a>. This includes people who are accessing the web anonymously or through shared infrastructure. Tools like VPNs are useful for protecting your identity online, and people using these tools should have the same access as everyone else. We believe the vast collection of information and services that make up the Internet should be available to every person.</p><p>In a <a href="/the-trouble-with-tor/">blog post last year</a>, our CEO, Matthew Prince, spoke about the tension between security, anonymity, and convenience on the Internet. He posited that in order to secure a website or service while still allowing anonymous visitors, you have to sacrifice a bit of convenience for these users. This tradeoff is something that every website or web service has to make.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1rTJ4tISNkUI4x5SxAZIWU/3a9ad7898fa4811504aeb44db6b168d2/image5.jpg" />
            
            </figure><p>The Internet is full of bad actors. The frequency and severity of online attacks is <a href="http://techspective.net/2017/08/12/latest-ddos-trends-learning-experts/">rising every year</a>. This turbulent environment not only threatens websites and web services with attacks, it threatens their ability to stay online. As smaller and more diverse sites become targets of anonymous threats, a greater percentage of the Internet will choose to sacrifice user convenience in order to stay secure and universally accessible.</p><p>The average Internet user visits dozens of sites and services every day. Jumping through a hoop or two when trying to access a single website is not that big of a problem for people. Having to do that for every site you visit every day can be exhausting. This is the problem that Privacy Pass is perfectly designed to solve.</p><p>Privacy Pass doesn’t completely eliminate this inconvenience. Matthew’s trilemma still applies: anonymous users are still inconvenienced for sites that want security. What Privacy Pass does is to notably reduce that inconvenience for users with access to a browser. Instead of having to be inconvenienced thirty times to visit thirty different domains, you only have to be inconvenienced once to gain access to thirty domains on the Cloudflare network. Crucially, unlike unauthorized services like <a href="https://addons.mozilla.org/firefox/addon/cloudhole/">CloudHole</a>, Privacy Pass is designed to respect user privacy and anonymity. This is done using privacy-preserving cryptography, which prevents Cloudflare or anyone else from tracking a user’s browsing across sites. Before we go into how this works, let’s take a step back and take a look at why this is necessary.</p>
    <div>
      <h3>Am I a bot or not?</h3>
      <a href="#am-i-a-bot-or-not">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/43zt4JxSv0HW37HA0mfbpj/35736e017d0903dc6c0a89e135635e67/image2.jpg" />
            
            </figure><p><a href="https://commons.wikimedia.org/wiki/File:Metal_House_Battery_Operated_New_2010_Robots_You_are_Three_Times_a_Robot~~.jpg">D J Shin</a> Creative Commons Attribution-Share Alike 3.0 Unported</p><p>Without explicit information about the identity of a user, a web server has to rely on fuzzy signals to guess which request is from a bot and which is from a human. For example, bots often use automated scripts instead of web browsers to do their crawling. The way in which scripts make web requests is often different than how web browsers would make the same request in subtle ways.</p><p>A simple way for a user to prove they are not a bot to a website is by logging in. By providing valid authentication credentials tied to a long-term identity, a user is exchanging their anonymity for convenience. Having valid authentication credentials is a strong signal that a request is not from a bot. Typically, if you authenticate yourself to a website (say by entering your username and password) the website sets what’s called a “cookie”. A cookie is just a piece of data with an expiration date that’s stored by the browser. As long as the cookie hasn’t expired, the browser includes it as part of the subsequent requests to the server that set it. Authentication cookies are what websites use to know whether you’re logged in or not. Cookies are only sent on the domain that set them. A cookie set by site1.com is not sent for requests to site2.com. This prevents identity leakage from one site to another.</p><p>A request with an authentication cookie is usually not from a bot, so bot detection is much easier for sites that require authentication. Authentication is by definition de-anonymizing, so putting this in terms of Matthew’s trilemma, these sites can have security and convenience because they provide no anonymous access. The web would be a very different place if every website required authentication to display content, so this signal can only be used for a small set of sites. The question for the rest of the Internet becomes: without authentication cookies, what else can be used as a signal that a user is a person and not a bot?</p>
    <div>
      <h3>The Turing Test</h3>
      <a href="#the-turing-test">
        
      </a>
    </div>
    <p>One thing that can be used is a user challenge: a task that the server asks the user to do before showing content. User challenges can come in many forms, from a <a href="https://en.wikipedia.org/wiki/Proof-of-work_system">proof-of-work</a> to a <a href="https://en.wikipedia.org/w/index.php?title=Guided_tour_puzzle_protocol">guided tour puzzle</a> to the classic CAPTCHA. A CAPTCHA (an acronym for "Completely Automated Public Turing test to tell Computers and Humans Apart") is a test to see if the user is a human or not. It often involves reading some scrambled letters or identifying certain slightly obscured objects — tasks that humans are generally better at than automated programs. The goal of a user challenge is not only to deter bots, but to gain confidence that a visitor is a person. Cloudflare uses a combination of different techniques as user challenges.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2VcN8gtQWsULtIcGMggqDJ/c51be6c6bb97edf8836d04b2542a4f63/image7.jpg" />
            
            </figure><p>CAPTCHAs can be annoying and time-consuming to solve, so they are usually reserved for visitors with a high probability of being malicious.</p><p>The challenge system Cloudflare uses is cookie-based. If you solve a challenge correctly, Cloudflare will set a cookie called <code>CF_CLEARANCE</code> for the domain that presented the challenge. Clearance cookies are like authentication cookies, but instead of being tied to an identity, they are tied to the fact that you solved a challenge sometime in the past.</p><ol><li><p>Person sends Request</p></li><li><p>Server responds with a challenge</p></li><li><p>Person sends solution</p></li><li><p>Server responds with <code>set-cookie</code> and bypass cookie</p></li><li><p>Person sends new request with cookie</p></li><li><p>Server responds with content from origin</p></li></ol><p>Site visitors who are able to solve a challenge are much more likely to be people than bots, the harder the challenge, the more likely the visitor is a person. The presence of a valid <code>CF_CLEARANCE</code> cookie is a strong positive signal that a request is from a legitimate person.</p>
    <div>
      <h3>How Privacy Pass protects your privacy: a voting analogy</h3>
      <a href="#how-privacy-pass-protects-your-privacy-a-voting-analogy">
        
      </a>
    </div>
    <p>You can use cryptography to prove that you have solved a challenge of a certain difficulty without revealing which challenge you solved. The technique that enables this is something called a <a href="https://en.wikipedia.org/wiki/Zero-knowledge_proof">Zero-knowledge proof</a>. This may sound scary, so let’s use a real-world scenario, vote certification, to explain the idea.</p><p>In some voting systems the operators of the voting center certify every ballot before sending them to be counted. This is to prevent people from adding fraudulent ballots while the ballots are being transferred from where the vote takes place to where the vote is counted.</p><p>An obvious mechanism would be to have the certifier sign every ballot that a voter submits. However, this would mean that the certifier, having just seen the person that handed them a ballot, would know how each person voted. Instead, we can use a better mechanism that preserves voters’ privacy using an envelope and some carbon paper.</p><ol><li><p>The voter fills out their ballot</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3jJCdqzHAp2kJrLYM3sYCT/5cfc32ff560877037977e7530faf1929/image6.png" />
            
            </figure></li><li><p>The voter puts their ballot into an envelope along with a piece of carbon paper, and seals the envelope</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7z8pR9zhr9HYM4OE9y2r4f/26fc8bcb4a1e4c92637cfc5b0f6ea0fb/image1.png" />
            
            </figure></li><li><p>The sealed envelope is given to the certifier</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3OhNebQdBXnoTBrBOTcDN9/54ad9db17b0956adc0a973f9a4d56b6b/image3.png" />
            
            </figure></li><li><p>The certifier signs the outside of the envelope. The pressure of the signature transfers the signature from the carbon paper to the ballot itself, effectively signing the ballot.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/fOvx6CrNvdsaPofVLPgPG/c33497b10a9212634b63c0bb349809dc/image8.png" />
            
            </figure></li><li><p>Later, when the ballot counter unseals the envelope, they see the certifier’s signature on the ballot.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4FSldNuKdhhv537vDigZtp/c35bd412ad8c468d9b2068149afef072/image4.png" />
            
            </figure></li></ol><p>With this system, a voting administrator can authenticate a ballot without knowing its content, and then the ballot can be verified by an independent assessor.</p><p>Privacy Pass is like vote certification for the Internet. In this analogy, Cloudflare’s challenge checking service is the vote certifier, Cloudflare’s bot detection service is the vote counter and the anonymous visitor is the voter. When a user encounters a challenge on site A, they put a ballot into a sealed envelope and send it to the server along with the challenge solution. The server then signs the envelope and returns it to the client. Since the server is effectively signing the ballot without knowing its contents, this is called a <i>blind signature</i>.</p><p>When the user sees a challenge on site B, the user takes the ballot out of the envelope and sends it to the server. The server then checks the signature on the ballot, which proves that the user has solved a challenge. Because the server has never seen the contents of the ballot, it doesn’t know which site the challenge was solved for, just that a challenge was solved.</p><p>It turns out that with the right cryptographic construction, you can approximate this scenario digitally. This is the idea behind Privacy Pass.</p><p>The Privacy Pass team implemented this using a privacy-preserving cryptographic construction called an Elliptic Curve Verifiable Oblivious Pseudo-Random Function (EC-VOPRF). Yes, it’s a mouthful. From the Privacy Pass Team:</p><blockquote><p>Every time the Privacy Pass plugin needs a new set of privacy passes, it creates a set of thirty random numbers <code>t1</code> to <code>t30</code>, hashes them into a curve (P-256 in our case), blinds them with a value <code>b</code> and sends them along with a challenge solution. The server returns the set of points multiplied by its private key and a batch discrete logarithm equivalence proof. Each pair <code>tn, HMAC(n,M)</code> constitutes a Privacy Pass and can be redeemed to solve a subsequent challenge. Voila!</p></blockquote><p>If none of these words make sense to you and you want to know more, check out the Privacy Pass team’s [protocol design document](<a href="https://privacypass.github.io/protocol/">https://privacypass.github.io/protocol/</a>).</p>
    <div>
      <h3>Making it work in the browser</h3>
      <a href="#making-it-work-in-the-browser">
        
      </a>
    </div>
    <p>It takes more than a nice security protocol based on solid cryptography to make something useful in the real world. To bring the advantages of this protocol to users, the Privacy Pass team built a client in JavaScript and packaged it using <a href="https://developer.mozilla.org/en-US/Add-ons/WebExtensions/What_are_WebExtensions">WebExtensions</a>, a cross-browser framework for developing applications that run in the browser and modify website behavior. This standard is compatible with both Chrome and Firefox. A reference implementation of the server side of the protocol was <a href="https://github.com/privacypass/challenge-bypass-server">also implemented in Go</a>.</p><p>If you’re a web user and are annoyed by CAPTCHAs, you can download the Privacy Pass extension for Chrome <a href="https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi">here</a> and for Firefox <a href="https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/">here</a>. It will significantly improve your web browsing experience. Once it is installed, you’ll see a small icon on your browser with a number under it. The number is how many unused privacy passes you have. If you are running low on passes, simply click on the icon and select “Get More Passes,” which will load a CAPTCHA you can solve in exchange for thirty passes. Every time you visit a domain that requires a user challenge page to view, Privacy Pass will “spend” a pass and the content will load transparently. Note that you may see more than one pass spent up when you load a site for the first time if the site has subresources from multiple domains.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/23gnEcti3z4owPHwH37m6o/09b9335b07c60d4e20b2510159f83440/Firefox-3--2-.png" />
            
            </figure><p>The Privacy Pass extension works by hooking into the browser and looking for HTTP responses that have a specific header that indicates support for the Privacy Pass protocol. When a challenge page is returned, the extension will either try to issue new privacy passes or redeem existing privacy passes. The cryptographic operations in the plugin were built on top of <a href="https://github.com/bitwiseshiftleft/sjcl">SJCL</a>.</p><p>If you’re a Cloudflare customer and want to opt out from supporting Privacy Pass, please <a href="https://support.cloudflare.com">contact our support team</a> and they will disable it for you. We are soon adding a toggle for Privacy Pass in the Firewall app in the Cloudflare dashboard.</p>
    <div>
      <h3>The web is for everyone</h3>
      <a href="#the-web-is-for-everyone">
        
      </a>
    </div>
    <p>The technology behind Privacy Pass is free for anyone to use. We see a bright future for this technology and think it will benefit from community involvement. The protocol is currently only deployed at Cloudflare, but it could easily be used across different organizations. It’s easy to imagine obtaining a Privacy Pass that proves that you have a Twitter or Facebook identity and using it to access other services on the Internet without revealing your identity, for example. There are a wide variety of applications of this technology that extend well beyond our current use cases.</p><p>If this technology is intriguing to you and you want to collaborate, please reach out to the Privacy Pass team on <a href="https://github.com/privacypass">GitHub</a>.</p> ]]></content:encoded>
            <category><![CDATA[Privacy]]></category>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Privacy Pass]]></category>
            <category><![CDATA[Firefox]]></category>
            <category><![CDATA[Chrome]]></category>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[Cryptography]]></category>
            <guid isPermaLink="false">7vBxBfvbpwQEokzxhTdIy6</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[CloudFlare Adds Multiple Language Support]]></title>
            <link>https://blog.cloudflare.com/cloudflare-adds-multiple-language-support/</link>
            <pubDate>Wed, 02 Mar 2011 00:02:00 GMT</pubDate>
            <description><![CDATA[ CloudFlare, with the help of many of our community members, has recently added support for 8 additional 
languages on the CloudFlare challenge page. ]]></description>
            <content:encoded><![CDATA[ <p>[</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4IzvOwa9zaO4Zm8toYTwSt/7e3bec8c451895c85db9feb9018d9670/5489885171_6510bcf0d6.jpg" />
            
            </figure><p>](<a href="http://www.flickr.com/photos/damonbillian/5489885171/">http://www.flickr.com/photos/damonbillian/5489885171/</a> "globe by dbillian, on Flickr")</p><p>CloudFlare, with the help of many of our community members, has recently added support for multiple languages on the <a href="/new-feature-customize-your-cloudflare-challen">CloudFlare challenge page</a>.</p><p>In addition to English, we've added the following languages:</p><ul><li><p>Chinese</p></li><li><p>Dutch</p></li><li><p>French</p></li><li><p>German</p></li><li><p>Italian</p></li><li><p>Portuguese</p></li><li><p>Spanish</p></li><li><p>Turkish</p></li></ul><p>Languages we plan to release in the next two weeks:</p><ul><li><p>Czech</p></li><li><p>Estonian</p></li><li><p>Indonesian</p></li><li><p>Malay</p></li><li><p>Marathi</p></li><li><p>Norwegian</p></li><li><p>Ukrainian</p></li><li><p>Urdu</p></li></ul><p>The language displayed is based on the browser setting of your visitor. If the browser setting is from a language that we do not yet support, then the page defaults to English.</p><p>We will continually expand the number of languages we support. If you are proficient in a language not currently listed and want to help with translation, <a>contact us</a>. Please include the language in the subject line.</p> ]]></content:encoded>
            <category><![CDATA[CAPTCHA]]></category>
            <category><![CDATA[Community]]></category>
            <guid isPermaLink="false">4rs0sYLdl884QZ0xARwkjV</guid>
            <dc:creator>Damon Billian</dc:creator>
        </item>
    </channel>
</rss>