<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Security &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/category/technology/security/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Wed, 29 Apr 2026 22:39:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Web Apps Denial of Service</title>
		<link>https://blog.xojo.com/2026/04/29/web-apps-denial-of-service/</link>
		
		<dc:creator><![CDATA[Ricardo Cruz]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 22:39:52 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Xojo Web]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=16222</guid>

					<description><![CDATA[Last week we got a report of a critical bug affecting Xojo Web apps. Here's what happened, what we did about it, and what you should do depending on how your apps are deployed.]]></description>
										<content:encoded><![CDATA[
<p>Last week we got a report of a critical bug affecting Xojo Web apps. A malformed percent-encoded URL was enough to crash the web app server. Something as small as <code>?x=%</code> in a query string was all it took. We shipped a fix in <a href="https://xojo.com/download/">2026r1.2</a>, and Xojo Cloud has been patched at the platform level to cover users who can&#8217;t upgrade right away. Here&#8217;s what happened, what we did about it, and what you should do depending on how your apps are deployed.</p>



<h2 class="wp-block-heading">Am I affected? What do I do?</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>If you only read one section, read this one.</strong></p>
</blockquote>



<ul class="wp-block-list">
<li><strong>On Xojo Cloud (Web 1 or Web 2)?</strong>&nbsp;You&#8217;re covered. Nothing to do.</li>



<li><strong>Using Lifeboat?</strong>&nbsp;Update Lifeboat and redeploy.</li>



<li><strong>Self-hosted behind Apache or Nginx?</strong> Drop in the filtering rule below. If you&#8217;re on Web 2, also upgrade to 2026r1.2 if possible.</li>



<li><strong>Self-hosted with the Xojo app exposed directly?</strong> On Web 2, upgrade to 2026r1.2 if possible, otherwise put a reverse proxy in front. On Web 1, put a reverse proxy in front (which is what we&#8217;d recommend either way).</li>
</ul>



<p>The full details follow.</p>



<h2 class="wp-block-heading">Timeline</h2>



<ul class="wp-block-list">
<li><strong>Thursday, the 23rd.</strong>&nbsp;A public issue and a private message landed on the same day, both pointing at the same bug.</li>



<li><strong>Thursday through Monday.</strong>&nbsp;We tracked down the root cause, wrote the fix, and tested it.</li>



<li><strong>Tuesday, the 28th.</strong> 2026r1.2 shipped with the patch.</li>



<li><strong>Wednesday, the 29th.</strong>&nbsp;Xojo Cloud patched at the platform level.</li>
</ul>



<p>Under a week from the report to a patched release, with the platform-level mitigation following the next day.</p>



<h2 class="wp-block-heading">What Happened</h2>



<p>A request with a malformed percent-encoded sequence in a query parameter could crash a running Xojo Web app. The smallest reproducer is something like&nbsp;<code>?x=%</code>. That&#8217;s a&nbsp;<code>%</code>&nbsp;not followed by two hex digits, which is invalid percent-encoding and isn&#8217;t decodable.</p>



<p>The bug lives in&nbsp;<code>DecodeURLComponent</code>. When the method ran into invalid input, it raised an exception instead of handling the input gracefully. Because the framework calls this method while parsing incoming requests, anyone could crash a web app by sending a single malformed URL. No authentication, no special headers, no payload. Just a bad query string.</p>



<p>A few things worth being upfront about:</p>



<ul class="wp-block-list">
<li><strong>The bug has probably been there since&nbsp;<code>DecodeURLComponent</code>&nbsp;was introduced.</strong>&nbsp;Every Xojo release that ships the method might be affected.</li>



<li><strong>Both Web 1 and Web 2 are known to be affected.</strong>&nbsp;The Web framework has been calling this method on incoming requests across both generations.</li>



<li><strong>It&#8217;s not just a Web problem.</strong>&nbsp;<code>DecodeURLComponent</code>&nbsp;is a general-purpose method, and the same crash can happen in Desktop and other project types if you call it on attacker-controlled input. Web is the obvious target because requests arrive from the network, but the underlying issue isn&#8217;t Web-specific.</li>
</ul>



<h2 class="wp-block-heading">The Fix</h2>



<p>In 2026r1.2, <code>DecodeURLComponent</code> no longer crashes on invalid input. Instead, it returns an empty String when the input contains a malformed percent-encoded sequence.</p>



<p>We thought about a few approaches and went with this one on purpose, for being consistent with the other sanity checks we do on this method. An empty return value lets existing code keep running rather than letting an exception bubble up through request handling, which is what you want from a method that&#8217;s frequently called on untrusted input. If your code already wraps&nbsp;<code>DecodeURLComponent</code>&nbsp;with its own validation, the new behavior gives you a clean signal to act on (an empty result) instead of an exception to catch.</p>



<p>Xojo 2026r1.2 is the only release with the fix. <strong>Web 1 won&#8217;t be getting a backported patch.</strong> What that means in practice is covered below.</p>



<h2 class="wp-block-heading">What Xojo has already done for you</h2>



<p><strong>Xojo Cloud has been patched at the platform level.</strong>&nbsp;As of Wednesday 29th, Xojo Cloud rejects requests with malformed percent-encoding before they ever reach your app, returning a&nbsp;<code>400 Bad Request</code>&nbsp;from the front-end web server. This protection doesn&#8217;t care which Xojo version your app was built with, and it covers Web 1 and Web 2 the same way.</p>



<p>If your app runs on Xojo Cloud, you don&#8217;t need to redeploy, upgrade, or change anything. We rolled this out specifically so that users who can&#8217;t upgrade right away are covered, including Web 1 users who can&#8217;t upgrade to a fixed version at all.</p>



<h2 class="wp-block-heading">What you should do</h2>



<p>The right move depends on which Web version you&#8217;re on and where your app runs.</p>



<h3 class="wp-block-heading">If you&#8217;re on Web 2</h3>



<p>Upgrade to 2026r1.2 and redeploy if you can. That&#8217;s the cleanest fix and it addresses the issue at the source.</p>



<p>We know &#8220;just upgrade&#8221; isn&#8217;t always realistic. You might be on an older version because your license has expired, because a third-party plugin you rely on hasn&#8217;t caught up yet, because a newer Xojo release introduced a regression you can&#8217;t ship around, or for any number of other reasons. If that&#8217;s you, the hosting-based mitigations below will protect your app in the meantime, and they work regardless of which Xojo version you built with.</p>



<h3 class="wp-block-heading">If you&#8217;re on Web 1</h3>



<p>There&#8217;s no Xojo release that patches&nbsp;<code>DecodeURLComponent</code>&nbsp;for Web 1, so the fix has to live outside your app. The good news is that if you follow Xojo&#8217;s standard hosting recommendations, you&#8217;re fully covered against this specific issue:</p>



<ul class="wp-block-list">
<li><strong>Stay on Xojo Cloud.</strong>&nbsp;You&#8217;re already protected.</li>



<li><strong>Use Lifeboat.</strong>&nbsp;Tim Parnell shipped a Lifeboat update that catches malformed percent-encoding before it reaches your app. Update Lifeboat and redeploy.</li>



<li><strong>Run behind Apache or Nginx</strong>&nbsp;with the rules in the next section.</li>
</ul>



<p>Separately, and on a longer horizon: Web 1 isn&#8217;t receiving framework patches anymore in general, so if you&#8217;re still on it, this is a reasonable moment to start thinking about a migration to Web 2. That&#8217;s a much bigger conversation than this post, but worth flagging.</p>



<h3 class="wp-block-heading">Hosting-level mitigations</h3>



<p>These rules reject malformed percent-encoded URLs at the web server, before the request reaches your Xojo app at all. They work for Web 1 and Web 2, and they don&#8217;t depend on the Xojo version you built with.</p>



<p><strong>Apache:</strong></p>



<pre class="wp-block-code"><code># Reject malformed percent-encoding in the URI.
RewriteCond %{THE_REQUEST} %(?!&#91;0-9A-Fa-f]{2})
RewriteRule .* - &#91;R=400,L]</code></pre>



<p><strong>Nginx:</strong></p>



<pre class="wp-block-code"><code># Reject malformed percent-encoding in the URI.
if ($request_uri ~ "%(?!&#91;0-9A-Fa-f]{2})") {
  return 400;
}</code></pre>



<p>Reload your web server after updating the config (<code>apachectl graceful</code>&nbsp;or&nbsp;<code>nginx -s reload</code>) and check that a request like&nbsp;<code>https://yourapp.example.com/?x=%</code>&nbsp;comes back as&nbsp;<code>400 Bad Request</code>.</p>



<p>These two snippets aren&#8217;t the only way to handle this. The goal is just to block malformed URLs before they reach your app, however you do it. If you&#8217;re running <code>mod_security</code>, for example, a rule that rejects URIs containing invalid percent-encoding will get you the same result. Same idea for any WAF, edge filter, CDN, or load balancer in front of your stack: catch the bad request, return a&nbsp;<code>400</code>, move on.</p>



<h3 class="wp-block-heading">If your Xojo app is exposed directly to the internet</h3>



<p>If your Web app is talking to the internet without a reverse proxy in front of it, your options are narrower. On Web 2, upgrade to 2026r1.2 if you can. On Web 1, or on Web 2 if upgrading isn&#8217;t an option, you&#8217;ll need to put Apache, Nginx, or Lifeboat in front of your app, or move to Xojo Cloud, our managed hosting solution.</p>



<p>This is also a good moment to revisit the setup more broadly.&nbsp;<strong>Xojo recommends always serving Web apps behind a web server</strong>, both for performance and as a defense-in-depth measure against bugs like this one. A reverse proxy would have neutralized this specific issue before it reached the framework, and it&#8217;ll do the same for the next class of issue too.</p>



<h3 class="wp-block-heading">If you use&nbsp;<code>DecodeURLComponent</code>&nbsp;in a non-Web project</h3>



<p>The crash isn&#8217;t unique to Web. If you&#8217;re calling&nbsp;<code>DecodeURLComponent</code>&nbsp;on input you don&#8217;t control (anything coming from a user, a file, a network response, a clipboard), the same bug can hit a Desktop, Console, or other project type.</p>



<p>Upgrade to 2026r1.2 if you can; that&#8217;s the proper fix.</p>



<p>If you can&#8217;t upgrade, you&#8217;ll need to sanitize the input yourself before calling&nbsp;<code>DecodeURLComponent</code>. The check is simple in principle: every&nbsp;<code>%</code>&nbsp;in the string must be followed by exactly two hexadecimal characters (<code>0-9</code>,&nbsp;<code>A-F</code>,&nbsp;<code>a-f</code>). If any&nbsp;<code>%</code>&nbsp;doesn&#8217;t meet that condition, treat the input as invalid and don&#8217;t pass it to&nbsp;<code>DecodeURLComponent</code>. A small helper that validates the string up front and either returns early or substitutes an empty value will keep your app from crashing on the same kind of malformed input that triggers the Web bug.</p>



<h2 class="wp-block-heading">Acknowledgments</h2>



<p>Thanks to the user who reported this through both public and private channels. That&#8217;s exactly the kind of disclosure that lets us turn a fix around in under a week. Thanks also to Tim Parnell for the fast <a href="https://strawberrysw.com/lifeboat/">Lifeboat</a> update, which gave self-hosted users a drop-in mitigation almost immediately.</p>



<p>If you find a security issue in Xojo, please report it privately. You can email&nbsp;<a href="mailto:support@xojo.com">support@xojo.com</a>&nbsp;or file a confidential issue on the issue tracker. Both reach us, and either one lets us get a fix out before the details become public, protecting the rest of the users.</p>



<h2 class="wp-block-heading">References</h2>



<ul class="wp-block-list">
<li><a href="https://documentation.xojo.com/resources/release_notes/2026r1.2.html">Release notes for 2026r1.2</a></li>
</ul>



<p><em>Ricardo has always been curious about how things work. Growing up surrounded by computers</em> he became interested in <em>web technologies in the dial-up connections era. Xojo has been his secret weapon and language of preference since 2018. When he’s not online, chances are he will be scuba diving … or crocheting amigurumis. Find Ricardo on Twitter <a href="https://web.archive.org/web/20220805000833/https://www.twitter.com/piradoiv" target="_blank" rel="noreferrer noopener">@piradoiv</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Code Signing on macOS: What Developers Need to Know, Part 4</title>
		<link>https://blog.xojo.com/2026/04/07/code-signing-on-macos-what-developers-need-to-know-part-4/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 19:00:00 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tutorials]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=16119</guid>

					<description><![CDATA[In the previous article, we saw how signing a macOS app is more than just handling certificates. Other factors come into play based on the&#8230;]]></description>
										<content:encoded><![CDATA[
<p>In the <a href="https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/" target="_blank" rel="noreferrer noopener">previous article</a>, we saw how signing a macOS app is more than just handling certificates. Other factors come into play based on the distribution method you choose and the features it will offer.</p>



<span id="more-16119"></span>



<p>Now, that we already know all the pieces involved in this particular puzzle (certificates, <a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/">sandboxing, notarization, hardened runtime</a>, etc.), the question to answer is…</p>



<h2 class="wp-block-heading">What kind of macOS code signing do you want to do today?</h2>



<p>Apple developer certificates installed on your Mac determine the kind of code signing and, thus, the distribution options available for your macOS app. They can also support certain macOS security requirements that distribution methods or features may impose, such as entitlements or provisioning profiles.</p>



<p>This diagram can help determine these based on the certificate used when signing the app, so you can get a better idea:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-scaled.png"><img fetchpriority="high" decoding="async" width="2560" height="678" src="https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-scaled.png" alt="" class="wp-image-16122" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-scaled.png 2560w, https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-300x79.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-1024x271.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-768x203.png 768w, https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-1536x407.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/04/macOS-Apps-SigningC-2048x542.png 2048w" sizes="(max-width: 2560px) 100vw, 2560px" /></a></figure>
</div>


<p>As a practical summary:</p>



<ul class="wp-block-list">
<li><strong>Ad-Hoc signing / None</strong>: This option makes sense primarily when you&#8217;re developing and running or debugging the app on your Mac or on the same computer, since it typically doesn&#8217;t require special entitlements or provisioning profiles.</li>



<li><strong>Apple Developer / Development</strong>. Using this certificate enables sandboxing, hardened runtime, entitlements and provisioning profiles even when debugging from the IDE or testing the build on your own computer. It offers a better experience, but you won&#8217;t be able to notarize it or bypass the Gatekeeper barrier if distributed to other users.</li>



<li><strong>Developer ID Application / Direct Distribution</strong>. With this certificate, you can notarize your app so Gatekeeper won’t block distribution outside the Mac App Store. When debugging from the IDE, entitlements and provisioning profiles (if needed) are applied as well, along with optional sandboxing.</li>



<li><strong>Apple Distribution / App Store</strong>. Use this certificate when the app has been tested and it is ready to be sent to App Store Connect… or even when you&#8217;re planning to send it to the App Store Connect so a group of beta-testers can test it using Apple&#8217;s TestFlight.</li>
</ul>



<h2 class="wp-block-heading">How the Xojo IDE helps with all of this?</h2>



<p>We have been adding features to the Xojo IDE to make code signing and distributing your macOS apps an easier and leaner process; most of these are available under Build Settings > macOS > Sign:</p>



<h3 class="wp-block-heading">Developer ID &#8211; Build For</h3>



<p>This is the <a href="https://blog.xojo.com/2026/03/31/team-based-signing-arrives-to-macos/" target="_blank" rel="noreferrer noopener">most recent addition</a> to better deal with the first, and most important, piece of the puzzle: handling certificates! Instead of having to go back and forth between the Keychain Access and the Xojo IDE to copy/paste the expected data from the certificates for the kind of build or distribution you plan for the app, you can now find under the Developer ID field all the available Developer Teams (usually just yours) and, when a Developer Team is selected, the &#8220;Build For&#8221; popup menu will be populated with the available options for builds/distributions based on the installed developer certificates for that team.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" width="834" height="634" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.50.45.png" alt="" class="wp-image-16137" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.50.45.png 834w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.50.45-300x228.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.50.45-768x584.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></figure>
</div>


<p>When all the Apple developer certificates are properly installed for a given Developer Team, the available options will be: Development, Direct Distribution and App Store (plus None, meaning Ad-Hoc signing).</p>



<p>If you find that some of these options are missing from the &#8220;Build For&#8221; popup menu, that means the corresponding certificate is not installed or there is some kind of issue with that certificate (maybe it has expired or has its private key missing). In those cases, we included the &#8220;Inspect…&#8221; option under the &#8220;Developer ID&#8221; popup menu. Selecting Inspect lets you gain a better picture about everything related to your Apple developer certificates and even get advice about how to fix the most common issues.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" width="1914" height="1560" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.53.39.png" alt="" class="wp-image-16138" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.53.39.png 1914w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.53.39-300x245.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.53.39-1024x835.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.53.39-768x626.png 768w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.53.39-1536x1252.png 1536w" sizes="(max-width: 1914px) 100vw, 1914px" /></figure>
</div>


<h3 class="wp-block-heading">Sandboxing</h3>



<p>Enable this feature if you plan to debug, build, or distribute your app as a sandboxed app. In that case, the associated editor will make it even easier to enable the sandboxing features that may apply to your particular app. The IDE will take care of all the rest. Note that, while sandboxing was previously only applied to built/distributed macOS apps in previous Xojo releases, starting with Xojo 2026r1 it is also applied when the app is being debugged from the IDE.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1012" height="1260" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.02.png" alt="" class="wp-image-16139" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.02.png 1012w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.02-241x300.png 241w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.02-822x1024.png 822w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.02-768x956.png 768w" sizes="auto, (max-width: 1012px) 100vw, 1012px" /></figure>
</div>


<h3 class="wp-block-heading">Hardened Runtime</h3>



<p>Enable this option mainly for apps meant to be built and/or distributed using Direct Distribution or the App Store options. While this is optional when distributing it via the Mac App Store, it is still highly recommended to enable it for that scenario.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1140" height="1408" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.45.png" alt="" class="wp-image-16140" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.45.png 1140w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.45-243x300.png 243w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.45-829x1024.png 829w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.55.45-768x949.png 768w" sizes="auto, (max-width: 1140px) 100vw, 1140px" /></figure>
</div>


<p>When the app is debugged from the IDE, the hardened runtime won&#8217;t be applied even if it is enabled… mainly so you can debug it!</p>



<p>As with sandboxing, the hardened runtime option also includes its own editor to make your app-specific selections easier. The IDE will take care of the under the hood processing when the app is built.</p>



<h3 class="wp-block-heading">Notarization</h3>



<p>If you haven&#8217;t started notarizing your macOS apps yet, now is the time! This will be possible only with the Direct Distribution option (equivalent to the Developer ID Application Certificate) and implies enabling hardened runtime. When you enable notarization, the associated hardened runtime will be enabled for you, even if you don&#8217;t select additional option from its editor.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1524" height="950" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-12.13.18.png" alt="" class="wp-image-16147" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-12.13.18.png 1524w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-12.13.18-300x187.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-12.13.18-1024x638.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-12.13.18-768x479.png 768w" sizes="auto, (max-width: 1524px) 100vw, 1524px" /></figure>
</div>


<p>Notarization requires the use of what Apple calls an <a href="https://support.apple.com/en-us/102654" target="_blank" rel="noreferrer noopener">App-Specific Password</a>, which you can set up by following the steps found in the window that appears when the associated Setup button is clicked.</p>



<p>Once everything has been setup, the notarization process will happen the next time the app is built. Note, the notarization process will not take place when the app is debugged from the IDE (as with hardened runtime); you don&#8217;t need to specifically disable that option.</p>



<h3 class="wp-block-heading">Entitlements</h3>



<p>The combination of certain certificates, build, and distribution options you choose for your app may require you to set a series of entitlements; for example, when enabling sandboxing and/or hardened runtime. Additionally, with Xojo 2026r1 it is possible to attach your built or debugged apps to Xcode Instruments for further inspections beyond the current capabilities of Xojo&#8217;s debugger.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="806" height="76" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.56.55.png" alt="" class="wp-image-16142" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.56.55.png 806w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.56.55-300x28.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.56.55-768x72.png 768w" sizes="auto, (max-width: 806px) 100vw, 806px" /></figure>
</div>


<p>In all of the above scenarios, Xojo will take care of the required entitlements without you needing to notice it; but if your app also makes use of some features that require adding extra entitlements (and probably a matching provisioning profile), as happens with most of the Apple specific services such as iCloud, Keychain, In-App Purchases, etc., you will need to craft the corresponding .plist file for them and add it using the User Entitlements option. These entitlements will be combined with the ones automatically generated by Xojo and included in the app during the code signing process.</p>



<h3 class="wp-block-heading">Provisioning Profiles</h3>



<p>On macOS, provisioning profiles are supported by a Copy Files build step, which requires selecting Contents as the destination folder. Not ideal, but that way you can select what kind of provisioning profile you want to apply to builds or when debugging your project (this is a new feature starting with Xojo 2026r1).</p>



<h3 class="wp-block-heading">Property List Editor</h3>



<p>The ability to add your own property list entries to the compiled/distributed macOS app is enhanced by a complete Property List Editor available under Build Settings &gt; macOS since Xojo 2025. It makes it easier to create these entries and even save them for reuse in other projects.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1424" height="1088" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.58.09.png" alt="" class="wp-image-16143" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.58.09.png 1424w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.58.09-300x229.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.58.09-1024x782.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.58.09-768x587.png 768w" sizes="auto, (max-width: 1424px) 100vw, 1424px" /></figure>
</div>


<p>The entries you add with the Property List Editor will be combined with those automatically generated by the IDE, or with entries that may have been added to the project using previous methods (such as adding an external .plist file to the Project Navigator sidebar).</p>



<h3 class="wp-block-heading">Publishing to the Mac App Store</h3>



<p>While there are some steps that need to be done both at <a href="https://developer.apple.com" target="_blank" rel="noreferrer noopener">Apple&#8217;s Developers Portal</a> and <a href="https://appstoreconnect.apple.com/login" target="_blank" rel="noreferrer noopener">App Store Connect Website</a>, you will be able to set your app category directly from the IDE under Build Settings &gt; macOS.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="816" height="184" src="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.59.23.png" alt="" class="wp-image-16144" srcset="https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.59.23.png 816w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.59.23-300x68.png 300w, https://blog.xojo.com/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-11.59.23-768x173.png 768w" sizes="auto, (max-width: 816px) 100vw, 816px" /></figure>
</div>


<p>In addition, the Publish feature (responsible for sending your app to App Store Connect) will be in charge of verifying that the project meets everything that Apple requires prior to send it for reviewing or making available through TestFlight.</p>



<p>In order for the Publish button to be enabled, you need to select the App Store option for the selected &#8220;Developer ID&#8221; Team from the &#8220;Build For&#8221; popup menu under Build Settings > macOS > Sign.</p>



<h2 class="wp-block-heading">Dealing with Certificates Issues</h2>



<p>It doesn&#8217;t matter if your app requires entitlements, provisioning profiles, or if you are going to notarize it or enable sandboxing plus hardened runtime. All of this is based on the signing of your developer certificates, so let&#8217;s go back and see how to deal with the most common issues related with these.</p>



<h3 class="wp-block-heading">Backup Your Certificates</h3>



<p>Once you have installed your certificates, the first thing you should do is export them from Keychain Access to a secure place (ideally, not in your computer but an external USB key or drive). Why? Here&#8217;s why:</p>



<ol class="wp-block-list">
<li>Apple only allows you to create certificates a maximum of five times per year (mostly because they expire after one year, <a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">as we did see in a previous entry</a>). Every time you install certificates, whether on the same computer or a different Mac you own, they count as new certificates, with different serial numbers and SHA1/SHA256 data. In practice, this reduces the number of installations available per year.</li>



<li>In addition, some features, like provisioning profiles, rely on the specific certificates selected during their creation. You will get a signing error if you build the app on a Mac with different certificates.</li>



<li>If you need to restore your Mac or migrate to a new Mac, your certificates won&#8217;t be restored using the usual tools from Apple. Having a backup of your developer certificates will make easier to restore them in Keychain Access after restoring your computer or when you change to a new Mac.</li>
</ol>



<p>Instead of using Xcode to install new certificates on every Mac you intend to use for code signing, install them on just one Mac, export them from that Mac, and import them into the Keychain Access app on your other Macs. This ensures all of your Macs will use the same certificates.</p>



<h3 class="wp-block-heading">Review Pending Apple Developer Agreements</h3>



<p>This is one of the most common issues related to code signing: it just stops working and you don&#8217;t know why and even the returned error messages doesn&#8217;t reveal why. If you&#8217;re sure you have the required developer certificates installed, they are valid (not expired), and don&#8217;t have any other issues then it is time to sign-in into the Apple Developer and App Store Connect portals to check if there are some pending agreements you need to accept.</p>



<h3 class="wp-block-heading">Missing and Expired Certificates</h3>



<p>This is another very common issue. Starting with Xojo 2026r1, we made easier to detect this situation. If a given certificate for your team is not installed, then you won&#8217;t be able to select the signing option from the &#8220;Build For&#8221; popup menu under Build Settings > macOS > Sign. You can further dig into it selecting the &#8220;Inspect…&#8221; option from the &#8220;Developer ID&#8221; popup menu, and even receive some advice on how to fix it!</p>



<h3 class="wp-block-heading">Certificates are all good…&nbsp;but the signing throws errors</h3>



<p>When using the Direct Distribution or App Store options, the code signing process uses Apple Time Servers to add the date and time as part of the signing. That means that the computer requires an active Internet connection, and that such time servers must be reachable from Apple’s side (it’s very rare for them to be down).</p>



<p>Other operations such as notarization and publish also require an active Internet connection, and the corresponding Apple services must be up and running. Some times these can be down.</p>



<p>When these issues occur, it is a good idea to check the <a href="https://developer.apple.com/system-status/" target="_blank" rel="noreferrer noopener">Apple Services status webpage</a>.</p>



<h2 class="wp-block-heading">In summary</h2>



<p>It&#8217;s been a long four-article ride with the aim of giving you a clearer understanding of what happens under the hood when you code sign your macOS apps, what kind of certificate you need for a given distribution, and which macOS security features are supported by Development, Developer ID Application or Apple Distribution certificates; and, most importantly, how Xojo helps you with all of it!</p>



<p>I&#8217;d love to hear about your experience with macOS code signing, the rough corners you still need to tackle, and other improvements you would welcome. The <a href="https://forum.xojo.com" target="_blank" rel="noreferrer noopener">Xojo forums</a> are a great place to keep the conversation going!</p>



<p>Happy macOS code signing with Xojo!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>Code Signing on macOS: What Developers Need to Know</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">Part 1, Get Started</a></li>



<li><a href="https://blog.xojo.com/2026/03/18/code-signing-on-macos-what-developers-need-to-know-part-2/" target="_blank" rel="noreferrer noopener">Part 2, Code Signing With Developer Certificates</a></li>



<li><a href="https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/">Part 3, Entitlements and Provisioning Profiles</a></li>



<li><a href="https://blog.xojo.com/2026/04/07/code-signing-on-macos-what-developers-need-to-know-part-4/" target="_blank" rel="noreferrer noopener">Part 4, How Xojo helps with Certificates, Signing and Distribution</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Team-based Signing Arrives to macOS</title>
		<link>https://blog.xojo.com/2026/03/31/team-based-signing-arrives-to-macos/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 13:21:00 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[2026r1]]></category>
		<category><![CDATA[Apple Developer Account]]></category>
		<category><![CDATA[Code Signing]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[macOS]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15951</guid>

					<description><![CDATA[In Xojo 2026r1 we revised the macOS Developer ID field and replaced it with a Team-based popup menu that aligns with the style found in&#8230;]]></description>
										<content:encoded><![CDATA[
<p>In Xojo 2026r1 we revised the macOS Developer ID field and replaced it with a Team-based popup menu that aligns with the style found in iOS projects. This change aims to offer a cleaner, more intuitive way to manage developer certificates for the distribution of your built macOS app.</p>



<span id="more-15951"></span>



<p>The Developer ID field was introduced in Xojo 2022r1, allowing you to fill in the developer certificate information needed for signing built macOS apps; however, it could be confusing to know exactly what information was expected.</p>



<ul class="wp-block-list">
<li>Developer ID Application</li>



<li>Developer ID Application: Francisco Javier Rodriguez Menendez</li>



<li>Developer ID Application: Francisco Javier Rodriguez Menendez (BW7PU32485)</li>



<li>7D767DB917A45A8976BEB5B92F04E8C18D09501A</li>
</ul>



<p>And… which certificate should be used for Development builds, Direct Distribution, or Mac App Store publishing? That may not be obvious for someone new to all this.</p>



<p>Additionally, what happens if the entered data comes from an expired certificate or if the certificate isn’t in the Keychain?</p>



<h2 class="wp-block-heading">The new approach: How it works</h2>



<p>The Team-based signing chooser for the Mac Developer ID field follows these steps:</p>



<ul class="wp-block-list">
<li><strong>Collects all the developer certificates</strong> found under the user Keychain.</li>



<li><strong>Groups the valid certificates by Team</strong> (what Apple designates as the TeamID).</li>



<li>Based on the previous information, the new popup menu &#8220;Build For&#8221; will offer only the code-signing options available for the current selected Team:
<ul class="wp-block-list">
<li><strong>Development</strong>. This is the equivalent to using the Apple Development certificate.</li>



<li><strong>Direct Distribution</strong>. This is the equivalent to using the Developer ID Application certificate.</li>



<li><strong>App Store</strong>. This is the equivalent to using the Apple Distribution certificate. In addition, the Publish feature will be enabled if, for the selected Team, there is also a valid 3rd‑party Mac Developer Installer certificate available.</li>
</ul>
</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="600" height="540" src="https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.28.02.png" alt="" class="wp-image-15962" srcset="https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.28.02.png 600w, https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.28.02-300x270.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>
</div>


<p>If None is selected in the Developer ID popup menu, the macOS app will be built/debugged using Ad-Hoc signing.</p>



<p>Both menus update on the fly, so if new certificates are added (or removed) from the keychain, or if any have expired since last opened, both the Developer ID and Build For popup menus will reflect those changes.</p>



<h2 class="wp-block-heading">macOS Certificates Inspector Window</h2>



<p>Under the Teams popup menu, there is also an Inspect… option. When selected, it opens a new window where you can view and gather additional information for:</p>



<ul class="wp-block-list">
<li>Installed / Missing Apple Intermediate Certificates.</li>



<li>Installed / Missing / Expired Developer Certificates, grouped by Team.</li>
</ul>



<p>At a glance, you’ll see useful details for each certificate, such as:</p>



<ul class="wp-block-list">
<li>The expiration date</li>



<li>The keychain where it is stored.</li>



<li>Serial number, useful for identifying same-kind developer / intermediate certificates under different Macs.</li>



<li>Issuer specific information.</li>
</ul>



<p>Clicking any certificate provides more detailed information about the role it plays in the macOS signing process.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2522" height="1920" src="https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21.png" alt="" class="wp-image-15963" srcset="https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21.png 2522w, https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21-300x228.png 300w, https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21-1024x780.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21-768x585.png 768w, https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21-1536x1169.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-at-09.30.21-2048x1559.png 2048w" sizes="auto, (max-width: 2522px) 100vw, 2522px" /></figure>
</div>


<p>This Inspector is also useful in order to identify some of the most common issues related with the handling of certificates such as:</p>



<ul class="wp-block-list">
<li><strong>Missing certificates for a given Team</strong>, determining thus the options that are available under the &#8220;Build For&#8221; popup menu.</li>



<li><strong>Expired certificates</strong>. These also determine the options that are available under the &#8220;Build For&#8221; popup menu for a given Team. In addition, if you want to do some cleanup, it is possible to delete these expired certificates directly from the Inspector without needing to open the Keychain Access app.</li>



<li><strong>About to expire certificates</strong>, so you are aware of it and the impact it could have on apps close to be distributed or on already created Provisioning Profiles, for example.</li>



<li><strong>Certificates with their private key missing</strong>. These can&#8217;t be used for signing purposes, so you will be able to re-install them in the keychain (if you have a backup) or install a new certificate.</li>



<li><strong>Developer Certificates where some of the required intermediate certificate is missing</strong>. You will be able to install the missing Intermediate (active Internet connection required).</li>
</ul>



<h2 class="wp-block-heading">Improvements to macOS Builds and Debugged apps</h2>



<p>Although Sandboxing, Entitlements, and Provisioning Profiles have been part of macOS app development, this release brings several enhancements in these areas:</p>



<ul class="wp-block-list">
<li>Now it is possible <strong>debug Sandboxed apps</strong> directly from the IDE.</li>



<li><strong>Entitlements and Provisioning Profile</strong> are applied when the app is debugged from the IDE.</li>



<li>Improvements in how the required Entitlements are added and signed when the macOS app is built; and also a better handling of the user-added entitlements and provisioning profile files (if required).</li>



<li><strong>Debugged and Built apps can be attached to the Instruments app</strong>. Among other things, Instruments can be used to detect issues such as memory leaks in the executed app. The IDE now automatically adds the required entitlement for this when: the app is debugged/built using the &#8220;None&#8221; (Ad-Hoc signing) from the Team popup menu, or, 2) when the app is built for Development (Build For) for a given Team.</li>
</ul>



<figure class="wp-block-video"><video controls src="https://blog.xojo.com/wp-content/uploads/2026/03/Untitled.mp4"></video></figure>



<p>When Build For is set to Direct Distribution or App Store, the required entitlement for Instruments to attach to the app, will be added only when the app is debugged from the IDE. If you want to use Instruments with a built app signed using these certificates, then you need to add that entitlement explicitly.</p>



<p>This decision is because when get-tasks-allow is set to True (the entitlement required in order Instrument being able to function), there are some well documented vulnerabilities that could be used to escalate privileges or inject code into your app. That&#8217;s not desirable for your distributed apps for sure (whether using Direct Distribution or if your app is installed through the Mac App Store).</p>



<h2 class="wp-block-heading">Looking forward</h2>



<p><br>We know there are still some areas to improve regarding code signing on macOS (and iOS) and we are working on some of them already. In the meantime, you’ll likely find the new Team-based Developer ID option more approachable, especially if this is your first experience dealing with certificates, signing, and distributing your freshly built macOS app.</p>



<p>A big THANK YOU to Richard Grafl for all his help and feedback during the beta-testing cycle of this feature.</p>



<p>Happy macOS code-signing!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p>Learn more about Code Signing in our recent series:</p>



<p><strong>Code Signing on macOS: What Developers Need to Know</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">Part 1, Get Started</a></li>



<li><a href="https://blog.xojo.com/2026/03/18/code-signing-on-macos-what-developers-need-to-know-part-2/" target="_blank" rel="noreferrer noopener">Part 2, Code Signing With Developer Certificates</a></li>



<li><a href="https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/">Part 3, Entitlements and Provisioning Profiles</a></li>



<li><a href="https://blog.xojo.com/2026/04/07/code-signing-on-macos-what-developers-need-to-know-part-4/" target="_blank" rel="noreferrer noopener">Part 4, How Xojo helps with Certificates, Signing and Distribution</a></li>
</ul>
]]></content:encoded>
					
		
		<enclosure url="https://blog.xojo.com/wp-content/uploads/2026/03/Untitled.mp4" length="2577230" type="video/mp4" />

			</item>
		<item>
		<title>Code Signing on macOS: What Developers Need to Know, Part 3</title>
		<link>https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 24 Mar 2026 16:00:00 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple Developer Account]]></category>
		<category><![CDATA[Code Signing]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[macOS]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15944</guid>

					<description><![CDATA[If you followed the previous two articles in this series, you should be set up properly now, right? Your Mac developer certificates are stored in&#8230;]]></description>
										<content:encoded><![CDATA[
<p>If you followed the previous two articles in this series, you should be set up properly now, right? Your Mac developer certificates are stored in Keychain Access, so you only need to fill in the Developer ID field under Build Settings &gt; macOS &gt; Sign with the appropriate certificate value, click Build (or Publish), and distribute your new amazing app worldwide. Well, not quite. There are still other pieces to consider when signing and distributing your macOS app.</p>



<span id="more-15944"></span>



<p>For the past 20 years, Apple has increasingly tightened security measures when it comes to running apps distributed by third parties. Let&#8217;s take a look at this summarized timeline of code-signing and security measures added by Apple over years:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-scaled.png"><img loading="lazy" decoding="async" width="2560" height="1056" src="https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-scaled.png" alt="" class="wp-image-15945" srcset="https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-scaled.png 2560w, https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-300x124.png 300w, https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-1024x422.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-768x317.png 768w, https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-1536x634.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/03/macOS-signing-Timeline-2048x845.png 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></figure>
</div>


<p>The most notable developments happened in 2011, 2012 and 2018, when terms like Sandbox and, especially, Containers, Gatekeeper, Hardened Runtime and Notarization were introduced and began to impact other pieces of the puzzle to consider when signing macOS apps. In fact, we could say that technologies such as code-signing, Sandboxing, Entitlements or Provisioning Profiles were among the first iOS technologies to make their way to macOS.</p>



<p>So here is an broad overview what these technologies mean:</p>



<ul class="wp-block-list">
<li><strong>Sandboxing</strong>&#8211; When used, Sandboxing confines applications to a restricted, designated area of the system (its own &#8220;container&#8221;), preventing them from accessing user data, hardware or other apps without explicit permission. The system requires apps to ask for permission to use hardware resources or access user files. Sandboxing is mandatory for apps distributed through the Mac App Store.</li>



<li><strong>Gatekeeper-</strong> This technology is the primary security layer that checks whether a downloaded app comes from a verified/known developer, especially when the application has been Notarized by Apple.</li>



<li><strong>Hardened Runtime</strong>&#8211; Acts as a proactive, system-enforced shield that protects applications while they run, preventing malicious code from exploiting legitimate software. Enabling Hardened Runtime is required for Notarization.</li>



<li><strong>Notarization</strong>&#8211; Notarization is an automated security screening process run by Apple that scans software distributed outside the Mac App Store for malicious components and known security issues. Today, notarization is required for software distributed outside the Mac App Store that has been signed with the Developer ID application certificate. As a result of the process, notarization generates and staples a ticket, signed by an Apple certificate, to the app so Gatekeeper can trust it when executed.</li>
</ul>



<p>So, basically, while Sandboxing is still optional for apps distributed outside the Mac App Store (i.e., signed with your Developer ID certificate), Notarization and Hardened Runtime are the recommended defaults. Enabling Sandboxing for your app is something you should consider based on the needs (features) and the privacy balance you want to offer your users.</p>



<p>If you plan to distribute the app through the Mac App Store as well, it will need to be Sandboxed and signed with your Apple Distribution certificate, while enabling Hardened Runtime is optional.</p>



<h2 class="wp-block-heading">Entitlements and Provisioning Profiles</h2>



<p>Entitlements and Provisioning Profiles are also required for many of these security measures, depending on the features and services your app uses, and they come into play during building and signing.</p>



<p>If you decide to go the Sandboxing route, then using Entitlements is mandatory. The good news is that Sandboxing entitlements are free to use (they don’t require creating or adding a Provisioning Profile to the project). However, if your app needs special access to the Keychain or uses iCloud, Apple Pay, or other services, you’ll need to create a Provisioning Profile in the Apple Developer portal.</p>



<p>Wait—what are Entitlements and Provisioning Profiles, and how do they relate to macOS app code signing?</p>



<h3 class="wp-block-heading">Entitlements</h3>



<p>Entitlements are XML-based .plist files (not unlike the app’s Info.plist) containing a set of key-value pairs. They are embedded directly into the app’s binary as part of the code signing process, typically using your Developer ID Application or Apple Distribution certificates.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="931" height="651" src="https://blog.xojo.com/wp-content/uploads/2026/03/Entitlements.png" alt="" class="wp-image-15946" srcset="https://blog.xojo.com/wp-content/uploads/2026/03/Entitlements.png 931w, https://blog.xojo.com/wp-content/uploads/2026/03/Entitlements-300x210.png 300w, https://blog.xojo.com/wp-content/uploads/2026/03/Entitlements-768x537.png 768w" sizes="auto, (max-width: 931px) 100vw, 931px" /></figure>



<h3 class="wp-block-heading">Provisioning Profiles</h3>



<p>While Entitlements are just a file, Provisioning Profiles are a different beast:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="911" height="514" src="https://blog.xojo.com/wp-content/uploads/2026/03/Provisioning-Profiles.png" alt="" class="wp-image-15947" srcset="https://blog.xojo.com/wp-content/uploads/2026/03/Provisioning-Profiles.png 911w, https://blog.xojo.com/wp-content/uploads/2026/03/Provisioning-Profiles-300x169.png 300w, https://blog.xojo.com/wp-content/uploads/2026/03/Provisioning-Profiles-768x433.png 768w" sizes="auto, (max-width: 911px) 100vw, 911px" /></figure>



<p>Provisioning Profiles must be created in the Apple Developer Portal. When you create one, you specify the App ID (the combination of your Team ID and the app bundle identifier which are case sensitive so pay attention). Even if you don’t plan to distribute your macOS app via the Mac App Store, you still need a Provisioning Profile, which requires creating an App ID first in the Developer Portal.</p>



<p>There are two kinds of Provisioning Profiles: Development and Distribution. As part of the provisioning profile creation, you must choose which type you will use.</p>



<ul class="wp-block-list">
<li><strong>Development Provisioning Profiles</strong> are used while you’re developing your app; the app is signed with an Apple Development certificate and is intended to run on a set of Mac computers you’ve registered. During creation, you can add as many Apple Development certificates as you have under your Team ID.</li>



<li><strong>Distribution Provisioning Profiles</strong> are used when distributing your app. For direct distribution, sign with the same Developer ID certificate you’ll use for signing the app; for Mac App Store distribution, sign with the Apple Distribution certificate.</li>



<li><strong>Development and Distribution Provisioning Profiles do expire</strong>. This is something to keep in mind, especially when deploying new or updated versions of your app, because you may need to create new profiles.</li>



<li><strong>Development and Distribution Profiles are editable</strong>. If you make a mistake, note that both types can be edited in the Apple Developer portal, but only for certain fields: the App ID, the profile name, the selected certificate, and (for Development profiles) the included testing devices.</li>
</ul>



<h2 class="wp-block-heading">When Certificates and/or Provisioning Profiles expire…</h2>



<p>We’ve already noted in previous articles that Apple Developer certificates expire one year after they’re created. We’ve also learned that if your app relies on a Distribution Provisioning Profile, that profile can expire as well. So, what does this mean for your already deployed apps?</p>



<p>No worries. Let’s focus first on directly distributed macOS apps (those signed with the Developer ID certificate) and pull one screenshot from the previous article:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1740" height="882" src="https://blog.xojo.com/wp-content/uploads/2026/03/Timestamp.png" alt="" class="wp-image-15948" srcset="https://blog.xojo.com/wp-content/uploads/2026/03/Timestamp.png 1740w, https://blog.xojo.com/wp-content/uploads/2026/03/Timestamp-300x152.png 300w, https://blog.xojo.com/wp-content/uploads/2026/03/Timestamp-1024x519.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/03/Timestamp-768x389.png 768w, https://blog.xojo.com/wp-content/uploads/2026/03/Timestamp-1536x779.png 1536w" sizes="auto, (max-width: 1740px) 100vw, 1740px" /></figure>



<p>Observe the highlighted Timestamp line. When the app is signed, the date is added automatically (retrieved from Apple’s servers). So, when a user runs an app whose embedded Developer ID Certificate has expired since its release, Gatekeeper will rely on that timestamp, compare it to the embedded certificate’s expiration date, and if everything matches—meaning it was signed before the certificate expired—the app will continue to work, provided the embedded certificate has not been revoked by the developer. In addition, if the app was Notarized, that helps a lot, because the stapled ticket includes its own timestamp and was signed with a longer-lasting Apple Certificate.</p>



<p>If the app is distributed through the Mac App Store, there’s good news. After you submit the app for distribution via App Store Connect and it passes Apple’s review, the app’s signing with your Apple Distribution certificate is replaced by Apple’s own signing. This means that users who install the app from the Mac App Store can continue to run it even if your original Apple Distribution certificate expired long ago.</p>



<p>Distribution Provisioning Profiles behave differently from others: once they expire, the app containing such a Distribution Profile will fail to execute.</p>



<p>The good news is that a Distribution Profile lasts for a very long time (around 18 years) so you’ll likely have ample time to create new distribution provisioning profiles and deploy updates that use renewed profiles well before users are affected.</p>



<p>Of course, as soon as any of your Apple Developer certificates expire, you already know how to request and install new ones in your Mac keychain.</p>



<h2 class="wp-block-heading">Nearly Concluded</h2>



<p>In the next, and last article, we will see how Xojo helps with everything related to signing and distributing your macOS apps. I&#8217;ll also show you how to deal with some of the most common issues related with certificates.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>Code Signing on macOS: What Developers Need to Know</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">Part 1, Get Started</a></li>



<li><a href="https://blog.xojo.com/2026/03/18/code-signing-on-macos-what-developers-need-to-know-part-2/" target="_blank" rel="noreferrer noopener">Part 2, Code Signing With Developer Certificates</a></li>



<li><a href="https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/">Part 3, Entitlements and Provisioning Profiles</a></li>



<li><a href="https://blog.xojo.com/2026/04/07/code-signing-on-macos-what-developers-need-to-know-part-4/" target="_blank" rel="noreferrer noopener">Part 4, How Xojo helps with Certificates, Signing and Distribution</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Code Signing on macOS: What Developers Need to Know, Part 2</title>
		<link>https://blog.xojo.com/2026/03/18/code-signing-on-macos-what-developers-need-to-know-part-2/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple Developer Account]]></category>
		<category><![CDATA[Code Signing]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[macOS]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15864</guid>

					<description><![CDATA[On the Apple side of code signing with developer certificates, we already know that the required root certificate, acting as the base anchor of the&#8230;]]></description>
										<content:encoded><![CDATA[
<p>On the Apple side of code signing with developer certificates, we already know that the required root certificate, acting as the base anchor of the trust chain, is installed already on our Macs under the System Roots keychain.</p>



<p>But before we can reach our leaf developer certificates,&nbsp;we also need to have the Apple Development Intermediate certificates installed in our keychain. These are typically found in the Login keychain, though they can also be found in the System Roots or System keychains.</p>



<h2 class="wp-block-heading">Installing Apple Developer Intermediate Certificates</h2>



<p>Since Xcode 11.4.1 and later, these can be automatically downloaded and installed in the keychain, but if not, they can also can be downloaded from the <a href="https://www.apple.com/certificateauthority/" target="_blank" rel="noreferrer noopener">Apple PKI</a> webpage. The ones we are interested in are:</p>



<ul class="wp-block-list">
<li>Developer ID &#8211; G2</li>



<li>Worldwide Developer Relations &#8211; G2</li>



<li>Worldwide Developer Relations &#8211; G3</li>



<li>Worldwide Developer Relations &#8211; G4</li>



<li>Worldwide Developer Relations &#8211; G5</li>



<li>Worldwide Developer Relations &#8211; G6</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Note: The Developer ID &#8211; G2 certificate corresponds to the Developer ID Certification Authority. The WWDR certificates (G2–G6) correspond to the Apple Worldwide Developer Relations Certification Authority.</p>
</blockquote>



<p>As you can see from the list, there are several versions (or generations) for the WWDR Intermediate certificate; so, which one should you download? The short answer: it depends.</p>



<p>On February, 7, 2023 the previous WWDR intermediate certificate expired; so Apple decided to rollout a new renewed version that will expire on February 20, 2030. As part of that update Apple issued additional Intermediate certificates to better segment the purpose of different certificates:</p>



<ul class="wp-block-list">
<li>G2: ECDSA signing for Apple Pay.</li>



<li>G3: Software signing and Services.</li>



<li>G4: Features supported by Apple Push Notification Service.</li>



<li>G5: App Store Signing and Services.</li>



<li>G6: ECDSA signing of Software and Services.</li>
</ul>



<p>In practice, G3, G4, and G5 are sufficient for most scenarios.</p>



<h2 class="wp-block-heading">Developer Certificates: The final goal!</h2>



<p>To focus on the subject, what kind of leaf developer certificates are created from these two types of Intermediate certificates? This scheme will help:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1644" height="912" src="https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Development-Certificates-Chain-Of-Trust.png" alt="" class="wp-image-15865" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Development-Certificates-Chain-Of-Trust.png 1644w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Development-Certificates-Chain-Of-Trust-300x166.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Development-Certificates-Chain-Of-Trust-1024x568.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Development-Certificates-Chain-Of-Trust-768x426.png 768w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Development-Certificates-Chain-Of-Trust-1536x852.png 1536w" sizes="auto, (max-width: 1644px) 100vw, 1644px" /></figure>



<p>As you can see from the above diagram, there are four main leaf certificates we will use to sign our macOS apps, based on their prefix:</p>



<ul class="wp-block-list">
<li><strong>Developer ID Application</strong>. Use this one to code sign a macOS app distributed outside the Mac App Store.</li>



<li><strong>Developer ID Installer</strong>. Use this one to code sign the Installer, DMG or .pgk file of a macOS app distributed outside the Mac App Store.</li>



<li><strong>Apple Distribution</strong>. This certificate is required to code sign a macOS app sent to the AppStore Connect for its distribution through the Mac App Store.</li>



<li><strong>3rd Party Mac Developer Installer</strong>. This Certificate is required to code sign the package of the app sent to the AppStore Connect. For example, when using the Publish feature from the Xojo IDE.</li>
</ul>



<h2 class="wp-block-heading">Creating and Installing the Developer Certificates</h2>



<p>As stated in the <a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">first article</a> of this series, you need a paid Apple Developer Program membership. Once that’s in place, the easiest way to install these required certificates in your macOS Keychain is through Xcode.</p>



<p>So, if it is the first time you need to install them on a Mac computer:</p>



<ol class="wp-block-list">
<li>Go to Xcode &gt; Preferences.</li>



<li>Select Apple Accounts.</li>



<li>Use your developer credentials to login into your developer account, or select it from the list if you are already logged.</li>



<li>Select the Team from the list.</li>



<li>Click the &#8220;Manage Certificates…&#8221; button.</li>



<li>Click the &#8220;+&#8221; popup menu in the lower-left corner of the resulting window, and select the developer certificate you want to install (all of these if it is the first time you install them).</li>
</ol>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="468" height="398" src="https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-25-a-las-15.53.00.png" alt="" class="wp-image-15866" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-25-a-las-15.53.00.png 468w, https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-25-a-las-15.53.00-300x255.png 300w" sizes="auto, (max-width: 468px) 100vw, 468px" /></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> Under the hood, Xcode follows the same process described for installing the developer certificates manually.</p>
</blockquote>



<p>If you prefer to go through the manual process instead:</p>



<ol class="wp-block-list">
<li>Access the <a href="https://developer.apple.com" target="_blank" rel="noreferrer noopener">Apple Developer website</a>.</li>



<li>In <a href="https://developer.apple.com/account/resources" target="_blank" rel="noreferrer noopener">Certificates, Identifiers &amp; Profiles, click Certificates in the sidebar.</a></li>



<li>On the top left, click the add button (+).</li>



<li>Under Software, select Developer ID, then click Continue.
<ul class="wp-block-list">
<li><strong>Developer ID Application</strong>: This certificate is used to code sign your app for distribution outside of the Mac App Store Connect.</li>



<li><strong>Developer ID Installer</strong>: This certificate is used to sign your app’s installer Package for distribution outside of the Mac App Store Connect.</li>



<li><strong>Apple Development</strong>: Used to run and debug apps on macOS during development.</li>



<li><strong>Apple Distribution</strong>: Used to sign apps for submission to App Store Connect.</li>



<li><strong>Mac App Distribution</strong>: Used to sign macOS apps intended to be distributed through the Mac App Store.</li>



<li><strong>Mac Installer Distribution</strong>: Used to send the macOS app to the App Store Connect for TestFlight or distribution through the Mac App Store.</li>
</ul>
</li>



<li>Follow the instructions to <a href="https://developer.apple.com/help/account/certificates/create-a-certificate-signing-request" target="_blank" rel="noreferrer noopener">create a certificate signing request</a>.</li>



<li>Click Choose File.</li>



<li>In the dialog that appears, select the certificate request file (a file with a .certSigningRequest file extension), then click Choose.</li>



<li>Click Continue.</li>



<li>Click Download.</li>



<li>The certificate file (a file with a .cer file extension) appears in your Downloads folder.</li>



<li>To install the certificate in your keychain, double-click the downloaded certificate file. The certificate appears in the My Certificates category in Keychain Access.</li>
</ol>



<h2 class="wp-block-heading">It&#8217;s All About Identities</h2>



<p>While Intermediate and Root certificates only have the Public Key on them, so they can verify other (leaf) certificates, the leaf certificates installed on your macOS Login keychain behave a bit different. Let&#8217;s see how.</p>



<p>Both if you use Xcode or create the CSR request manually to generate the developer certificates, using the Keychain Access app for that, in both of these scenarios <strong>a Private Key will be created and stored locally on your keychain</strong> as part of the process. <strong>Only the public key section of that private key is sent to the Apple servers</strong> so it can be included in the generated developer certificate. Once any of the possible developer certificates is downloaded and installed in the keychain, such certificate will have its private key associated with it:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="872" height="88" src="https://blog.xojo.com/wp-content/uploads/2026/02/Screenshot-2026-02-25-at-4.20.45-PM.png" alt="" class="wp-image-15867" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Screenshot-2026-02-25-at-4.20.45-PM.png 872w, https://blog.xojo.com/wp-content/uploads/2026/02/Screenshot-2026-02-25-at-4.20.45-PM-300x30.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Screenshot-2026-02-25-at-4.20.45-PM-768x78.png 768w" sizes="auto, (max-width: 872px) 100vw, 872px" /></figure>



<p>The pair of the developer certificate and the associated private key is what is called an Identity.</p>



<h2 class="wp-block-heading">Code signing With Developer Certificates</h2>



<p>In fact, while we often say or hear “code signing with certificates,” the real signing of the app is done with the private key associated with that certificate. The certificate itself (and thus the public key portion of that key pair) is included in the signing process. This allows macOS to verify the signature each time the user runs the app</p>



<p>Do you remember the diagram showing how the &#8220;Ad-Hoc&#8221; code signing process works? Let&#8217;s compare it when the same process is done using a &#8220;Developer ID Application&#8221; Certificate… and, most important, the associated private key:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1724" height="812" src="https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Certificate-Signing.png" alt="" class="wp-image-15869" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Certificate-Signing.png 1724w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Certificate-Signing-300x141.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Certificate-Signing-1024x482.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Certificate-Signing-768x362.png 768w, https://blog.xojo.com/wp-content/uploads/2026/02/Apple-Certificate-Signing-1536x723.png 1536w" sizes="auto, (max-width: 1724px) 100vw, 1724px" /></figure>



<p>As you can see, in this case the data is cyphered using the private key from the developer certificate and, then, the certificate itself is stored as part of the app itself. So, if for example we build this time an empty Desktop app for macOS using the Developer ID Application, and open the resulting CodeResources file in a text editor we will see something different compared with the Ad-Hoc signed version:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1298" height="974" src="https://blog.xojo.com/wp-content/uploads/2026/02/CodeResources_Signed.png" alt="" class="wp-image-15870" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/CodeResources_Signed.png 1298w, https://blog.xojo.com/wp-content/uploads/2026/02/CodeResources_Signed-300x225.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/CodeResources_Signed-1024x768.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/CodeResources_Signed-768x576.png 768w" sizes="auto, (max-width: 1298px) 100vw, 1298px" /></figure>



<p>In this case the field <strong>requirement&nbsp;</strong>associated with each file and hash value is significantly more strict. In fact, it makes reference to the Chain of Trust Gatekeeper is required to follow and validate. In plain English, the highlighted lines come to say something like:</p>



<ol class="wp-block-list">
<li>Hey! make sure there is a <strong>Developer ID Application</strong> certificate (Apple Extension attribute —OID— <em>1.2.840.113635.100.6.1.13&nbsp;</em>for the X.509 certificate), for the developer with a <strong>TeamID</strong> BW7PU32485.</li>



<li>Next, verify such certificate is issued by the &#8220;<strong>Apple Developer ID Certificate Authority</strong>&#8221; (other of the Apple-specific X.509 extension, attribute or OID. In this case: 1.2.840.113635.100.6.2.6).</li>



<li>And finally, go down through the Chain of Trust and verify the previous one with the <strong>Anchor</strong> certificate (Apple Root CA, do you remember?)</li>
</ol>



<p>So far so good. But how we can know if the app meets these requirements; and what about the certificates themselves? Well, it&#8217;s easy to check both using the codesign tool.</p>



<p>Open a Terminal window and type the following command:</p>



<pre class="wp-block-preformatted">codesign --verify -vvv "MyApp.app"</pre>



<p>The output will be something similar to this:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2198" height="336" src="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement.png" alt="" class="wp-image-15871" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement.png 2198w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement-300x46.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement-1024x157.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement-768x117.png 768w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement-1536x235.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-SatisfiedRequirement-2048x313.png 2048w" sizes="auto, (max-width: 2198px) 100vw, 2198px" /></figure>



<p>As you can see in the highlighted lines, yes, it satisfies the <strong>Designated Requirements</strong> we saw in our CodeResources file! Also, the previous line states that it is valid on disk. That means:</p>



<ul class="wp-block-list">
<li>All of the expected files are present.</li>



<li>There are no extra files.</li>



<li>None of the files have been modified.</li>



<li>A basic trust evaluation of the leaf certificate was successful.</li>



<li>And it satisfies its own Designated Requirements (DR).</li>
</ul>



<p>It is even possible to see the Chain of Trust for the code signature issuing:</p>



<pre class="wp-block-preformatted">codesign --display -vv "MyApp.app"&nbsp;</pre>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1222" height="340" src="https://blog.xojo.com/wp-content/uploads/2026/02/Codesign-ChainOfTrust.png" alt="" class="wp-image-15872" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Codesign-ChainOfTrust.png 1222w, https://blog.xojo.com/wp-content/uploads/2026/02/Codesign-ChainOfTrust-300x83.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Codesign-ChainOfTrust-1024x285.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/Codesign-ChainOfTrust-768x214.png 768w" sizes="auto, (max-width: 1222px) 100vw, 1222px" /></figure>



<p>And if you are curious enough, it is even possible to extract the embedded certificates stored in the <a href="https://www.ietf.org/rfc/rfc3852.txt" target="_blank" rel="noreferrer noopener">CMS structure within the code signature</a>:</p>



<pre class="wp-block-preformatted">codesign --display --extract-certificates "MyApp.app"</pre>



<p>As result it will, usually, create three files. Take a closer look at the &#8220;Issuer&#8221; and &#8220;Subject&#8221; lines; specially on the Subject line for the OU value (Organizative Unit or, using Apple wording, the TeamID) for the codesign0 file. Do you remember the &#8220;leaf[subject.OU=BW7PU32485]&#8221; data from the CodeResources file?&nbsp;:</p>



<p><strong>codesign0.</strong> This is the file for the Leaf certificate; in our example &#8220;Developer ID Application&#8221;.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1820" height="368" src="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-DeveloperIDCertificate.png" alt="" class="wp-image-15873" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-DeveloperIDCertificate.png 1820w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-DeveloperIDCertificate-300x61.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-DeveloperIDCertificate-1024x207.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-DeveloperIDCertificate-768x155.png 768w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-DeveloperIDCertificate-1536x311.png 1536w" sizes="auto, (max-width: 1820px) 100vw, 1820px" /></figure>



<p><strong>codesign1.</strong> This one is for the Intermediate Certificate; in our example &#8220;Apple Developer ID Certificate Authority&#8221;.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1562" height="366" src="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-IntermediateCertificate.png" alt="" class="wp-image-15874" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-IntermediateCertificate.png 1562w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-IntermediateCertificate-300x70.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-IntermediateCertificate-1024x240.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-IntermediateCertificate-768x180.png 768w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-IntermediateCertificate-1536x360.png 1536w" sizes="auto, (max-width: 1562px) 100vw, 1562px" /></figure>



<p><strong>codesign2.</strong> This one is for the Anchor Certificate; in our example &#8220;Apple Root CA&#8221;</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1274" height="344" src="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-RootCertificate.png" alt="" class="wp-image-15875" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/codesign-RootCertificate.png 1274w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-RootCertificate-300x81.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-RootCertificate-1024x276.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/codesign-RootCertificate-768x207.png 768w" sizes="auto, (max-width: 1274px) 100vw, 1274px" /></figure>



<p><br>As shown by the <strong>Issuer</strong> line in the codesign0 file for our “Developer ID Application,” it points to the previous certificate in the trust chain—the Developer ID Certification Authority. The codesign1 file for the extracted Developer ID Certification Authority points to the Apple Certification Authority in its Issuer field. Finally, the codesign1 certificate points to itself because, as the Root Certificate, it serves as the <strong>anchor</strong> for the trust chain.</p>



<h2 class="wp-block-heading">Wrapping up</h2>



<p>In this second article, we delved deeper into how Apple Developer certificates work, how a macOS app is signed (Ad-Hoc or with a specific developer certificate), and how the OS’s security features validate the signing when a user tries to run the app.</p>



<p>In the next article, we will cover more details about signing apps for the two main distribution types: Direct distribution and Mac App Store. We will also discuss what happens when certificates expire and how to troubleshoot the most common issues related to development certificates.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>Code Signing on macOS: What Developers Need to Know</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">Part 1, Get Started</a></li>



<li><a href="https://blog.xojo.com/2026/03/18/code-signing-on-macos-what-developers-need-to-know-part-2/" target="_blank" rel="noreferrer noopener">Part 2, Code Signing With Developer Certificates</a></li>



<li><a href="https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/">Part 3, Entitlements and Provisioning Profiles</a></li>



<li><a href="https://blog.xojo.com/2026/04/07/code-signing-on-macos-what-developers-need-to-know-part-4/" target="_blank" rel="noreferrer noopener">Part 4, How Xojo helps with Certificates, Signing and Distribution</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Code Signing on macOS: What Developers Need to Know, Part 1</title>
		<link>https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 16:00:00 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple Developer Account]]></category>
		<category><![CDATA[Code Signing]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[macOS]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15856</guid>

					<description><![CDATA[Your macOS app is finished and ready to go. But unless you plan to run it only on your own machine, there’s one essential step&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Your macOS app is finished and ready to go. But unless you plan to run it only on your own machine, there’s one essential step before sharing it with others: code signing with certificates.</p>



<span id="more-15856"></span>



<p>This blog series provides a clear, practical overview of how certificates work, with a focus on signing and distributing macOS applications. Some concepts apply to digital certificates in general, while others are specific to the macOS code signing process. By the end of the series, you’ll understand what certificates are, why they matter, and the role they play when building and distributing a macOS app.</p>



<p>The Developer ID field in the Build Settings &gt; macOS &gt; Sign Inspector Panel is our starting point:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1000" height="574" src="https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-26-a-las-10.51.17.png" alt="" class="wp-image-15857" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-26-a-las-10.51.17.png 1000w, https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-26-a-las-10.51.17-300x172.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Captura-de-pantalla-2026-02-26-a-las-10.51.17-768x441.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>By default, this field is empty. When you click Build, the app bundle (and its contents) is signed using a more relaxed security configuration. This does not require an explicit developer certificate and does not verify that the app comes from a known, trusted developer.</p>



<p>This type of signing is called Ad-Hoc signing. It is perfectly fine when debugging from the IDE or when building apps you intend to run locally.</p>



<p>In earlier versions of macOS, it was even possible to distribute and run Ad-Hoc–signed apps on other Macs, as long as the user explicitly chose to trust them. While this is still technically possible on recent versions of macOS, Apple has continued to tighten security, making it increasingly difficult for users to launch Ad-Hoc–signed applications.</p>



<p>In most cases, <a href="https://support.apple.com/en-au/guide/security/sec5599b66df/web" target="_blank" rel="noreferrer noopener">Gatekeeper</a> will intervene and prevent the app from launching. Since the system cannot verify the identity of a trusted developer, it treats the app as unverified. With Ad-Hoc signing, macOS can only confirm that the app has not been modified since it was signed, it cannot validate who created it.</p>



<h2 class="wp-block-heading">Under the hood: How &#8220;Ad-Hoc&#8221; signing works</h2>



<p>Every time an app is signed (including all the contents inside its bundle) macOS uses Apple’s codesign tool. When Ad-Hoc signing is applied, the simplified process works roughly like this:<br></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1390" height="812" src="https://blog.xojo.com/wp-content/uploads/2026/02/Ad-Hoc-How-it-works.png" alt="" class="wp-image-15858" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Ad-Hoc-How-it-works.png 1390w, https://blog.xojo.com/wp-content/uploads/2026/02/Ad-Hoc-How-it-works-300x175.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Ad-Hoc-How-it-works-1024x598.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/Ad-Hoc-How-it-works-768x449.png 768w" sizes="auto, (max-width: 1390px) 100vw, 1390px" /></figure>



<ul class="wp-block-list">
<li>A hash value (a unique digital fingerprint) is calculated for every file in the app bundle, whether it is executable or not, as well as for the bundle itself.</li>



<li>These hash values are stored inside the app bundle, in the <code>_CodeSignature</code> folder.</li>



<li>If the app contains multiple architectures (for example, x86 and ARM), the process is repeated for each supported architecture.</li>
</ul>



<p>When a user double-clicks the app to launch it, macOS performs a similar verification process:</p>



<ul class="wp-block-list">
<li>It recalculates the hash value for every file in the bundle.</li>



<li>It compares the newly calculated values with those stored in the <code>_CodeSignature</code> folder and if any hash differs from the stored value, macOS determines that the bundle has been modified since it was signed and it will refuse to launch the app.</li>
</ul>



<p>Want to see this in action? Create a new Desktop project in the Xojo IDE, save it to your Documents folder, and build it for macOS.</p>



<p>Next, locate the built app in Finder. Control-click it and choose “Show Package Contents.” Then open the Contents &gt; _CodeSignature folder and inspect the CodeResources file using your favorite text editor. You’ll see a list of hash values and digests corresponding to every file in the app bundle.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1248" height="1344" src="https://blog.xojo.com/wp-content/uploads/2026/02/SignatureFile.png" alt="" class="wp-image-15859" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/SignatureFile.png 1248w, https://blog.xojo.com/wp-content/uploads/2026/02/SignatureFile-279x300.png 279w, https://blog.xojo.com/wp-content/uploads/2026/02/SignatureFile-951x1024.png 951w, https://blog.xojo.com/wp-content/uploads/2026/02/SignatureFile-768x827.png 768w" sizes="auto, (max-width: 1248px) 100vw, 1248px" /></figure>



<h2 class="wp-block-heading">Apple Developer Certificates: Establishing Trust on macOS</h2>



<p>What must you do so your apps are recognized as first-class citizens on macOS and can be distributed without Gatekeeper intervening? The answer is likely familiar: enroll in the Apple Developer Program (currently US $99 per year).</p>



<p>Among its many benefits, membership in the Apple Developer Program allows you to create your own Developer ID certificates. When you use these certificates to sign your apps, macOS can validate the signature and identify you as the verified developer distributing the software.</p>



<p>But how is this trust established and verified? To answer that, we need to start at the very root, literally!</p>



<p>Every computer, smartphone, tablet, and many other devices come with preinstalled Root Certificates. These certificates are issued by trusted organizations known as Root Certificate Authorities (CAs), including Apple. They serve as the foundation of a chain of trust, allowing other certificates issued by those authorities to be verified.</p>



<p>Technically speaking, a Root Certificate Authority (CA) is the top-level trusted entity in a public key infrastructure (<a href="https://en.wikipedia.org/wiki/Public_key_infrastructure">PKI</a>). It issues self-signed root certificates that act as the trust anchor for verifying other digital certificates. In other words, it is the foundation upon which the entire certificate trust model is built.</p>



<p>It is easy to take a look to these installed on your Mac:</p>



<ol class="wp-block-list">
<li>Open Keychain Access.</li>



<li>Select Certificates at the top of the window.</li>



<li>In the sidebar, choose System Roots.</li>



<li>You will then see the complete list of root certificates trusted by macOS.</li>
</ol>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2186" height="1264" src="https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates.png" alt="" class="wp-image-15860" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates.png 2186w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates-300x173.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates-1024x592.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates-768x444.png 768w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates-1536x888.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Certificates-2048x1184.png 2048w" sizes="auto, (max-width: 2186px) 100vw, 2186px" /></figure>



<p>You’ll notice that there are three different Apple Root CA certificates. Why?</p>



<p>Each <a href="https://en.wikipedia.org/wiki/X.509" target="_blank" rel="noreferrer noopener">X.509</a> certificate contains detailed metadata defining its cryptographic properties and permitted usage. This includes the key type (such as <a href="https://en.wikipedia.org/wiki/RSA_cryptosystem" target="_blank" rel="noreferrer noopener">RSA</a> or <a href="https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm" target="_blank" rel="noreferrer noopener">ECDSA</a>), the public key length, and the signature algorithm used.</p>



<ul class="wp-block-list">
<li><strong>Apple Root CA</strong>: Is a RSA type, with a public key length of 2048 bits that uses the SHA-1 algorithm.</li>



<li><strong>Apple Root CA-G2</strong>: Is a RSA type, with a public key length of 4096 bits that uses the SHA-384 algorithm.</li>



<li><strong>Apple Root CA-G3</strong>: Is a ECDSA type, with a public key length of 384 bits that uses the SHA-384 algorithm.</li>
</ul>



<h2 class="wp-block-heading">Intermediate Certificates and the Chain of Trust</h2>



<p>Root certificates are highly valuable and sensitive, so they are rarely used directly to sign end-user certificates (also called “Leaf” certificates). In the case of macOS app development, the developer’s certificate is the Leaf. This is where Intermediate Certificates come into play.</p>



<p>In simple terms, Intermediate Certificates are signed by Root Certificates and, in turn, are used to sign Leaf certificates. This protects the Root certificate from direct exposure. Together, the Root, Intermediate, and Leaf certificates form what is called the “Chain of Trust.”</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1254" height="932" src="https://blog.xojo.com/wp-content/uploads/2026/02/Root-Intermediate-Lead-Span.png" alt="" class="wp-image-15861" srcset="https://blog.xojo.com/wp-content/uploads/2026/02/Root-Intermediate-Lead-Span.png 1254w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Intermediate-Lead-Span-300x223.png 300w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Intermediate-Lead-Span-1024x761.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/02/Root-Intermediate-Lead-Span-768x571.png 768w" sizes="auto, (max-width: 1254px) 100vw, 1254px" /></figure>



<p>The Chain of Trust verification starts with the Leaf certificate and works upward through the Intermediate to the Root. This same process occurs whenever you visit a secure website, make an online payment, or transmit sensitive data securely.</p>



<p>For example, the Leaf certificate is validated against its Intermediate certificate. If the Intermediate certificate is missing or expired, the Leaf certificate is considered invalid. Similarly, the Intermediate certificate itself must be validated against the Root certificate. If the Root certificate is missing or expired, the Intermediate is invalid, and all Leaf certificates signed by it are also invalid.</p>



<p>The same process happens when you sign your macOS apps: macOS validates the entire certificate chain before allowing the app to run.</p>



<p>Finally, certificates closer to the Root generally have longer validity periods. Leaf certificates must be renewed more frequently, while Root certificates are valid for many years.</p>



<h2 class="wp-block-heading">Wrapping up</h2>



<p>In this first article, we covered the fundamentals of digital certificates and their role in macOS app security. In the next article, we will focus specifically on Apple Developer certificates and how they enable trusted app distribution.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>Code Signing on macOS: What Developers Need to Know</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2026/03/04/code-signing-on-macos-what-developers-need-to-know-part-1/" target="_blank" rel="noreferrer noopener">Part 1, Get Started</a></li>



<li><a href="https://blog.xojo.com/2026/03/18/code-signing-on-macos-what-developers-need-to-know-part-2/" target="_blank" rel="noreferrer noopener">Part 2, Code Signing With Developer Certificates</a></li>



<li><a href="https://blog.xojo.com/2026/03/24/code-signing-on-macos-what-developers-need-to-know-part-3/">Part 3, Entitlements and Provisioning Profiles</a></li>



<li><a href="https://blog.xojo.com/2026/04/07/code-signing-on-macos-what-developers-need-to-know-part-4/" target="_blank" rel="noreferrer noopener">Part 4, How Xojo helps with Certificates, Signing and Distribution</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New WebUserAuthentication Control: Look, Mom, No Passwords!</title>
		<link>https://blog.xojo.com/2025/12/09/new-webuserauthentication-control-look-mom-no-passwords/</link>
		
		<dc:creator><![CDATA[Ricardo Cruz]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 16:30:29 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[2025r3]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Passkey]]></category>
		<category><![CDATA[Passwords]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15321</guid>

					<description><![CDATA[The web framework has a new control available in the Library, WebUserAuthentication. Now that Passkeys have arrived, let&#8217;s explore this feature! Passkeys Demo In this&#8230;]]></description>
										<content:encoded><![CDATA[
<p>The web framework has a new control available in the Library, <code>WebUserAuthentication</code>. Now that Passkeys have arrived, let&#8217;s explore this feature!</p>



<h2 class="wp-block-heading">Passkeys Demo</h2>



<p>In this demo, we will be creating a new account using just our email. Using a platform authenticator, like Apple Passkeys or Windows Hello will make this pretty easy. They are integrated in the operating system and synced across devices. I will be using macOS with the integrated Passwords app, but this is supported in Windows through Windows Hello, or you could store, sync and use Passkeys using a Google Chrome Profile.</p>



<figure class="wp-block-video"><video height="1240" style="aspect-ratio: 1472 / 1240;" width="1472" controls src="https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-passwordless-signup.mp4"></video></figure>



<p>As you can see, there is no intermediate step. No need to use a separate app to store your passwords securely. A Passkey will be generated and stored in the authenticator in one simple step. This Passkey will be automatically synced across devices and available on my iPhone.</p>



<p>Opening the Password application, I already can confirm my new Passkey has been stored for &#8220;localhost&#8221;. Notice the user name is also there, meaning you won&#8217;t need to fill it during the login process.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="710" src="https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-in-password-app-1024x710.png" alt="" class="wp-image-15323" srcset="https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-in-password-app-1024x710.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-in-password-app-300x208.png 300w, https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-in-password-app-768x533.png 768w, https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-in-password-app-1536x1065.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-in-password-app.png 1716w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The username isn&#8217;t important or even required, it&#8217;s just to display a friendly name for this user. A Passkey will include the user ID, which can be any arbitrary String you want. In my example, I&#8217;ve used the new <a href="https://documentation.xojo.com/api/math/random.html#random-uuid" target="_blank" rel="noreferrer noopener">Random.UUID method</a>, but this is completely up to you. And this is transparent for the end user.</p>



<p>Now, let&#8217;s try to login:</p>



<figure class="wp-block-video"><video height="1240" style="aspect-ratio: 1472 / 1240;" width="1472" controls src="https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-passwordless-signin.mp4"></video></figure>



<p>That&#8217;s it!</p>



<p>Another thing to notice is, while I have several Passkeys for different websites, only the relevant Passkey can be used. This makes Phishing attacks useless. End users won&#8217;t be able to use a Passkey anywhere else, just on the website where it has been created. And also, users won&#8217;t be able to send their password by mistake to an attacker because … they can&#8217;t!</p>



<p>For web application developers, another interesting thing to note is that you won&#8217;t be able to store a Passkey insecurely. Even if your database gets compromised, a hacker won&#8217;t be able to use the stored public keys to authenticate those users with another service. To make it easier to understand, you will be storing a lock, not the key used to open it.</p>



<h2 class="wp-block-heading">Other User Journeys</h2>



<p>My demo is just the classic email / password sign up / sign in workflow, but without using a password. Passkeys is based on WebAuthn (part of FIDO2) and there are several ways you can use this technology in your web application. For example, you could use a shared computer and still be able to securely log in using your mobile. The platform will display a QR code you can read with your phone camera, and grant the access from your personal device.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="889" src="https://blog.xojo.com/wp-content/uploads/2025/08/Sign-In-1024x889.png" alt="" class="wp-image-15325" srcset="https://blog.xojo.com/wp-content/uploads/2025/08/Sign-In-1024x889.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/08/Sign-In-300x260.png 300w, https://blog.xojo.com/wp-content/uploads/2025/08/Sign-In-768x666.png 768w, https://blog.xojo.com/wp-content/uploads/2025/08/Sign-In-1536x1333.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/08/Sign-In.png 1604w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>In my example application, the user can sign up using different emails. If the Passwords app encounters more than one for my domain it will allow the user to specify the Passkey to use:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="889" src="https://blog.xojo.com/wp-content/uploads/2025/08/o2-baieeamele.com_-1024x889.png" alt="" class="wp-image-15326" srcset="https://blog.xojo.com/wp-content/uploads/2025/08/o2-baieeamele.com_-1024x889.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/08/o2-baieeamele.com_-300x260.png 300w, https://blog.xojo.com/wp-content/uploads/2025/08/o2-baieeamele.com_-768x666.png 768w, https://blog.xojo.com/wp-content/uploads/2025/08/o2-baieeamele.com_-1536x1333.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/08/o2-baieeamele.com_.png 1604w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Xojo will take care of preparing the <code>WebAuthn</code> steps, verifying signatures and doing the common busy work for you. You will have to decide which workflow makes sense for your application and perform any further verifications, like sending a verification email on register, to ensure this user owns that account.</p>



<h2 class="wp-block-heading">Multi-Factor Authentication</h2>



<p>If you already require your users to authenticate with a username (or email) and a password, you could use <code>WebUserAuthentication</code> as a second factor. That means the user will need to provide something this person knows (a username and password combination) in addition to something the user has (the authenticator device)</p>



<p>Other common multi-factor authentication schemes are email magic links and time-based one-time passwords, <em>&#8220;TOTP&#8221;</em>.</p>



<p>More factors equal better security, of course. But as usual when it comes to security, you&#8217;ll have to find the sweet spot between secure and comfortable.</p>



<h2 class="wp-block-heading">Usernameless + Passwordless Authentication … Wait, What?!?</h2>



<p><em>&#8220;How can I authenticate without providing my username or email?&#8221;</em>. This is where real new possibilities arise. When you use a username with a password that only Chuck Norris and you know, this becomes a &#8220;proof of identity&#8221; (at least in theory, in practice a hacker could compromise an account using a weak password)</p>



<p>When using an authenticator without a username or password, it becomes a &#8220;proof of possession&#8221; of the authenticator device.</p>



<p>Again, think about it as a locker&#8217;s lock and a key. Everyone can see the lock, but only people with the correct key can open it. The public key would be the door&#8217;s lock, while the authenticator device would be the key. You can share the key with another person you trust to grant this person access to the contents behind that door. The difference with a real-life lock is that we will be using a really secure one, with a security key.</p>



<p>As long as you can proof you have a valid &#8220;key&#8221; to authenticate, you are granted to continue.</p>



<p>Consider the following scenario. The company could have a web application that uses a traditional username + password authentication but, for really special activities, the user needs to authenticate with a physical USB key authenticator device that is shared by everyone in the office.</p>



<p>Other use cases are obviously when privacy is involved. A private journal, or a private blogging service, voting. The inconvenience in this case is the user won&#8217;t be able to recover the account if they lose access to the authenticator. In this case, you might want to offer a different recovery solution, like printing a very long recovery code. If they also lose the recovery code, they will permanently lose the account.</p>



<h2 class="wp-block-heading">How To Use The New Control</h2>



<p>As you do with any other non-visual control, like a <code>WebTimer</code>, you can just drop the new <code>WebUserAuthentication</code> control into your WebPage.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="491" src="https://blog.xojo.com/wp-content/uploads/2025/08/webauthentication-dropping-into-webpage-1024x491.png" alt="" class="wp-image-15327" srcset="https://blog.xojo.com/wp-content/uploads/2025/08/webauthentication-dropping-into-webpage-1024x491.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/08/webauthentication-dropping-into-webpage-300x144.png 300w, https://blog.xojo.com/wp-content/uploads/2025/08/webauthentication-dropping-into-webpage-768x368.png 768w, https://blog.xojo.com/wp-content/uploads/2025/08/webauthentication-dropping-into-webpage-1536x736.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/08/webauthentication-dropping-into-webpage-2048x982.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Then configure its properties. The most important one is the Domain field. It must match the domain name where your application will be deployed. If you want to test it locally without using HTTPS, it must be &#8220;localhost&#8221; (&#8220;127.0.0.1&#8221; won&#8217;t work)</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="666" height="269" src="https://blog.xojo.com/wp-content/uploads/2025/08/Appearance-copia.png" alt="" class="wp-image-15328" srcset="https://blog.xojo.com/wp-content/uploads/2025/08/Appearance-copia.png 666w, https://blog.xojo.com/wp-content/uploads/2025/08/Appearance-copia-300x121.png 300w" sizes="auto, (max-width: 666px) 100vw, 666px" /></figure>



<p>There are four events available:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="656" height="250" src="https://blog.xojo.com/wp-content/uploads/2025/11/Captura-de-pantalla-2025-11-20-a-las-10.50.33.png" alt="" class="wp-image-15544" srcset="https://blog.xojo.com/wp-content/uploads/2025/11/Captura-de-pantalla-2025-11-20-a-las-10.50.33.png 656w, https://blog.xojo.com/wp-content/uploads/2025/11/Captura-de-pantalla-2025-11-20-a-las-10.50.33-300x114.png 300w" sizes="auto, (max-width: 656px) 100vw, 656px" /></figure>



<p>You can use <code>RegistrationSucceeded</code> and <code>AuthenticationSucceeded</code> to interact with your Database, store the details and redirect the user to their dashboard.</p>



<p>In <code>RegistrationSucceeded</code>, a <code>WebAuthenticationCredential</code> will be given to you. This is a data transfer object with the following properties you need to store in your database:</p>



<ul class="wp-block-list">
<li>ID</li>



<li>PublicKey</li>



<li>AuthenticationAttempts</li>



<li>DisplayName</li>
</ul>



<p>Error will be fired when something goes wrong. A message will also show with the details about what happened, but it isn&#8217;t meant to be shared with the end user. During the sign up and sign in processes, you should display generic messages for security, to avoid letting bad actors know what&#8217;s going on. If you need to inform the user something related to these messages, you can send them an automated email instead.</p>



<p><code>CredentialRequested</code> will be fired during the authentication ceremony. A userId and a credentialId will be given to you, and you should return a new <code>WebAuthenticationCredential</code> instance with the details coming from the <code>RegistrationSucceededEvent</code>.</p>



<p>Also, when <code>AuthenticationSucceeded</code> happens, the event will come with an <code>authenticationAttempts</code> parameter. This will be an incremental value used to update your credentials. This is part of the <code>WebAuthn</code> protocol sign in ceremony used to detect cloned authenticators, which is supported by Xojo. Please notice this value might come always as &#8220;0&#8221; when using Safari, for example, but Google Chrome will increase its value each time.</p>



<p>You can initiate a Registration or Authentication ceremony by calling Register or Authenticate, respectively.</p>



<ul class="wp-block-list">
<li><strong>Register</strong>(userId As String, username As String = &#8220;&#8221;, displayName As String = &#8220;&#8221;)<br>The parameter userId is required, the new credential will be built specifically for it. It can be anything that makes sense in your application, like an auto-incremental number or a random UUID . The other parameters are meant for giving the credential a friendly name. The username could be a nickname, or an email. In workflows where you allow the user to store more than one passkey, the displayName could be something like &#8220;Backup key&#8221;.</li>



<li><strong>Authenticate</strong>(Optional allowCredentials() As String)<br>This will initiate the authentication ceremony. You can optionally pass an array of credential IDs, allowed for the user trying to get access to the protected resource.</li>
</ul>



<h2 class="wp-block-heading">Adoption and Compatibility</h2>



<p>Not every user may know they even exist, what they are, how they work or if they will be more secure than using their pet&#8217;s name and birthdate. This can cause some friction. Other users that adopted the usage from day one might have at least two physical USB keys. They expect your application to allow them to enter more than one, just in case they lose their main USB key.</p>



<p>Passkeys are here to stay and their adoption will continue growing on web services. That said, depending on the combination of operating system and browser, there are some gotchas. Google Chrome or Firefox should work on every operating system. Apple users will probably obtain the best user experience if they&#8217;re tied to this ecosystem. Linux users using alternative browsers could experience some challenges.</p>



<p>If compatibility is a must for your application, you should still offer an alternative to Passkeys. For example, legacy passwords, or &#8220;magic login links&#8221; sent by email.</p>



<h2 class="wp-block-heading">Wrapping Up</h2>



<p>We are sure Passkeys will be the norm in the coming years. Read more in the <a href="https://documentation.xojo.com/api/web/webauthenticationcredential.html" target="_blank" rel="noreferrer noopener">Xojo Docs</a>. Xojo is ready to embrace them and you can start adopting them in your Xojo Web application today!</p>



<p><em>Ricardo has always been curious about how things work. Growing up surrounded by computers</em> he became interested in <em>web technologies in the dial-up connections era. Xojo has been his secret weapon and language of preference since 2018. When he’s not online, chances are he will be scuba diving … or crocheting amigurumis. Find Ricardo on Twitter <a href="https://web.archive.org/web/20220805000833/https://www.twitter.com/piradoiv" target="_blank" rel="noreferrer noopener">@piradoiv</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		<enclosure url="https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-passwordless-signup.mp4" length="684699" type="video/mp4" />
<enclosure url="https://blog.xojo.com/wp-content/uploads/2025/08/passkeys-passwordless-signin.mp4" length="435817" type="video/mp4" />

			</item>
		<item>
		<title>macOS Apps: From Sandboxing to Notarization, The Basics</title>
		<link>https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Thu, 22 Aug 2024 15:45:28 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[App Development]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Entitlements]]></category>
		<category><![CDATA[Hardened Runtime]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<category><![CDATA[Native App Development]]></category>
		<category><![CDATA[Notarization]]></category>
		<category><![CDATA[Sandboxing]]></category>
		<category><![CDATA[Xcode]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13510</guid>

					<description><![CDATA[You are likely already familiar with terms like Sandboxing, hardened runtime and Notarization. After all, these are required if you plan to distribute your macOS&#8230;]]></description>
										<content:encoded><![CDATA[
<p>You are likely already familiar with terms like Sandboxing, hardened runtime and Notarization. After all, these are required if you plan to distribute your macOS apps through the Mac App Store. But, starting with macOS Sequoia 15 (expected in the fall of 2024), Apple has tightened the runtime security protections even more. For example, it was common to Control + click on any downloaded macOS app from Internet that has not been signed and simply choose the Open option from the contextual menu to open it. That won&#8217;t be an option under Sequoia (although it still possible to run the unsigned app).</p>



<p>In fact, Apple recommends to Notarize the software even if you are going to distribute it from your own website, outside of the Mac App Store. But, don&#8217;t be scared! Currently there are good third parties options available that ease the path, like <a href="https://ohanaware.com/appwrapper/">App Wrapper from Ohanaware</a>, or some OpenSource options as for example <a href="https://github.com/jo-tools/xojo2dmg">Xojo2DMG</a>; and through this article you will see how to enable Sandboxing, runtime hardening and even Notarizing on a simple example app. Of course, this will touch only the basics and it is up to you to read the related Apple Documentation to add the entries, both the Entitlements and additional keys/values in the app Info.plist file, required by the purposes of your particular app, for example file access, camera or mic access, network access, etc.</p>



<h2 class="wp-block-heading">A Bit of Common Ground</h2>



<p>At this point, your head may be spinning if you are unfamiliar with these app security terms; so, what do Sandbox, hardened runtime and Notarizing mean when they are applied to macOS apps?</p>



<h3 class="wp-block-heading">Sandboxing</h3>



<p>When a macOS app is sandboxed, that means that macOS will create an exclusive container for everything related to the app the first time it is launched. This is what happens when installing an iOS app, too! Such a container will have its own structure to access things like documents, pictures, downloads, etc. Think about it as the own private execution space for the app:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1006" height="640" src="https://blog.xojo.com/wp-content/uploads/2024/08/1-Container.png" alt="" class="wp-image-13511" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/1-Container.png 1006w, https://blog.xojo.com/wp-content/uploads/2024/08/1-Container-300x191.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/1-Container-768x489.png 768w" sizes="auto, (max-width: 1006px) 100vw, 1006px" /></figure>
</div>


<p>Of course, there are <a href="https://developer.apple.com/documentation/security/app_sandbox?language=objc">entitlements waiting for you</a> so your sandboxed app can access the files created by other apps (including the Desktop, Downloads, Movies, Music and Picture folders), among other things.</p>



<h3 class="wp-block-heading">Hardened Runtime</h3>



<p>When enabled for your macOS app, hardened runtime adds an extra layer of protection to the running code itself. For example, it prevents certain classes of exploits, like code injection, dynamically linked library (DLL) hijacking, and process memory space tampering. This kind of protection is also enhanced by the <a href="https://support.apple.com/en-us/102149">System Integrity Protection (SIP)</a>.</p>



<h3 class="wp-block-heading">Notarization</h3>



<p>In brief, this is a third layer of confidence for the potential users of your macOS app. When the app is notarized, that ensures to the user that the Developer ID-signed software you distribute has been checked by Apple for malicious components. This is not related with the Apple Review process of your app when it is submitted to the Mac App Store, it&#8217;s related to the <a href="https://support.apple.com/en-gb/guide/security/sec5599b66df/web">macOS Gatekeeper technology</a>. So, when a Notarized app is downloaded from Internet, for example, Gatekeeper will use the notarization ticket attached to your app/DMG file to provide more meaningful information about the origin of the app, including if it is safe for the user to open it.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="744" height="752" src="https://blog.xojo.com/wp-content/uploads/2024/08/2-Gatekeeper.png" alt="" class="wp-image-13513" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/2-Gatekeeper.png 744w, https://blog.xojo.com/wp-content/uploads/2024/08/2-Gatekeeper-297x300.png 297w" sizes="auto, (max-width: 744px) 100vw, 744px" /></figure>
</div>


<h2 class="wp-block-heading">Preparation</h2>



<p>In order to follow this article, you will need:</p>



<ul class="wp-block-list">
<li><strong>Xojo</strong>. <a href="https://www.xojo.com/download">Download it for macOS</a> if you have not done yet.</li>



<li><strong>macOS 11.3</strong> or later.</li>



<li><strong>Xcode 13</strong> or later. Run it at least one time and make sure that all its required components and SDKs are installed.</li>



<li><strong>Apple Developer ID</strong>. This needs to be a paid Apple Developer membership. Also, make sure you have your Developer certificates installed in the Mac.</li>



<li>A working <strong>Internet</strong> connection.</li>
</ul>



<p>With all of this in place, open Xojo to create a macOS Desktop project and do some basic layout in the by default window. It is not required to add any functionality to keep the focus in the task at hand. Then, use Build Settings &gt; macOS &gt; Mac App Name to give an appropriate name to the built application (for this example I named it &#8220;SandboxedApp&#8221;).</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="594" height="654" src="https://blog.xojo.com/wp-content/uploads/2024/08/3-XojoProjectName.png" alt="" class="wp-image-13512" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/3-XojoProjectName.png 594w, https://blog.xojo.com/wp-content/uploads/2024/08/3-XojoProjectName-272x300.png 272w" sizes="auto, (max-width: 594px) 100vw, 594px" /></figure>
</div>


<p>Lastly, save the project (for example into the Documents folder) and click the Build button to build the app! It is not required at this point to assign the Developer ID in the Build Settings &gt; macOS &gt; Sign section, because we are going to sign it (again) in the next steps.</p>



<h2 class="wp-block-heading">Creating the Entitlements File</h2>



<p>The entitlements file is pretty similar to the Info.plist file you probably already know that is in charge of storing the required keys and values for the app to properly work. Both of these are in XML format, and the only difference is that while the Info.plist file is created for you by Xojo, the Entitlements file needs to be, currently, manually created for you.</p>



<p>So, open your text editor of choice (there a lot of there out there, both free and paid ones; personally I tend to use BBEdit from BareBones Software). Add the following lines to the text document and save it with the name &#8220;Entitlements.plist&#8221; (if you keep it next to the saved built macOS app, the better). This is the file where you will probably want to add more entitlement entries as your app requires them:</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"&gt;
&lt;plist version="0.9"&gt;
&lt;dict&gt;
  &lt;key&gt;com.apple.security.app-sandbox&lt;/key&gt;
  &lt;true/&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre>



<h2 class="wp-block-heading">Sandbox Your App</h2>



<p>With the compiled app and the entitlements file in place, open the Terminal app and type the following command and press the return key:</p>



<pre class="wp-block-code"><code>&gt; codesign --force --deep --timestamp --entitlements &lt;path-to-your-entitlements.plist-file&gt; -s "Developer ID Application: &lt;your-full-developer-name (including-the-team-id)&gt;" &lt;path-to-the-bundle-of-your-app&gt;</code></pre>



<p>Once executed, run the &#8220;SandboxedApp&#8221;, open the Activity Monitor app and make sure that the Sandbox option is enabled under the View &gt; Columns options. Then, use the search box of the main window to filter the displayed processes so it only displays your app. Take a look to the value under the Sandbox column and you will see that the app is now Sandboxed, and the Container for it has been created under the Library/Containers path. Quit the app when you are done.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1704" height="992" src="https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox.png" alt="" class="wp-image-13514" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox.png 1704w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-300x175.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-1024x596.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-768x447.png 768w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-1536x894.png 1536w" sizes="auto, (max-width: 1704px) 100vw, 1704px" /></figure>
</div>


<h2 class="wp-block-heading">Hardened Runtime</h2>



<p>With our app already sandboxed, let&#8217;s look how to add the hardened option to it. Once again, type the following command in the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; codesign --force --deep <strong>--options runtime</strong> --timestamp --entitlements &lt;path-to-your-entitlements.plist-file&gt; -s "Developer ID Application: &lt;your-full-developer-name (including-the-team-id)&gt;" &lt;path-to-the-bundle-of-your-app&gt;</code></pre>



<p>As you can see, it doesn&#8217;t vary much from the previous command. All it adds is the &#8220;<strong>&#8211;options runtime</strong>&#8221; text in charge of enabling the runtime hardening. Also, as you might guess, using this command will enable the Sandboxing of the app and also the runtime hardening, at all once.</p>



<p>Do you want to check if it worked? Well, type the following command at the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; codesign --display --verbose &lt;path-to-the-bundle-of-your-app&gt;</code></pre>



<p>It will produce an output similar to this one:</p>



<pre class="wp-block-code"><code>Executable=&lt;path-to-the-executable&gt;
Identifier=com.xojo.sandboxedapp
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=43297 <strong>flags=0x10000(runtime)</strong> hashes=1342+7 location=embedded
Signature size=9100
Timestamp=13 Aug 2024 at 12:51:28 PM
Info.plist entries=15
TeamIdentifier=************
Runtime Version=11.1.0
Sealed Resources version=2 rules=13 files=4
Internal requirements count=1 size=184</code></pre>



<p>It is the &#8220;<strong>flags=0x1000(runtime)</strong>&#8221; which shows that, in fact, the app runtime is hardened. Congrats!</p>



<h2 class="wp-block-heading">Notarizing the App</h2>



<p>This is the final step, but is going to require an extra step from your side. Because the notarytool command line tool, used for notarizing the app, is going to require the ID and password from your Apple ID account, plus the fact that it uses 2FA authentication, it is very convenient to create an app specific password for it.</p>



<h3 class="wp-block-heading">Creating an App-Specific Password</h3>



<p>In order to create the password used by the notarytool process, follow this steps:</p>



<ol class="wp-block-list">
<li>Sign in to <a href="https://appleid.apple.com">appleid.apple.com</a></li>



<li>In the Sign-in and Security section, select the App-Specific Passwords option:</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1408" height="1462" src="https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA.png" alt="" class="wp-image-13515" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA.png 1408w, https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA-289x300.png 289w, https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA-986x1024.png 986w, https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA-768x797.png 768w" sizes="auto, (max-width: 1408px) 100vw, 1408px" /></figure>
</div>


<ol start="3" class="wp-block-list">
<li>The previous action will bring a new dialog displaying all the app-specific passwords already created. Click the &#8220;+&#8221; button to add a new one:</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1392" height="1308" src="https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB.png" alt="" class="wp-image-13516" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB.png 1392w, https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB-300x282.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB-1024x962.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB-768x722.png 768w" sizes="auto, (max-width: 1392px) 100vw, 1392px" /></figure>
</div>


<ol start="4" class="wp-block-list">
<li>Type a meaningful name for as the &#8220;Title&#8221; or description for your new password in the presented dialog (<strong>notarytool</strong> could be a good one):</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="918" height="742" src="https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC.png" alt="" class="wp-image-13517" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC.png 918w, https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC-300x242.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC-768x621.png 768w" sizes="auto, (max-width: 918px) 100vw, 918px" /></figure>
</div>


<ol start="5" class="wp-block-list">
<li>Once you click the Create button it is possible that you will be asked to authenticate again using your Apple ID. Once done, a new dialog will present the generated password to you. Copy it and write it down (or paste it) into a safe place, because we are going to need it in the next step.</li>
</ol>



<h3 class="wp-block-heading">Adding the notarytool specific password to the Keychain</h3>



<p>Because this app-specific password is going to be used by the notarytool command line tool, it would be very convenient to have it stored in the macOS Keychain. To do so, type the following command at the Terminal prompt, and press the Return key:</p>



<pre class="wp-block-code"><code>&gt; xcrun notarytool store-credentials "notarytool-password" --apple-id "&lt;your-apple-ID&gt;" --team-id &lt;your-developer-team-id&gt; --password &lt;the-password-copied-from-the-previous-step&gt;</code></pre>



<p>Once executed, you will be able to see the password added to the Keychain app under the name of &#8220;notarytool-password&#8221;:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1948" height="1068" src="https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword.png" alt="" class="wp-image-13518" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword.png 1948w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-300x164.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-1024x561.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-768x421.png 768w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-1536x842.png 1536w" sizes="auto, (max-width: 1948px) 100vw, 1948px" /></figure>
</div>


<h3 class="wp-block-heading">Creating a Zip file for your app</h3>



<p>The notarization process is handled by the Apple notary service running in the Internet, what means that notarytool needs to send (upload) the bundle of your app in an appropriate format. There are two options: as a DMG file (that needs to be signed before submitting), or as a zipped file, what is even faster and easier (Trivia: Did you know how easy it is to <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-zip">create Zip files in Xojo code</a>?)</p>



<p>So, in order to upload our app for notarization, we need to create a Zip file first. Once again, it is time to type a new command at the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; /usr/bin/ditto -c -k --keepParent &lt;path-to-app-bundle&gt; &lt;path-to-generated-zip-file/file-name.zip&gt;</code></pre>



<h3 class="wp-block-heading">&nbsp;</h3>



<h3 class="wp-block-heading">Uploading the app for Notarization</h3>



<p>With our Zip file in place, we now have all the pieces to send it to the notarization process. The time spent by that process may (and will) vary depending of several factors.</p>



<p>In order to send the file, type the following command at the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; xcrun notarytool submit &lt;path-to-zip-file/file-name.zip&gt; --keychain-profile "notarytool-password" --wait </code></pre>



<p>After pressing the Return key, the process will start and the Terminal will output information about the progress; something similar to this:</p>



<pre class="wp-block-code"><code>Conducting pre-submission checks for &lt;name-of-your-zip-file&gt; and initiating connection to the Apple notary service...
Submission ID received
  id: &lt;some-id-number-goes-here&gt;
Upload progress: 100.00% (8.65 MB of 8.65 MB)   
Successfully uploaded file
  id: &lt;some-id-number-goes-here&gt;
  path: &lt;path-of-the-zip-file&gt;
Waiting for processing to complete.
Current status: Accepted........
Processing complete
  id: &lt;keep-this-id-in-a-safe-place-you-will-need-it-later&gt;
  status: Accepted</code></pre>



<p>Have you seen the last line? The &#8220;<strong>status: Accepted</strong>&#8221; means that everything worked OK, and the notarization process has been successful, but it&#8217;s better if we check! Type the following command at the Terminal prompt. This one will ask the notarytool command to download the log file in JSON format to be saved at the desired path. It is a good habit to do it, because such a log file will include some eventual error and explanation about possible errors during the notarization process, including those related to the app itself:</p>



<pre class="wp-block-code"><code>&gt; xcrun notarytool log &lt;put-here-the-value-you-saved-in-a-secure-place-from-the-id-field-in-the-previous-output&gt; --keychain-profile "notarytool-password" &lt;path-to-save-the-log.json&gt;</code></pre>



<h2 class="wp-block-heading">Staple the Ticket!</h2>



<p>Assuming that everything worked OK, it is time to staple the notarization ticket to the app itself. It is not required, but is convenient to avoid online checks when the user runs the app, or Gatekeeper inspects it.</p>



<p>Yeah, that means using a new command from Terminal on the already signed, sandboxed and runtime hardened app bundle (not the Zip file you created for submitting using notarytool):</p>



<pre class="wp-block-code"><code>&gt; xcrun stapler staple "&lt;path-to-the-signed-sandboxed-and-hardened-app-bundle&gt;"</code></pre>



<p>After that, you can check that everything went OK using the following command:</p>



<pre class="wp-block-code"><code>&gt; spctl -a -vvv -t install &lt;path-to-the-signed-sandboxed-and-hardened-app-bundle&gt;</code></pre>



<p>And you should get something similar to this as the output:</p>



<pre class="wp-block-code"><code>source=Notarized Developer ID
origin=&lt;your-full-developer-ID-Application&gt;</code></pre>



<h2 class="wp-block-heading">App Distribution</h2>



<p>That&#8217;s fine, but you will probably want to distribute your app from the Internet using a DMG container. In that case, follow these steps:</p>



<ol class="wp-block-list">
<li>Create a DMG container (file).</li>



<li>Copy your already notarized app bundle into it.</li>



<li>Notarize the DMG file.</li>



<li>Staple the ticket to the DMG file.</li>
</ol>



<p>That way the DMG container will be Notarized along with the app bundle inside it.</p>



<h2 class="wp-block-heading">In Summary</h2>



<p>As we did see, all the process of sandboxing, runtime hardening and Notarization involves a bunch of commands from the terminal, including the creation of the Zip file. But the good news is that all the process could be automated using Xojo itself! (take a look to the <a href="https://documentation.xojo.com/api/os/shell.html#executemodes">Shell</a> class and the <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-zip">Zip method from the FolderItem class</a> if you are not familiar with them).</p>



<p>As I said before, this article only on touches the basics and doesn&#8217;t dig into Provisioning Profile creation (associated with Capabilities required by the app), the Entitlements your app may need to properly work, among other topics; so you may find these Apple Developer Documentation of interest:</p>



<p>&#8211; <a href="https://developer.apple.com/help/account/manage-profiles/create-a-development-provisioning-profile/">Provisioning profiles</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/bundleresources/entitlements?language=objc">macOS Entitlements</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/security/app_sandbox?language=objc">macOS Sandbox</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/security/hardened_runtime?language=objc">macOS Hardened Runtime</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution?language=objc">macOS Notarization</a>.</p>



<p>Happy Xojo Coding!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>More in this series on distributing Mac apps:</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/" target="_blank" rel="noreferrer noopener">Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</a></li>



<li><a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/" target="_blank" rel="noreferrer noopener">macOS Apps: From Sandboxing to Notarization, The Basics</a></li>



<li><a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a></li>



<li><a href="https://blog.xojo.com/2025/01/30/provisioning-profiles-for-macos-apps/">Provisioning Profiles for macOS Apps</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Simplicity and Security, Xojo Cloud is Ideal Hosting for Xojo Web Apps</title>
		<link>https://blog.xojo.com/2023/10/30/simplicity-and-security-xojo-cloud-is-ideal-hosting-for-xojo-web-apps/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Mon, 30 Oct 2023 16:00:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[App Hosting]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Security-Enhanced Linux]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11553</guid>

					<description><![CDATA[Xojo Cloud is the premier hosting solution for developers looking for a reliable, secure and high-performance hosting environment for Xojo web applications. Xojo Cloud is developed specifically for Xojo web applications and offers a range of benefits for you and your applications that make it worth the investment.]]></description>
										<content:encoded><![CDATA[
<p>Xojo Cloud is the premier hosting solution for developers looking for a reliable, secure and high-performance hosting environment for Xojo web applications. Xojo Cloud is developed specifically for Xojo web applications and offers a range of benefits for you and your applications that make it worth the investment.</p>



<p>Xojo Cloud is <strong>optimized for Xojo applications</strong>. It is specifically designed to provide the best possible performance and stability for Xojo web applications. We optimize Xojo Cloud for performance, so your web apps will run smoothly and seamlessly. You can even monitor server stats from within the Xojo IDE.</p>



<p>Xojo Cloud is <strong>focused on simplicity and ease of use</strong> and requires zero configuration. Designed with the Xojo developer in mind, Xojo Cloud&#8217;s Control Panel makes it easy to deploy and manage web applications. Purchase a server, open a web project in Xojo and click Deploy to upload and install to Xojo Cloud. Not just for web apps, Xojo Cloud includes Apple Push Notification server (APNs) support for your iOS apps. Set up SSL, PostrgeSQL, MySQL, SFTP and a SSH Tunnel with a click in the Xojo Cloud Control Panel (the Control Panel itself is a Xojo web app). The administration of a web server is a significant and constant task; Xojo Cloud allows you to leave that behind and focus on your projects.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="386" data-id="12082" src="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-1024x386.png" alt="Xojo Cloud Control Panel Apps Tab" class="wp-image-12082" srcset="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-1024x386.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-300x113.png 300w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-768x289.png 768w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-1536x579.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-2048x772.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="384" data-id="12083" src="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-1024x384.png" alt="Xojo Cloud Control Panel Options Tab" class="wp-image-12083" srcset="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-1024x384.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-300x112.png 300w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-768x288.png 768w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-1536x576.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-2048x768.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>We take security very seriously. Xojo Cloud <strong>offers advanced security features</strong> to protect your data from cyberthreats, including a smart firewall, intrusion and hacking detection and Security-Enhanced Linux. Unlike most hosting solutions that provide little to no security, each Xojo Cloud server is built with our state-of-the-art, industrial-strength, multi-tiered security system woven into its very core.&nbsp;</p>



<p>Additional features and benefits include daily automatic backups, load balancing and support from the Xojo team. With nine global hosting locations, you are able to host your Xojo web applications close to your users, for speed and an ideal overall experience. </p>



<div class="wp-block-columns are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-1024x576.png" alt="Xojo Cloud offers 3 packages offering options on RAM, storage and vCPU starting at $49/month. " class="wp-image-12078" srcset="https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-1024x576.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-300x169.png 300w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-768x432.png 768w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-1536x864.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>
</div>



<p>In addition to the <a href="http://xojo.com/store/#cloud">standard options</a>, Xojo Cloud servers with more RAM, storage and Virtual CPUs are available. Contact&nbsp;<a href="mailto:hello@xojo.com">customer support</a>&nbsp;for details about personalized plans.&nbsp;</p>



<p>Whether you are a seasoned Xojo developer or just getting started, Xojo Cloud provides an intuitive and user-friendly hosting solution for Xojo web applications. Today is a good day to start using Xojo Cloud, visit our <a href="https://xojo.com/cloud/">website</a> to learn more or see the Xojo <a href="https://xojo.com/store/#cloud">Store</a> to pick your package and location.</p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PDFDocument: How To Encrypt PDFs</title>
		<link>https://blog.xojo.com/2022/07/25/pdfdocument-how-to-encrypt-pdfs/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Mon, 25 Jul 2022 13:54:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[2022r2]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[PDF]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10486</guid>

					<description><![CDATA[One of the PDFDocument features added in Xojo 2022r2 is the ability to encrypt PDF files created with Xojo. Continue reading and I will show&#8230;]]></description>
										<content:encoded><![CDATA[
<p>One of the PDFDocument features added in Xojo 2022r2 is the ability to encrypt PDF files created with Xojo. Continue reading and I will show you how.</p>



<span id="more-10486"></span>



<p>Encrypting PDF files with PDFDocument is based in the use of the PDFPermissions class. You&#8217;ll need to create a new instance of the class passing along the &#8220;Owner&#8221; and &#8220;User&#8221; passwords. For example:</p>



<pre class="wp-block-code"><code>Var d As New PDFDocument
Var g As Graphics = d.Graphics

Var p As New PDFPermissions("OwnerPassword","UserPassword")</code></pre>



<p>In addition, you can set other properties for the PDFPermissions instance; all of them are read/write and will be applied by the PDF viewer app for when the document is opened using the &#8220;user&#8221; password.</p>



<ul class="wp-block-list"><li><strong>AllowCopyingContents</strong> is set to <code>False</code> by default. When set to <code>True</code> it will allow copying contents from the PDF, as for example the selected text or image.</li><li><strong>AllowModifyingContents</strong> is set to <code>False</code> by default. When set to <code>True</code> it will all to modify the contents of the protected PDF document.</li><li><strong>AllowPrinting</strong> is se to <code>False</code> by default. When it is set to <code>True</code> it will be possible to print the PDF.</li></ul>



<p>Once the PDFPermissions instance has been created and the desired properties had been set, all you need to do is to assign such instance to the Permissions property for the PDFDocument instance you want to encrypt:</p>



<pre class="wp-block-code"><code>d.Permissions = p</code></pre>



<p>Then, when it&#8217;s saving the document to a file, PDFDocument will encrypt all the streams of data containing sensitive information, as it can be the text or Images rendered on every one of the PDF pages plus the metadata information itself. The used encryption algorithm is AES 128 bits.</p>



<p>That&#8217;s all! You can distinguish an encrypted PDF file from an unencrypted one because, usually, the first one will be displayed with the image of a Lock in the icon. When you open an encrypted PDF in the viewer app you&#8217;ll be asked to type a password. If you enter the passord set to the &#8220;Owner&#8221; user, you&#8217;ll be able to do all the kind of operations allowed by the viewer app, while if you enter the &#8220;User&#8221; password, then the kind of options available will be determined by those set using the PDFPermissions properties.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>My Thoughts on the WWDC 2022 Keynote</title>
		<link>https://blog.xojo.com/2022/06/06/my-thoughts-on-the-wwdc-2022-keynote/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 06 Jun 2022 21:45:33 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WWDC]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10460</guid>

					<description><![CDATA[I've learned over the years not to have any specific expectations from Apple's WWDC keynote. Some years they introduce something big and new that we were pretty much expecting. Other years they blindside us. As the CEO of a company that creates tools for building apps for most of Apple's ecosystem and given Apple's history of secrecy, I'm understandably curious just how blindsided I might be each June. Fortunately, this year's keynote was filled with features that ranged from mildly interesting to really awesome but all incremental improvements across Apple's software line.]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve learned over the years not to have any specific expectations from Apple&#8217;s WWDC keynote. Some years they introduce something big and new that we were pretty much expecting. Other years they blindside us. As the CEO of a company that creates tools for building apps for most of Apple&#8217;s ecosystem and given Apple&#8217;s history of secrecy, I&#8217;m understandably curious just how blindsided I might be each June. Fortunately, this year&#8217;s keynote was filled with features that ranged from mildly interesting to really awesome but all incremental improvements across Apple&#8217;s software line.</p>



<p>There&#8217;s a lot of neat new features coming in<strong> </strong>iOS 16. The kinds of customizations Apple is adding to the Lock Screen are quite nice both aesthetically and practically. While I&#8217;m personally not prone to sending text messages I later regret, being able to edit messages and more importantly unsend them, is going to save many relationships. That you can easily switch between dictation and the keyboard means I will probably use dictation a lot more than I have in the past. I have a friend that uses it constantly and I can&#8217;t tell you how many times a second text message arrives to explain the incomprehensible message that had arrived moments earlier. That it now adds punctuation will make me want to use it more as dictating punctuation has always felt awkward to me. It will however likely infuriate my kids who think punctuation in text messages is rude. That ApplePay is going to have integrated order tracking is really nice. I have been using an app for that and sadly quite recently several of the companies it allows you to track have dramatically reduced the functionality of their APIs making the app almost useless. That you will be able to easily share photos amongst family members via an iCloud Shared Photo Library is a feature my family will definitely be using. It&#8217;s very cool that you can have it automatically share photos that were taken when family members were close by or when they are in the photo itself. It&#8217;s a very nice use of Apple Neural Engine.</p>



<p>That Apple announcing a feature to help people escaping abuse says a lot about what they value and how important privacy is to one’s personal safety. It goes right along with features they have added in the past that allow you to reach into your pocket and dial 911 should you need to do that in secret. I&#8217;m big into making my home smarter so I was happy to see the Home app getting a facelift as well as Apple working with other companies on smart home interoperability. I&#8217;m also a huge fan of CarPlay and seeing Apple&#8217;s vision for it becoming nearly the entire way in which you interact with displays and controls in your car and being able to customize that to your liking was far more than I had ever thought would happen. That future is clearly years away because it requires a lot of cooperation with the automakers but as they adopt it, it will certainly sway my future car purchases.</p>



<p>I wear an Apple Watch and very much care about the quality of my sleep. That they have added the ability to see your REM, core and deep sleep cycles is very cool. I will definitely be wearing my watch to bed more often as a result. They are adding a medication reminder system which I can see as being a benefit. I only take one pill a day so it&#8217;s not something I would use but my wife takes several and on her busy days sometimes forgets to take them so it&#8217;s a feature she will definitely use.</p>



<p>The M2 was something I was fully expecting and it&#8217;s nice to see it incrementally getting better. Apple made it clear that performance per watt is the key metric for them and that makes a lot of sense. We need that kind of metric in many other places in society so that we better understand the impact we are having on each other and our planet.</p>



<p>The surprise feature in macOS Ventura was Stage Manager. it makes it easy to avoid the clutter of having a lot of windows open. I wasn&#8217;t expecting it and yet I&#8217;m sure I will use it. Like Messages, Mail is getting an unsend feature and lots of other nice improvements especially to search (which has always felt weak to me) but I&#8217;ll have to test it to know just how much it has improved. Passkeys is Apple&#8217;s name for their implementation of the <a href="https://fidoalliance.org/apple-google-and-microsoft-commit-to-expanded-support-for-fido-standard-to-accelerate-availability-of-passwordless-sign-ins/">Fido</a> standard they are collaborating on with Google and Microsoft. It&#8217;s designed to get rid of passwords entirely, something of which I will definitely be an early adopter. They really have thought that one through. It will make all of our devices and data far more secure. Being able to use FaceTime with Handoff will be really nice. I&#8217;ve been on a FaceTime call and then hung up to call someone back from my Mac so it will be nice to be able to just transfer it from one device to another.</p>



<p>The new MacBook Air is a nice incremental upgrade. If you have an Intel-based MacBook Air, this is a good time to upgrade.</p>



<p>iPadOS 16<strong> </strong>is bringing some more desktop-like features to iPad. Things like standard ways for accessing documents, renaming them, collaboration, etc., all make iPad feel a little more like a desktop without it being a desktop. It feels like Apple is striking the right balance. They also previewed a new app called Freeform which is essentially a digital whiteboard that you can use to collaborate with others. Though now that I say that, it seems to not really do it justice given that you can share so many different things in a common space, from text, drawings, photos, video and more. It would be great for brainstorming with a remote team.</p>



<p>Overall, this keynote demonstrated a lot of incremental improvements across the software side of the product line and that&#8217;s a good thing. We all want something big, new and flashy but those often come at the cost of a lot fewer incremental improvements. I&#8217;m actually quite happy that we weren&#8217;t blindsided by something that could potentially change our short term plans here at Xojo. I look forward to using many of the new features they are adding this year.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PDFDocument: Signing PDFs</title>
		<link>https://blog.xojo.com/2022/04/05/pdfdocument-signing-pdfs/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 05 Apr 2022 13:30:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=9937</guid>

					<description><![CDATA[Beginning with Xojo 2022r1 you can use Xojo's newPDFSignatureForm Control in your PDFDocuments. Using this allows your users to be able to sign documents using a Digital Certificate.  ]]></description>
										<content:encoded><![CDATA[
<p>Beginning with Xojo 2022r1 you can use Xojo&#8217;s new<code><a href="https://documentation.xojo.com/api/pdf/pdfsignature.html#pdfsignature">PDFSignature</a></code>Form Control in your PDFDocuments. Using this allows your users to be able to sign documents using a Digital Certificate.  Read on to learn how&#8230;</p>



<span id="more-9937"></span>



<p>Once the document has been signed and saved to disk, anyone opening the document will be able to check if the signature on the document is still valid or if, on the contrary, there have been changes to the documents after it was signed.</p>



<p>Adding signing controls to a PDF Document with this code:</p>



<pre class="wp-block-preformatted">Var d As New PDFDocument

// Creating a new PDFSignature instance
Var signatureField As PDFSignature = New PDFSignature(1, X, Y, Width, Height, "SignatureField")

// …and adding it to the Form controls in the PDFDocument instance
d.AddControl(signatureField)</pre>



<p>As you can see, you need to create a new instance from the <code>PDFSignature</code> class providing to the <code>Constructor</code> method the page number, X and Y coordinates, and the width and height values for the interactive signing box.</p>



<p>These screenshots show a PDF document with a <code>PDFSignature</code> control added before it has been signed (on the left), and after it has been signed using a Digital Certificate (on the right).  The project that produced the example below is included in the Example Projects folder in the Xojo download.</p>



<figure class="wp-block-image is-style-default"><img loading="lazy" decoding="async" width="1024" height="647" src="https://blog.xojo.com/wp-content/uploads/2022/02/PDFSigning-1024x647.png" alt="" class="wp-image-9940" srcset="https://blog.xojo.com/wp-content/uploads/2022/02/PDFSigning-1024x647.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/02/PDFSigning-300x189.png 300w, https://blog.xojo.com/wp-content/uploads/2022/02/PDFSigning-768x485.png 768w, https://blog.xojo.com/wp-content/uploads/2022/02/PDFSigning-1536x970.png 1536w, https://blog.xojo.com/wp-content/uploads/2022/02/PDFSigning-2048x1293.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Lastly, and as it happens with many other features of the PDF format specification, the ability to digitally sign the PDF documents created with the <code>PDFDocument</code> class is up to the PDF viewer you use. For example, the free app Adobe Acrobat Reade<strong>r</strong> does support this feature, while that is not the case with the Preview app provided by macOS.</p>



<p><em>Paul learned to program in BASIC at age 13 and has programmed in more languages than he remembers, with Xojo being an obvious favorite. When not working on Xojo, you can find him talking about retrocomputing at <a href="https://goto10.substack.com" target="_blank" rel="noreferrer noopener">Goto 10</a> and </em>on Mastodon @lefebvre@hachyderm.io.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Crypto Improvements</title>
		<link>https://blog.xojo.com/2021/11/18/crypto-improvements/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Thu, 18 Nov 2021 12:40:00 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=9589</guid>

					<description><![CDATA[Xojo 2021 Release 3 has a few improvements to the Crypto module that you might find useful such as SHA3, BlowFish/TwoFish and CRC-32.]]></description>
										<content:encoded><![CDATA[
<p>Xojo 2021 Release 3 has a few improvements to the <a href="https://documentation.xojo.com/api/cryptography/crypto.html">Crypto</a> module that you might find useful.</p>



<h3 class="wp-block-heading">SHA3</h3>



<p>A new <a href="https://en.wikipedia.org/wiki/SHA-3">SHA3</a> algorithm is available for use with the Hash function. You can now use SHA3-256 (SHA3 with 256-bit digest) and SHA3-512 (SHA3 with a 512 bit digest) from the <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-hashalgorithms">Crypto.HashAlgorithms</a> enumeration for stronger encryption or compatibility with something else that uses them.</p>



<pre class="wp-block-preformatted">Var hash As String
hash = Crypto.Hash("YourPasswordSentence", Crypto.HashAlgorithms.SHA3_512)</pre>



<h3 class="wp-block-heading">BlowFish / TwoFish</h3>



<p>The BlowFish and TwoFish encryption algorithms can now be used in Xojo. These two algorithms are similar, with <a href="https://en.wikipedia.org/wiki/Blowfish_(cipher)">BlowFish</a> being the original algorithm and <a href="https://en.wikipedia.org/wiki/Twofish">TwoFish</a> being a newer, more secure version that was derived from BlowFish.</p>



<p>You can use them in Xojo with the <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-blowfishencrypt">Crypto.BlowFishEncrypt</a>, <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-blowfishdecrypt">Crypto.BlowFishDecrypt</a>, <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-twofishencrypt">Crypto.TwoFishEncrypt</a> and <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-twofishdecrypt">Crypto.TwoFishDecrypt</a> methods.</p>



<p>You can use either to encrypt data, but in general you&#8217;ll want to avoid BlowFish for your own code, although it might prove useful for compatibility with other libraries or tools.</p>



<h3 class="wp-block-heading">AES</h3>



<p>AES (Advanced Encryption Standard) is also used to encrypt data. You can do this using the <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-aesencrypt">Crypto.AESEncrypt</a> and <a href="https://documentation.xojo.com/api/cryptography/crypto.html#crypto-aesencrypt">Crypto.AESDecrypt</a> methods. Here is a quick sample:</p>



<pre class="wp-block-preformatted">Var encrypted As MemoryBlock

Var dataToEncrypt As MemoryBlock = "Secret!"
Var key As MemoryBlock = Crypto.GenerateRandomBytes(16)
Var initVector As MemoryBlock = Crypto.GenerateRandomBytes(16)
encrypted = Crypto.AESEncrypt(key, dataToEncrypt, Crypto.BlockModes.CBC, initVector)

Var decrypted As MemoryBlock
decrypted = Crypto.AESDecrypt(key, encrypted, Crypto.BlockModes.CBC, initVector)
// decrypted = "Secret!"</pre>



<p></p>



<h3 class="wp-block-heading">CRC-32</h3>



<p>CRC32 is just a simple way to test data integrity and is not cryptographically secure. It still has its uses for fast data comparison and simple hash tables. It can be called like this:</p>



<pre class="wp-block-preformatted">Var crc32 As String
crc32 = Crypto.Hash("StringOrDataToTest", Crypto.HashAlgorithms.CRC32)</pre>



<h3 class="wp-block-heading">RSASign</h3>



<p>RSASign now takes an optional parameter and RSASignModes let you specify the hash to use.</p>



<p>Learn more about the Crypto module in the <a href="https://documentation.xojo.com/api/cryptography/crypto.html">Xojo Documentation</a>.</p>



<p></p>



<p>Updated (Nov 22, 2021): Added AES section</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Modern Control Panel + 4 More Powerful Features New in Xojo Cloud</title>
		<link>https://blog.xojo.com/2020/08/27/modern-control-panel-powerful-features-new-xojo-cloud/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 27 Aug 2020 11:17:00 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[App Hosting]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7389</guid>

					<description><![CDATA[Our vision for Xojo Cloud is a simple, one-click deployment option for your web app. Xojo Cloud allows you to focus on developing your app instead of dealing with the nitty gritty details of web hosting and security. Xojo Cloud has tons of new stuff to compliment apps built with Xojo 2020r1! ]]></description>
										<content:encoded><![CDATA[
<p>Our vision for Xojo Cloud has always been a simple, safe, one-click deployment option for your web apps. Xojo Cloud allows you to focus on developing your apps instead of dealing with the nitty gritty details of web hosting and security. Xojo Cloud has tons of new stuff to compliment apps built with Xojo 2020r1! </p>



<p>Here&#8217;s what&#8217;s new:</p>



<ul class="wp-block-list"><li>Apps deployed to Xojo Cloud are now 64-bit stand-alone apps for better security and faster performance*</li><li>Apps deployed to Xojo Cloud are now automatically load-balanced to support more concurrent users</li><li>Domains can now be <a href="https://documentation.xojo.com/index.php?title=UserGuide:Xojo_Cloud_General_Information&amp;oldid=71856#Pointing_Your_Domain_or_SubDomain_at_A_Specific_Xojo_Cloud_App">pointed at individual web apps</a></li><li>Unique <a href="https://documentation.xojo.com/index.php?title=UserGuide:Xojo_Cloud_General_Information&amp;oldid=71856#Using_A_XojoCloud.Net_Subdomain">subdomains are available</a> on the xojocloud.net domain for users who don&#8217;t have dedicated app domains</li><li>Manage team members and grant access to your server directly from the all-new, made-with-Xojo, <a href="https://documentation.xojo.com/topics/xojo_cloud/introduction_to_xojo_cloud.html_Control_Panel">Xojo Cloud Control Panel</a></li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="484" src="https://blog.xojo.com/wp-content/uploads/2020/08/Xojo-Cloud-Control-Panel.jpg" alt="" class="wp-image-7390" srcset="https://blog.xojo.com/wp-content/uploads/2020/08/Xojo-Cloud-Control-Panel.jpg 800w, https://blog.xojo.com/wp-content/uploads/2020/08/Xojo-Cloud-Control-Panel-300x182.jpg 300w, https://blog.xojo.com/wp-content/uploads/2020/08/Xojo-Cloud-Control-Panel-768x465.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p>Xojo Cloud eliminates the complicated process of deploying a web application; it requires no configuration, includes security, automatic backups and predictable pricing. Xojo Cloud servers are available in locations around the globe and start at <a href="https://www.xojo.com/store/#cloud">just $49/month</a>. More details about using Xojo Cloud can be found in the <a href="https://documentation.xojo.com/topics/xojo_cloud/introduction_to_xojo_cloud.html">User&#8217;s Guide</a>.</p>



<p>*CGI-based web apps built with previous versions of Xojo are still supported.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Code Tip: How to Implement the ARC4 Encryption Algorithm</title>
		<link>https://blog.xojo.com/2020/06/25/code-tip-how-to-implement-the-arc4-encryption-algorithm/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Thu, 25 Jun 2020 10:00:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[ARC4]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7137</guid>

					<description><![CDATA[ARC4 is a symmetric encryption algorithm fast and easy to implement. Being symmetric does means that it uses the same function with the same key (varying from 40 to 2048 bits) both for cyphering and de-cyphering a block of data.]]></description>
										<content:encoded><![CDATA[<p>ARC4 is a symmetric encryption algorithm fast and easy to implement. Being symmetric does means that it uses the same function with the same key (varying from 40 to 2048 bits) both for cyphering and de-cyphering a block of data.</p>
<p>Is it the most secure or robust encryption algorithm around? Not really. But it provides a good amount of performance and you can take further steps in order to correct some of its flaws. So, continue reading if you are interested in having this one in your developer toolset implemented as a Class with separate methods to encrypt and decrypt a block of information (even if it uses the same function in both cases).<span id="more-7137"></span></p>
<p>Add a new Class to your project and name it ARC4. Next, add the three properties needed to implement it:</p>
<ul>
<li><strong>Name:</strong> mBox</li>
<li><strong>Type:</strong> MemoryBlock</li>
<li><strong>Scope:</strong> Private</li>
</ul>
<ul>
<li><strong>Name:</strong> mKeyBlock</li>
<li><strong>Type:</strong> MemoryBlock</li>
<li><strong>Scope:</strong> Private</li>
</ul>
<ul>
<li><strong>Name:</strong> mKeyLength</li>
<li><strong>Type:</strong> Integer</li>
<li><strong>Scope:</strong> Private</li>
</ul>
<p>ARC4 uses a main state box with a length of 256 bytes and the first one will be the one pointed by the <code>mBox</code> property. The second one, <code>mKeyBlock</code>, is declared as a <code>MemoryBlock</code> just to be more efficient in accessing the individual bytes of the provided Key. Lastly, the <code>mKeyLength</code> property is just a convenience property so we can access the original Key length from our Methods.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-7140 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/06/ARC4Demo.png" alt="" width="714" height="706" srcset="https://blog.xojo.com/wp-content/uploads/2020/06/ARC4Demo.png 714w, https://blog.xojo.com/wp-content/uploads/2020/06/ARC4Demo-300x297.png 300w" sizes="auto, (max-width: 714px) 100vw, 714px" /></p>
<p>Now, let&#8217;s add the required Class methods, starting with the <code>Constructor</code>. This one will let the user provide the Key string as part of the instance initialization; so we don&#8217;t need to provide it again every time we want to encrypt or decrypt a new block of data.</p>
<p>With our ARC4 class selected in the Navigator, add a new method and type the following values in the Inspector Panel:</p>
<ul>
<li><strong>Name:</strong> Constructor</li>
<li><strong>Parameters:</strong> Key As String</li>
<li><strong>Scope:</strong> Public</li>
</ul>
<p>Next, type the following snippet of code in the associated Code Editor for the method:</p>
<pre>// If Key is not an empty String
// We call the Key method in order
// to initialize the State box

If Not (key.IsEmpty) Then
  Me.Key = key
Else
  // Empty String, so we raise an exception
  Raise New RuntimeException(kkeynotinitialized,Integer(ARCError.KeyNotInitialized))
End If</pre>
<p>As you can see, the main thing that the Constructor does is call the <code>Key</code> Method; it&#8217;s in charge of initializing the required state box with the provided key. If the key is an empty String, it will raise a Runtime Exception giving a descriptive error message an error number.</p>
<p>Now, let&#8217;s add the Key method to our RC4 class:</p>
<ul>
<li><strong>Name:</strong> Key</li>
<li><strong>Parameters:</strong> Assigns Value As String</li>
<li><strong>Scope:</strong> Public</li>
</ul>
<p>Being a Public method means that you can change the Key String without needing to create a new instance, if that is what you want to do. For example, you may want to initialize the Class instance using a key, encrypt some blocks of data using that one and then change to a different key in order to encrypt other blocks of data. Just remember that you&#8217;ll need to use the same keys in order to reverse to plain data those blocks encrypted with a given key.</p>
<p>In addition, the use of the <code>Assigns</code> keyword is simply syntactic sugar to make it possible to call the method using the equal operator to pass along the required parameter instead of using the regular syntax when calling a method in Xojo code. So, for example, you can use call it using:</p>
<pre>MyRC4Instance.Key = "MySecretKey"</pre>
<p>Instead of:</p>
<pre>MyRC4Instance.Key("MySecretKey")</pre>
<p>This is the code snippet that&#8217;s going to execute this method:</p>
<pre>// Disabling some features for better speed
#Pragma DisableBackgroundTasks
#Pragma DisableBoundsChecking
#Pragma NilObjectChecking False
#Pragma StackOverflowChecking False

// Initialize the index values
Var mFirstIndex As UInt8
Var mSecondIndex As UInt8

// Let's check that this is not an Empty Key String
If Not (value.IsEmpty) Then

  // Trim key length if greater than 256 = max 2048 bits supported by ARC4
  If value.Length &gt; 256 Then value = value.Left(256)

  // Pad the key if it is less than the required min 40 bits (5 bytes)
  // We are going to pad the key repeating the remaining 'n' characters
  // from the begining of the key.
  If value.Length &lt; 5 Then

    Var pad As Integer = 5-value.Length

    value = value + value.Left(pad)

  End If

  // Initialize the State Box if this is the first call to the method.
  // The State box has a maximum of 256 bytes.
  If mBox = Nil Then mBox = New MemoryBlock(256)

  // Just in case there is an older Key in use
  // Let's get rid of the old MemoryBlock storing it
  // And create a new one with the Key lenght (in bytes)
  mKeyBlock = Nil
  mkeyBlock = value
  mKeyLength = value.Length

  // Required initialization of the State Box
  For n As Integer = mFirstIndex To 255
    mBox.UInt8Value(n) = n
  Next

  mFirstIndex = 0

  // Last step on State Box initialization
  // Permutation of values in the State Box
  // using for that the provided Key.

  For n As Integer = mFirstIndex To 255

    mSecondIndex = (mSecondIndex + mBox.UInt8Value(n) + mkeyblock.UInt8Value(n Mod mKeyLength)) Mod 256

    SwapValues(n,mSecondIndex)

  Next

Else

  // If the provided key is an empty String, we raise a new Runtime Exception
  // with a descriptive error message and error number.
  Raise New RuntimeException(kKeyNotInitialized, Integer(ARCError.KeyNotInitialized))
End If</pre>
<p>As you can see, both the Constructor and the Key methods raise a Runtime Exception if the provided Key is an empty string. Both the message and error number are defined as a <code>Constant</code> (the message error) and an <code>Enumerator</code> (Error value) as part of the class itself. So go ahead and add a Constant to the ARC4 class using these values:</p>
<ul>
<li><strong>Constant Name:</strong> kKeyNotInitialized</li>
<li><strong>Default Value:</strong> Key Not Initialized</li>
<li><strong>Type:</strong> String</li>
<li><strong>Scope:</strong> Protected</li>
</ul>
<p>And for the Enumerator:</p>
<ul>
<li><strong>Name:</strong> ARCError</li>
<li><strong>Type:</strong> Integer</li>
<li><strong>Scope:</strong> Public</li>
<li><strong>Value:</strong> KeyNotInitialized = -1</li>
</ul>
<p>In addition, the Key method calls the <code>SwapValues</code> method in order to make the values permutation in the State Box. So add a new method using these values in the Inspector Panel:</p>
<ul>
<li><strong>Method Name:</strong> SwapValues</li>
<li><strong>Parameters:</strong> FirstValue As UInt8, SecondValue As UInt8</li>
<li><strong>Scope:</strong> Private</li>
</ul>
<p>While the code to type in the associated Code Editor will be:</p>
<pre>Var tmp As UInt8

tmp = mBox.UInt8Value(SecondValue)
mBox.UInt8Value(SecondValue) = mBox.UInt8Value(FirstValue)
mBox.UInt8Value(FirstValue) = tmp</pre>
<p>Now just two additional methods left to be added to the class- the ones in charge of encrypting and decrypting a given block of data.</p>
<p>In order to encrypt the data, add a new Method with the following values in the Inspector Panel:</p>
<ul>
<li><strong>Method Name:</strong> Encrypt</li>
<li><strong>Parameters:</strong> Value As String</li>
<li><strong>Return Type:</strong> MemoryBlock</li>
<li><strong>Scope:</strong> Public</li>
</ul>
<p>And with the following block of code in the associated Code Editor:</p>
<pre>// Disabling some features for better speed
#Pragma DisableBackgroundTasks
#Pragma DisableBoundsChecking
#Pragma NilObjectChecking False
#Pragma StackOverflowChecking False

// Index initialization
Var mFirstIndex As Integer
Var mSecondIndex As Integer

Var k As UInt8

// If we have a non initialized mKeyBlock
// that means that the key has not being initialized
// so we raise an exception
If mKeyBlock &lt;&gt; Nil Then

  // Initialize Key again

  me.Key = mKeyBlock.StringValue(0,mKeyBlock.Size)

  // Let's put the text to encrypt into a memoryblock
  // so it is faster to iterate through their bytes
  Var target As MemoryBlock = value
  Var temp As UInt8
  Var maxSize As Integer = target.Size-1

  // And we calculate the new bytes values (encrypted values)
  // using the ARC4 algorithm
  // Basically, every byte in the source block will be XORed
  // with the calculated byte from the State box.
  For n As Integer = 0 To maxSize

    mFirstIndex = (mFirstIndex + 1) Mod 256
    mSecondIndex = (mSecondIndex + mBox.UInt8Value(mFirstIndex)) Mod 256

    SwapValues(mFirstIndex,mSecondIndex)

    k = mBox.UInt8Value((mBox.UInt8Value(mFirstIndex) + mBox.UInt8Value(mSecondIndex)) Mod 256)

    target.UInt8Value(n) = target.UInt8Value(n) Xor k
  Next

  //…and return the block of data already encrypted
  Return target

Else
  Raise New RuntimeException(kKeyNotInitialized, Integer(ARCError.KeyNotInitialized))
End If</pre>
<p>And the last Method, the one in charge of decrypting a block of ARC4 encrypted data:</p>
<ul>
<li><strong>Method Name:</strong> Decrypt</li>
<li><strong>Parameters:</strong> Source As MemoryBlock</li>
<li><strong>Return Type:</strong> MemoryBlock</li>
<li><strong>Scope:</strong> Public</li>
</ul>
<p>Typing the following code fragment in the associated Code Editor:</p>
<pre>If Not (Source Is Nil) Then

  // Simply call the same method we use to
  // encrypt data, avoiding code duplication
  // and returning the now deciphered data to the caller
  Return Me.Encrypt(Source)

End If</pre>
<p>And, that&#8217;s all! If you are interested in more information about the ARC4 algorithm you can <a href="https://en.wikipedia.org/wiki/RC4">read this article on the Wikipedia</a>. Or better yet, read the excellent books &#8220;<a href="https://www.schneier.com/books/applied_cryptography/">Applied Cryptography</a>&#8221; and &#8220;<a href="https://www.schneier.com/books/cryptography_engineering/">Cryptography Engineering</a>&#8221; to dig in even more on this and other cyphering algorithms. Of course, remember that the <a href="https://documentation.xojo.com/api/cryptography/crypto.html">Crypto module</a> included in the Xojo framework has a good bunch of these ready to use!</p>
<p>Of course, you also can download the Xojo example project that includes this Class ready to use <a href="https://www.dropbox.com/s/xvija6zf3ru6t36/ARC4Demo.xojo_binary_project.zip?dl=1">from this link</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>#JustCode Challenge Week 2 &#8211; Password Generator</title>
		<link>https://blog.xojo.com/2018/06/29/just-code-challenge-week2/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 29 Jun 2018 01:00:53 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[#JustCode]]></category>
		<category><![CDATA[Challenge]]></category>
		<category><![CDATA[Passwords]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=4364</guid>

					<description><![CDATA[#JustCode Challenge Week 2! This week I took inspiration from a feature in 1Password that can generate a password suggestion. This desktop app allows you to specify a desired password length and the number of digits and symbols to include in it.]]></description>
										<content:encoded><![CDATA[<p>In week 2 of the <a href="https://blog.xojo.com/2018/06/18/jump-right-in-just-code-challenge/">Just Code challenge</a> I took inspiration from a feature in <a href="https://1password.com">1Password</a> that can generate a password suggestion. This desktop app allows you to specify a desired password length and the number of digits and symbols to include in it.</p>
<p><span id="more-4364"></span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-4367 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2018/06/2018-06-06_12-25-22.png" alt="" width="366" height="259" /></p>
<p>Here is the Window layout in the Xojo IDE:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4369" src="https://blog.xojo.com/wp-content/uploads/2018/06/2018-06-06_11-53-55.png" alt="" width="1159" height="694" /></p>
<p>I&#8217;m using a read-only <a href="http://developer.xojo.com/textfield">TextField</a> to display the generated password. There are a couple <a href="http://developer.xojo.com/pushbutton">PushButtons</a> for copying the password text to the clipboard and for generating a new password. I use Slider controls to set the length of the password and the number of digits and symbols to include, along with corresponding labels.</p>
<p>When the window opens, it populates some arrays with the acceptable characters that can be used for letters, digits and symbols. In particular, some characters are excluded such as &#8220;O&#8221;, &#8220;o&#8221;, &#8220;0&#8221; and quotes because those are difficult to distinguish. The code to do this is in the Open event:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4370" src="https://blog.xojo.com/wp-content/uploads/2018/06/2018-06-06_13-29-50.png" alt="" width="853" height="785" /></p>
<p>The last line calls the GeneratePassword method which uses the settings from the user interface to generate a password. This way you&#8217;ll have a password displayed immediately when the window appears.</p>
<p>The GeneratePassword method first determines how many digits are needed, making sure it does not exceed the requested password length. Then it adds any symbols, also ensuring it does not exceed the set length. Lastly, if more characters are needed it adds letters to reach the desired length.</p>
<p>The characters are added to a String array that is then shuffled to mix all the parts together. Try commenting the Shuffle line out and when you run the project you&#8217;ll see that numbers always appear first, followed by symbols and then the letters. Here is the GeneratePassword code:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4371" src="https://blog.xojo.com/wp-content/uploads/2018/06/2018-06-06_13-30-49.png" alt="" width="853" height="785" /></p>
<p>A similar technique is used by the RandomDigit, RandomLetter and RandomSymbol. It uses the Shuffle method to randomize the appropriate array and then returns the first item.</p>
<p><a href="http://files.xojo.com/JustCode/PasswordGenerator.zip">Download the Password Generator project file</a>.</p>
<p>Download and check out earlier projects:</p>
<p>Week 1: <a href="https://blog.xojo.com/2018/06/22/just-code-challenge-week1/">Color Picker Desktop App</a></p>
<p>Discuss your Week 2 project in the Xojo forum:</p>
<p><a href="https://forum.xojo.com/48550-just-code-challenge-week-2-projects">Just Code Challenge Week 2 Projects</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Software Distribution Simplified with GuancheMOS</title>
		<link>https://blog.xojo.com/2018/06/26/software-distribution-simplified-with-guanchemos/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 26 Jun 2018 10:00:09 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[AprendeXojo]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Plugins]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=4476</guid>

					<description><![CDATA[For software, distribution usually means generating and validating unique serial numbers for each of your products and users. This helps you manage your users, possibly unlock a free trial or demo version for full use and, of course, to minimize the illegal use of your software.]]></description>
										<content:encoded><![CDATA[<p>In an ideal world there is a person responsible for every step in software development, from coding, UI design, distribution, documentation, marketing and support. All of this can seem really overwhelming for independent developers and small businesses. But if you break it down and take it one piece at a time, it&#8217;s manageable by even the smallest team of one. Right now, let&#8217;s look at <strong>software distribution</strong>.</p>
<p>For software, distribution usually means generating and validating unique serial numbers for each of your products and users. Serial numbers (or license keys) help you manage your users, unlock a free trial or demo version for full use and, of course, minimize illegal use of your apps.</p>
<p><span id="more-4476"></span></p>
<p>Let&#8217;s admit it, there is no silver bullet. Even the greatest companies (you know who you are) throw lots of money at implementing and improving serious protection schemes that are often quickly bypassed.  It comes down to: How much time, money and resources are <em>you</em> willing to spend implementing a protection or licensing scheme?</p>
<p>The <em>bad guys</em> will always find a way to break your software protection if they are interested in doing that. Does that mean giving up on protecting your software? Not at all! When I was faced with the problem myself, in order to protect my own products, I went to the drawing board to build a way to generate unique serial numbers —or licensing information— for all the Xojo supported platforms.</p>
<p>The result of this process was the <a href="https://www.aprendexojo.com/shop/guanchemos-serial-number-generation-and-validation-for-xojo-developers/"><b>GuancheMOS plug-in</b></a>. GuancheMOS is a fully multiplatform plug-in for desktop, web and console apps (not for iOS due to the fact that iOS only can link against static libraries), on 32-bit and 64-bit architectures.</p>
<p>The simplicity of GuancheMOS means that you can use it as is, or as the starting point to build your own private and unique serial number automations. Integrate it as part of the purchase process in your website, wrap it as the core piece of other unique information collection. It&#8217;s already used by dozens of developers around the world in ways I hadn&#8217;t ever thought of while designing it! The best part, is that implementing GuancheMOS in your product takes about 5 minutes.</p>
<p>You can download and try <a href="https://www.xojo.com/store/#addons">GuancheMOS</a> for free today.</p>
<p><em>Javier Rodri­guez has been the Xojo Spanish Evangelist since 2008, he’s also a Developer, Consultant and Trainer who has be using Xojo since 1998. He manages <a href="http://www.aprendexojo.com">AprendeXojo.com</a> and is the developer behind the GuancheMOS plug-in for Xojo Developers, Markdown Parser for Xojo, HTMLColorizer for Xojo and the Snippery app, among others</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A compromise to security is always just that.</title>
		<link>https://blog.xojo.com/2017/08/28/a-compromise-to-security-is-always-just-that/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 28 Aug 2017 18:22:02 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=3192</guid>

					<description><![CDATA[Governments debate requiring companies to build "backdoors" into their technology. The problem is that if the government or the company can get in, others will inevitably find a way to exploit that same back door too, making us and our data less safe and secure.]]></description>
										<content:encoded><![CDATA[<p>Last month the Australian government <a href="https://www.macobserver.com/news/australia-attorney-general-apple-encryption-back-door/">suggested</a> they might require tech companies to provide back doors into their systems to help law enforcement use those back doors to catch bad guys. Apple immediately dispatched people to go talk with them about it. Apple&#8217;s stance has been that such back doors don&#8217;t help catch bad guys and just make the rest of us less secure. Is that really true?</p>
<p><span id="more-3192"></span></p>
<p>Systems like Apple&#8217;s iMessage (their text messaging service) use encryption ensuring that all messages sent between Apple devices via iMessage are encrypted with keys that Apple does not have. They keys are on your device. Law enforcement agencies want Apple and others to provide a means of decrypting those messages without having to obtain the device itself. <strong>The problem is that if the government and Apple can get in, others will inevitably find a way to exploit that same back door too, making us and our data less safe and secure.</strong></p>
<p>What some governments have failed to understand is that the bad guys can bypass any back door by using their own encryption. The smart bad guys probably assume that these back doors exist now (or at least aren&#8217;t taking any chances) and are already using their own encryption for their communications. How hard is it to write software to encrypt and decrypt messages? Do bad guys have access to programmers smart enough to do this? Yes, they almost certainly do.</p>
<p>Let&#8217;s take a look at what is involved in using <a href="http://www.xojo.com">Xojo</a> to write an app that encrypts and decrypts messages. First, two keys need to be generated, a public key and a private one. The public key allows anyone to encrypt a message that only the holder of the matching private key can decrypt. Public keys can only encrypt. They are no good for decrypting messages. This means you can give anyone your public key which they can then use to send encrypted messages to you that no one else but you can decrypt.</p>
<pre>Dim privateKey As String
Dim publicKey As String
If Crypto.RSAGenerateKeyPair(KeySize, privateKey, publicKey) Then
 PrivKey.Text = privateKey
 PubKey.Text = publickey
 SaveNewKeys(privateKey, publicKey)
Else
 Beep
 MsgBox "An error has occured. Keys could not be generated."
End If
</pre>
<p>This is just 10 lines of code and it could be further reduced. I wrote this to make it easier to read. The important function is RSAGenerateKeyPair on the third line. Next, you need to be able to encrypt a message using someone else&#8217;s public key. Let&#8217;s take a look at the code to do that:</p>
<pre>Dim publicKey As String = RecipientsPublicKey.Text
Dim msg As MemoryBlock = OriginalMessage.Text
try
 Dim encryptedData As MemoryBlock = Crypto.RSAEncrypt(msg, publicKey)
 beep
 If encryptedData = Nil Then
  MsgBox("Encryption failed.")
 else
  Dim c As New Clipboard
  c.Text = Encodebase64(encryptedData)
  c.close
  MsgBox("Your encrypted message has been copied to the clipboard.")
 End If
Catch rte As RuntimeException
 If rte IsA CryptoException Then
  Beep
  MsgBox "Encryption failed because the Public key provided is not valid."
 Else
  Raise rte
 End If
End Try</pre>
<p>This is 21 lines of code, most of which is handling errors. The one line that is really doing the work is the fourth one that contains RSAEncrypt. Next we need to be be able to decrypt. Here&#8217;s what that code looks like:</p>
<pre>Dim privateKey As String = privKey.Text
try
 Dim decryptedData As MemoryBlock = Crypto.RSADecrypt(DecodeBase64(EncryptedMessage.Text), privateKey)
 Decryptedmessage.Text = DefineEncoding(decryptedData.StringValue(0, decryptedData.size), Encodings.UTF8)
Catch rte As RuntimeException
 If rte IsA CryptoException Then
 Beep
 MsgBox "The message could not be decrypted because the incorrect key was provided."
 Else
 Raise rte
 End If
End Try</pre>
<p>This is 12 lines of code and like the other code examples, is mostly error checking. The important line is the third one that calls RSADecrypt. There is some additional code to save the keys to a text file and load them back in automatically when the app is launched. However, even adding in all that code gets you to only about 80 lines total. <strong>In other words, this is not a big app and not beyond the ability of someone with intermediate programming skills or even perhaps a very dedicated novice.</strong> (To learn about this in more depth, read <a href="http://blog.xojo.com/2014/02/05/using-publicprivate-key-encryption-in-xojo/">Using Public/Private Key Encryption in Xojo</a>).</p>
<p>If you&#8217;d like to try out encrypting messages with the app from which the code above originated, you can download <a href="http://blog.xojo.com/wp-content/uploads/2017/08/CryptoMessage-Mac.zip">CryptoMessage for macOS</a>, <a href="http://blog.xojo.com/wp-content/uploads/2017/08/CryptoMessage-Windows.zip">CryptoMessage for Windows</a> or <a href="http://blog.xojo.com/wp-content/uploads/2017/08/CryptoMessage-Linux.zip">CryptoMessage for Linux</a>. Have a friend do it as well and you can send encrypted messages back and forth. If you&#8217;re more adventurous and would like to try playing around with the source code itself, make sure you have <a href="http://www.xojo.com">Xojo</a> installed (which can be <a href="http://www.xojo.com/download">downloaded</a> and used for free) then download the <a href="http://blog.xojo.com/wp-content/uploads/2017/08/CryptoMessage.zip">CryptoMessage Xojo Project</a>.</p>
<p>Xojo has a <a href="http://developer.xojo.com/xojo-crypto">crypto library</a> (the part that provides key generation, encryption and decryption) built-in to it. However, if a programmer wasn&#8217;t using Xojo, they could easily find a crypto library on the Internet to use. In other words, building your own app to encrypt and decrypt messages is not very challenging. As I mentioned earlier, the bad guys (at least the smart ones) are likely already doing this as they are probably sufficiently paranoid that despite public announcements to the contrary, the back doors already exist.</p>
<p><strong>The assumption that compromising our security enables catching more bad guys is a flawed one that I have <a href="http://blog.xojo.com/2016/01/27/smartphone-encryption-is-a-red-herring/">written about</a> <a href="http://blog.xojo.com/2016/02/04/if-smartphone-encryption-is-a-red-herring-how-do-we-track-the-bad-guys/">before</a>.</strong> It won&#8217;t work and we will all suffer needlessly. Imagine not being able to carry on a private conversation via your smartphone. That would make your device feel <strong>a lot</strong> less useful. Some governments have &#8220;experts&#8221; that have suggested it would be possible to have a back door Law Enforcement could use but could not be compromised by anyone else. That is a logical impossibility. Governments do not possess magic powers. They are made of up people like you and me. That is wishful thinking at best and negligent at worse.</p>
<p>When your government starts making noises about doing this, I advise you to make it clear to them that for the reasons I have stated in this post, such a compromising security is all downside with no upside at all.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RSA: Private/Public keys between Xojo and PHP</title>
		<link>https://blog.xojo.com/2017/06/06/rsa-privatepublic-keys-between-xojo-and-php/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 06 Jun 2017 04:37:26 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AprendeXojo]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSA]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2767</guid>

					<description><![CDATA[Among other topics, Cryptography and data ciphering always fascinated me. Beyond their mathematical perspective, most of the time it is a matter of putting them&#8230;]]></description>
										<content:encoded><![CDATA[<p>Among other topics, Cryptography and data ciphering always fascinated me. Beyond their mathematical perspective, most of the time it is a matter of putting them in practice with developed solutions: dealing with data only visible between the transmitter and the receiver. As it happens, the Xojo framework makes it really easy to deal with ciphered data.<span id="more-2767"></span></p>
<p>All the methods related to cryptography and data ciphering are available under the <a href="http://developer.xojo.com/xojo-crypto"><b>Crypto</b></a> module of Xojo, using behind the scene the Crypto++ 5.6.3 library. From the practical side, this allows us to use the <strong>RSA</strong> public key ciphering and other algorithms to compute unique footprints for given data, as for example <a href="http://developer.xojo.com/xojo-crypto$Hash"><b>Hash</b></a>, <a href="http://developer.xojo.com/xojo-crypto$MD5"><b>MD5</b></a> or <a href="http://developer.xojo.com/xojo-crypto$SHA1"><b>SHA</b></a>. <a href="https://blog.xojo.com/2014/02/05/using-publicprivate-key-encryption-in-xojo/">Paul blogged</a> about using Public/Private Key Encryption in Xojo back when we added RSA encryption functions in 2014.</p>
<p>Among the methods related to RSA, we can find the ones to create the Private/Public keys, test the integrity of the public key, signing the given data and, of course, check the integrity of the signature, and ciphering / deciphering the given group of data.</p>
<p>As you probably already know, when we work with RSA we have to keep the Private key in a safe place, using the Public one to give to other people/service/app to whom we want to share information with in a safe manner. This way the users and/or apps and services will be able to use our public key to cipher the data that they want to share with us, and we will be able to use our private key to decipher that group of data so it is <em>legible</em> again.</p>
<h1>RSA: Creating and interchanging the keys</h1>
<p>Generating the pair of keys could not be more easy in Xojo, with this snippet of code:</p>
<pre>Dim publicKey As String
Dim privateKey As String
If Crypto.RSAGenerateKeyPair( 1024, privateKey, publicKey ) Then msgBox “Successfully generated Keys!"</pre>
<p>As you can see, the <a href="http://developer.xojo.com/xojo-crypto$RSAGenerateKeyPair"><b>RSAGenerateKeyPair</b></a> method receives the Integer number that indicates the strength (robustness) of the generated keys, followed by the String variables containing the generated Private and Public keys, passed by reference.</p>
<p>But in some cases it is possible that you want to use these keys beyond the scope of Xojo, for example when integrating your app with a service or solution developed in PHP. In these cases you have to consider that the keys generated with Xojo are in hexadecimal format.</p>
<p>What does this mean? Well, a public key generated with Xojo will look like this chunk of data:</p>
<pre>30819D300D06092A864886F70D010101050003818B0030818702818100B4B531D3402C250D8640E739601F01FBE8ABB39635BE1778A7F4E55C49419C0595EF5A5824EA8E7A1871FB63B8960EDBB97B08C2E7EA43229903AEBCB45B9FD9E24780B15BCADB5E026849592CC1FA9B399EBD8457CC4E7A686CF53E9146E1D867ACEB675728E8821DEDA4C2F807FD668A81601F551484C5D1334B62D5E90E33020111</pre>
<p>While other external libraries (as is the case in most of the web development frameworks), expect other data format codified as Base64. This is, something like this:</p>
<pre>-----BEGIN PUBLIC KEY-----

MIGHAoGBALS1MdNALCUNhkDnOWAfAfvoq7OWNb4XeKf05VxJQZwFle9aWCTqjnoYcftjuJYO27l7
CMLn6kMimQOuvLRbn9niR4CxW8rbXgJoSVkswfqbOZ69hFfMTnpobPU+kUbh2Ges62dXKOiCHe2k
wvgH/WaKgWAfVRSExdEzS2LV6Q4zAgER

-----END PUBLIC KEY-----</pre>
<p>So the first step to encode our Xojo keys (Public or Private ones) as Base64 is converting them previously from his hexadecimal form to the DER encoding (<em>Distinguished Encoding Rules</em>). Here is where we have to employ the <a href="http://developer.xojo.com/xojo-crypto$DEREncodePrivateKey"><b>DEREncodePrivateKey</b></a> and <a href="http://developer.xojo.com/xojo-crypto$DEREncodePublicKey"><b>DEREncodePublicKey</b></a> methods if we want to encode the Private or the Public key, respectively. Once we have done this, we will be able to encode the resulting chunk of data as Base64 without forgetting to add the header <code>“—–BEGIN PUBLIC KEY—–“</code> and the footer <code>“—–END PUBLIC KEY—–“</code> with the accompanying ends of lines, or maybe the header <code>“—–BEGIN CERTIFICATE—–”</code> and the footer <code>“—–END CERTIFICATE—–“</code> if we are dealing with a Public Key (for the Private keys we have to use the header <code>“—–BEGIN RSA PRIVATE KEY—–”</code> and the footer <code>“—–END RSA PRIVATE KEY—–“</code>).</p>
<p>You can interchange and use the Private and Public keys generated with Xojo using the <a href="http://phpseclib.sourceforge.net/">PHPSecLib</a> library.</p>
<p>In addition, as pointed by <a href="https://thezaz.com/">Thom McGrath</a>, you can use also these keys with OpenSSL this way:</p>
<pre>if (@openssl_public_encrypt($data, $result, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
         return $result;
 } else {
         throw new \Exception('Unable to encrypt');
 }</pre>
<p>Xojo&#8217;s Crypto library will be able to use a private key to decrypt $result in this case.</p>
<p>Finally, if you are interested in the cryptography topic, let me recommend you some good books: <a href="https://www.schneier.com/books/applied_cryptography/" target="_blank" rel="noopener noreferrer">Applied Cryptography</a> and <a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470474246.html" target="_blank" rel="noopener noreferrer">Cryptography Engineering</a>.</p>
<p><em>Javier Rodri­guez has been the Xojo Spanish Evangelist since 2008, he’s also a Developer, Consultant and Trainer who has be using Xojo since 1998. He manages <a href="http://www.aprendexojo.com/">AprendeXojo.com</a> and is the developer behind the GuancheMOS plug-in for Xojo Developers and the Snippery app, among others.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JSON Feed iOS App</title>
		<link>https://blog.xojo.com/2017/05/31/json-feed-ios-app/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 31 May 2017 16:56:23 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2867</guid>

					<description><![CDATA[In a previous post I showed how easy it was to create a web app that displays the JSON Feed for Daring Fireball. In this post, I'll show you how to make an iOS app to do it.]]></description>
										<content:encoded><![CDATA[<p>In a <a href="http://blog.xojo.com/2017/05/30/json-feed-web-app/">previous post</a> I showed how easy it was to create a web app that displays the <a href="https://jsonfeed.org/">JSON Feed</a> for <a href="http://daringfireball.net">Daring Fireball</a>. In this post, I&#8217;ll show you how to make an iOS app to do it.</p>
<p><span id="more-2867"></span></p>
<h2>Designing the User Interface</h2>
<p>To start, <a href="http://www.xojo.com/download/">download Xojo for free</a>, install and launch it. At the <a href="http://developer.xojo.com/userguide/fundamentals">Project Chooser</a>, select “iOS”, enter “JSONFeed” as the Application Name and click OK.</p>
<p>You are now looking at the <a href="http://developer.xojo.com/userguide/layout-editor">Layout Editor</a>. You can drag controls from the <a href="http://developer.xojo.com/userguide/library-inspector">Library</a> on the right to create your user interface. For this example you&#8217;ll create an iPhone app, so we&#8217;ll focus on that layout. The iPhone app will consist of two &#8220;views&#8221;. The first view will let you enter the JSON Feed URL and then display the article titles. When you click on an article, the second view will appear displaying the article content.</p>
<p>By default Xojo created your project with the first view, called View1. You&#8217;ll want to drag three controls to this view: a TextField, a Button and a Table. Arrange them to look like this:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2880" src="https://blog.xojo.com/wp-content/uploads/2017/05/2017-05-24_15-37-36.png" alt="" width="1340" height="1008" /></p>
<p>Next you&#8217;ll want to set some of the properties for these controls. But first, change the name of View1. Click the Inspector button on the toolbar to show properties and then click anywhere on the View that is not a control. This displays the properties for the view itself.</p>
<p>In the view change these properties:</p>
<ul>
<li>Name: FeedView</li>
<li>NavigationBarVisible: ON</li>
<li>Title: JSON Feed</li>
</ul>
<p>You&#8217;ll next change some properties for each of the controls. Click on the TextField and set these properties:</p>
<ul>
<li>Name: URLField</li>
<li>PlaceHolder: Enter JSON Feed URL</li>
<li>Text: https://daringfireball.net/feeds/json</li>
</ul>
<p>Now click on the Button and change these fields:</p>
<ul>
<li>Name: LoadButton</li>
<li>Caption: Load</li>
</ul>
<p>Lastly, click on the Table and change these fields:</p>
<ul>
<li>Name: FeedTable</li>
</ul>
<p>Lastly, you want to add a non-UI control to the view. This control is what will connect and download the JSON Feed. Click on Library in the toolbar and scroll down to find the control called “Generic Object”. Drag that on to the view layout where it will appear at the Shelf on the bottom. Switch to the Inspector and change these properties:</p>
<ul>
<li>Name: FeedSocket</li>
<li>Super: Xojo.Net.HTTPSocket</li>
</ul>
<p>With this view finished you now need to create the second view. From the Insert button or menu, select &#8220;View&#8221; to add a new view to the project. Click on the view and change these properties (select the Inspector if it is not visible):</p>
<ul>
<li>Name: ArticleView</li>
<li>NavigationBarVisible: ON</li>
</ul>
<p>This view has only a single control on it: HTMLViewer. Drag it onto the view so that it takes up the entire area of the layout like this:</p>
<p>Click on the Inspector to show the properties for the HTMLViewer and change these properties:</p>
<ul>
<li>Name: ArticleViewer</li>
</ul>
<p>With the two views done, you can now move on to adding code.</p>
<h2>Adding Code</h2>
<p>Now it’s time to add the code. Start by double-clicking on the button FeedView. This displays the Event Handler window. Click on Action and select OK. You are now looking at a blank <a href="http://developer.xojo.com/userguide/code-editor">Code Editor</a>. The code you put here runs when the button is tapped. Your code needs to tell the FeedSocket to get the JSON feed for the URL entered in the TextField. This is the code to do that:</p>
<pre>FeedSocket.Send("GET", URLField.Text)</pre>
<p>Next you need to put code in FeedSocket to parse the JSON Feed that gets returned. Double-click FeedSocket to display the Event Handler window, select PageReceived and click OK. The code below <a href="http://developer.xojo.com/xojo-core-textencoding$ConvertDataToText">converts the JSON from binary data to Text</a>, then <a href="http://developer.xojo.com/xojo-data$ParseJSON">parses the JSON in the Text to get a Dictionary</a>. From the <a href="http://developer.xojo.com/xojo-core-dictionary">Dictionary</a> you can get the array of articles in the JSON (called items), loop through them and add them to the table.</p>
<pre>If HTTPStatus = 200 Then
  Dim jsonText As Text = Xojo.Core.TextEncoding.UTF8.ConvertDataToText(Content)
  Dim jsonDict As Xojo.Core.Dictionary = Xojo.Data.ParseJSON(jsonText)
 
  FeedTable.RemoveAll
 
  // Display the feed title
  Self.Title = jsonDict.Value("title")
 
  // Display the feed articles
  FeedTable.AddSection("")
  Dim items() As Auto = jsonDict.Value("items")
  For Each article As Xojo.Core.Dictionary In items
    Dim title As Text = article.Value("title")
    Dim pubDate As Text = article.Value("date_published")
 
    // Create cell with values and content in the Tag
    Dim cell As iOSTableCellData = FeedTable.CreateCell
    cell.Text = title
    cell.DetailText = pubDate
    cell.Tag = article.Value("content_html")
    FeedTable.AddRow(0, cell)
  Next
End If</pre>
<p>The next bit of code displays the content for the selected article. Double-click the FeedTable control and in the Event Handler window choose Action and press OK. This is the event that is called when you tap on a row in the list. In the Code Editor add this code to get the article content (that was previously saved in the RowTag) and send it to the ArticleView to display there:</p>
<pre>Dim content As Text = Me.RowData(section, row).Tag

Dim v As New ArticleView
v.SetContent(content)
PushTo(v)</pre>
<p>The final code is the SetContent method on ArticleView (called by the code above) that takes the content and prepares it to display in the ArticleViewer. Select ArticleView and create a new method by clicking the &#8220;+&#8221; button on the command bar and choosing Method. Set these properties in the Inspector for the method:</p>
<ul>
<li>Method Name: SetContent</li>
<li>Parameters: content As Text</li>
</ul>
<p>This is the code to put in the method:</p>
<pre>// Save content to a file
Dim articleFile As FolderItem = SpecialFolder.Documents.Child("article.html")
Dim output As TextOutputStream
output = TextOutputStream.Create(articleFile, TextEncoding.UTF16)
output.Write(content)
output.Close

// Display the file
ArticleViewer.LoadURL(articleFile.URLPath)</pre>
<p>Since the HTMLViewer can only display content from a URL, the code first saves the content to a file in the app&#8217;s private Documents folder and then tells the ArticleView to load the file using its URLPath.</p>
<h2>Testing</h2>
<p>You can run the project to test it out. If you don&#8217;t already have it, you&#8217;ll need to first install Xcode so that you have the iOS Simulator. With Xcode installed you can click the Run button on the Xojo toolbar which builds your iOS app and launches it in the iOS Simulator.</p>
<p>Click the Load button to load the feed&#8230;wait. It didn&#8217;t show anything did it?</p>
<p>It turns out that the Daring Fireball site <a href="https://twitter.com/gruber/status/867194244276129792">does not yet have TLSv1.2 enabled</a>, which iOS requires by default to access web sites. I checked with <a href="https://twitter.com/gruber/status/867194443396501505">John Gruber and he said he&#8217;s been planning a server upgrade</a>, but until he does so we have to tell iOS to accept a lower level of security for this web site.</p>
<p>Anyway, quit the iOS Simulator for now.</p>
<p>To change security settings, create a text file (using your favorite text editor) and name it Info.plist. This is the contents of the plist file:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
  &lt;dict&gt;
    &lt;key&gt;NSExceptionDomains&lt;/key&gt;
    &lt;dict&gt;
      &lt;key&gt;daringfireball.net&lt;/key&gt;
      &lt;dict&gt;
        &lt;key&gt;NSIncludesSubdomains&lt;/key&gt;
        &lt;true/&gt;
        &lt;key&gt;NSTemporaryExceptionAllowsInsecureHTTPLoads&lt;/key&gt;
        &lt;true/&gt;
        &lt;key&gt;NSTemporaryExceptionMinimumTLSVersion&lt;/key&gt;
        &lt;string&gt;TLSv1.0&lt;/string&gt;
        &lt;key&gt;NSTemporaryExceptionRequiresForwardSecrecy&lt;/key&gt;
        &lt;false/&gt;
      &lt;/dict&gt;
    &lt;/dict&gt;
  &lt;/dict&gt;
&lt;/dict&gt;
&lt;/plist&gt;</pre>
<p>Now drag the text file to your Xojo JSONFeed project so that it can be incorporated into the app when it gets built.</p>
<p>You can now Run the JSONFeed project again. This time when you click the Load button you&#8217;ll see a list of the current Daring Fireball articles. Tap on one of the posts and a new view with the content appears. Tap the Back button to go back to the list of articles.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2877" src="https://blog.xojo.com/wp-content/uploads/2017/05/2017-05-24_15-33-25.png" alt="" width="320" height="568" /><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2878" src="https://blog.xojo.com/wp-content/uploads/2017/05/2017-05-24_15-34-32.png" alt="" width="320" height="568" /></p>
<p>Related posts: <a href="https://blog.xojo.com/2017/05/30/json-feed-web-app/">JSON Feed Web App</a> and <a href="https://blog.xojo.com/2017/06/01/json-feed-desktop-app/">JSON Feed Desktop App</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Ultimate Password Solution</title>
		<link>https://blog.xojo.com/2017/05/04/the-ultimate-password-solution/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 04 May 2017 12:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Passwords]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/08/18/the-ultimate-password-solution/</guid>

					<description><![CDATA[What if websites required that users use the secure passwords it generated for you? Removing the user's ability to choose their own password may seem draconian, but it would be the ultimate password solution.]]></description>
										<content:encoded><![CDATA[<p><a href="https://passwordday.org">World Password Day</a> brings attention to some simple steps everyone can take to secure their digital life: 1. Create Strong Passwords, 2. Use a different password for each account, and 3. Get a password manager, no, not a post-it note in your desk drawer!</p>
<p>The best password is one that is diffcult to guess. But difficult to guess takes on a new meaning when hackers use computers to do the guessing. Hence, the best password becomes one that would take a computer so long to guess that it&#8217;s not practical to do so. That means a long series of random characters and the longer and more random, the better, and a different password for every site you use.</p>
<p><span id="more-250"></span></p>
<h3><strong>Make Your Passwords Strong and Long</strong></h3>
<p>If every password you created was different set of 100 randomly-selected characters, breaking into an account would be close to impossible for a hacker. The lower-half of the ASCII character set (the most commonly used characters) is 128 characters. The number of possible passwords for a 100 character password made from randomly-selected, lower-ASCII characters would be 100 to the 128th power. That number is so large that it would take the typical PC years to find a match. But again, the problem is that users can&#8217;t even remember a handful of <em>meaningful</em> passwords just 10 characters long. If the average person has 50 things in their life that each need a password, how do we get them to remember 50 unique, <em>random</em> 100 character passwords? We don&#8217;t.</p>
<p>Password manager software such as the Keychain on OS X, <a title="1Password" href="http://www.1Password.com" target="_blank" rel="noopener noreferrer">1Password</a>, or <a title="Roboform" href="http://www.roboform.com" target="_blank" rel="noopener noreferrer">Roboform</a> that can generate these types of passwords and store them securely on the user&#8217;s device. The long, unique and random passwords can then be entered automatically so the user doesn&#8217;t have to remember them or deal with them. How do we get people to use a password database? Easy &#8211;</p>
<h3>We don&#8217;t allow people to choose their passwords.</h3>
<p><img loading="lazy" decoding="async" class="size-medium aligncenter" src="https://media.giphy.com/media/cnQn0eeU9dmZW/giphy.gif" width="450" height="252" /></p>
<p>Stick with me here. Imagine if websites and applications that required passwords generated the them for you rather than allowing you to choose one? Hello Mr. Perlman, your password is:</p>
<p>KÂs-&amp;DÂbu^ÂF|ÂUÂÂ]qÂÂÂÂ95ÂÂÂIkKXjoÂ;O6ÂuÂÂRUÂdÂ!AUÂx(IÂwÂÂ~ÂYlÂF Â#ÂÂÂÂ:8?LD$Â5tfK%P.VbT9HQi%Y[Â7a</p>
<p>You would have no choice but to use a password database to keep track of them. Now this might seem a bit extreme. However, requiring a password at all seemed extreme when we first started on the web. <strong>If websites and software applications generated the passwords at random, people would have no choice but to use a password database. It&#8217;s the login equivilent of a seatbelt law.</strong></p>
<p>In this scenario, programs written by hackers to guess passwords become obsolete. Now you might say that the hackers will just turn their attention to hacking your password database. That&#8217;s true but that&#8217;s a much bigger problem for the hacker. They don&#8217;t want <em>your</em> credit card number. They want <em>thousands</em> of credit card numbers. Getting them one at a time, person by person, is totally impractical.</p>
<p>We&#8217;ve blogged<a href="http://blog.xojo.com/2015/10/09/tips-dealing-with-the-problem-of-passwords/"> about web security and passwords before</a>. Well-designed websites don&#8217;t store your password, they store a <a href="https://en.wikipedia.org/wiki/Cryptographic_hash_function">hash</a> of your password. When you attempt to login, they hash the password you type and compare it to the hash of the password in their database. If the two match, the site knows only that that they matched. The website still does not know your password, even if that website generated your password, because it shouldn&#8217;t be storing it. That&#8217;s what we do with user accounts at Xojo.</p>
<h3><strong>What would be required to implement such a thing?</strong></h3>
<p>First, websites and applications need to allow longer passwords. Passwords are usually stored in a database field so changing the field to allow a 100 character password is two seconds work. Next, you need to write the code to generate the random passwords. In Xojo, that code is a trival 5 lines. Ideally, the code creating the password could pass the password back to the user&#8217;s device securely so that it could be automatically stored in their password database without the user having to be involved.</p>
<p><strong>Removing the user&#8217;s ability to choose their own password may seem draconian, but it would be the ultimate password solution.</strong> Existing password databases can be made to interact seemlessly with websites to store new passwords and pass them back when needed. Of course, websites need to be properly written to be secure and hosted in secure facilities. But the great thing about this solutions is that instead of hackers having to target 100,000 servers with valuable data on them, they have to attack potentially hundreds of millions of devices which is totally impractical.</p>
<p>And exactly how long would it take for a PC to crack that 100 character password I suggested above?</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2639" src="https://blog.xojo.com/wp-content/uploads/2015/08/WPD16-GIF-Passwords102-1.gif" alt="" width="734" height="362" /></p>
<p>According to <a href="https://howsecureismypassword.net">HowSecureIsMyPassword.net</a>, it would take 69,003 NONAGINTILLION years to crack your password. I&#8217;m quite certain it&#8217;s long enough.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>There&#8217;s No Excuse For Storing Passwords</title>
		<link>https://blog.xojo.com/2017/05/04/theres-no-excuse-for-stolen-passwords/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 04 May 2017 06:00:00 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Passwords]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2014/08/06/theres-no-excuse-for-stolen-passwords/</guid>

					<description><![CDATA[There's really no excuse for a website to store your password - ever. If a website uses a good hashing algorithm, it's completely impractical to decrypt the hash back to the original password. ]]></description>
										<content:encoded><![CDATA[<p>A few years ago it was <a title="CNN: 1.2 billion stolen passwords" href="http://money.cnn.com/2014/08/05/technology/security/russian-hackers-theft/index.html?hpt=hp_t1" target="_blank" rel="noopener noreferrer">reported</a> that Russian hackers had stolen 1.2 billion usernames and passwords from a variety of websites. This was only possible because those websites were storing the actual password. Because it&#8217;s <a href="https://passwordday.org">World Password Day</a> and because this is web security 101, let&#8217;s discuss why there&#8217;s really no excuse for a website to store your password &#8211; ever.</p>
<p><span id="more-252"></span></p>
<p>A website that has a login only needs to store a <a title="Cryptographic Hash Function" href="http://en.wikipedia.org/wiki/Cryptographic_hash_function" target="_blank" rel="noopener noreferrer">hash</a> of your password after you create your account (or change your password). There is never a need to store the password itself. Hashing is one-way encryption. <strong>If a website uses a good hashing algorithm, it&#8217;s completely impractical to decrypt the hash back to the original password.</strong> When you go to login to a website, the site will take the password you just entered, hash it and compare that hash to the hash created when you created your login (or last changed your password). If they match, it knows the passwords that were used to create both hashes are the same but it still doesn&#8217;t ever need to know the password itself.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2621" src="https://blog.xojo.com/wp-content/uploads/2014/08/password.png" alt="" width="500" height="326" /></p>
<p>We&#8217;ve <a href="http://blog.xojo.com/2015/10/09/tips-dealing-with-the-problem-of-passwords/">blogged before</a> about how to securely handle passwords in app development. There are simple techniques that make it easy to disassociate the password hash from the user. That way if a hacker got your database, got all the hashes and was willing to put the <em>enormous</em> computing resources into decrypting a specific hash for a specific user, it still would not matter because they wouldn&#8217;t know which hash belonged to which user.</p>
<p>Anyone responsible for the security of a website should know all this. <strong>This is web security 101.</strong> While the identities of these websites were not made public, you can bet they were sites with a lot of users. It&#8217;s hard to believe that sites with large numbers of users wouldn&#8217;t be doing these security basics.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>App Transport Security for iOS</title>
		<link>https://blog.xojo.com/2016/07/27/app-transport-security-for-ios/</link>
					<comments>https://blog.xojo.com/2016/07/27/app-transport-security-for-ios/#comments</comments>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 27 Jul 2016 07:10:36 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1440</guid>

					<description><![CDATA[Last year with iOS 9, Apple announced a new security requirement for your iOS and OS X apps: App Transport Security. From Apple&#8217;s docs: Starting in&#8230;]]></description>
										<content:encoded><![CDATA[<p>Last year with iOS 9, Apple announced a new security requirement for your iOS and OS X apps: <a href="https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html">App Transport Security</a>.</p>
<p>From <a href="https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33">Apple&#8217;s docs</a>:</p>
<blockquote><p>Starting in iOS 9.0 and OS X v10.11, a new security feature called App Transport Security (ATS) is available to apps and is enabled by default. It improves the privacy and data integrity of connections between an app and web services by enforcing additional security requirements for HTTP-based networking requests. Specifically, with ATS enabled, HTTP connections must use HTTPS (RFC 2818). Attempts to connect using insecure HTTP fail. Furthermore, HTTPS requests must use best practices for secure communications.</p></blockquote>
<p>Starting with Xojo 2016 Release 2, this change matters to you because Xojo is now using the updated Apple libraries that have this requirement. Simply stated, it means that if your iOS apps use HTTPSocket or iOSHTMLViewer, then your URLs have to be secure (https). If they are not, you will get an error returned with HTTPSocket and no page displayed in the HTMLViewer.</p>
<p>If you are relying on other services or URLs that do not yet support https, then what do you do? Apple has provided a workaround: you have to specify an exemption in your plist file. In the plist you identify specific URLs for which you want to allow unsecured connections. To do this, create a text file called Info.plist, add this content to it and drag the file to the Navigator to add it to your project:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
  &lt;dict&gt;
    &lt;key&gt;NSExceptionDomains&lt;/key&gt;
    &lt;dict&gt;
      &lt;key&gt;firstsite.com&lt;/key&gt;
      &lt;dict&gt;
        &lt;key&gt;NSIncludesSubdomains&lt;/key&gt;
        &lt;true/&gt;
        &lt;key&gt;NSTemporaryExceptionAllowsInsecureHTTPLoads&lt;/key&gt;
        &lt;true/&gt;
      &lt;/dict&gt;
      &lt;key&gt;secondsite.com&lt;/key&gt;
      &lt;dict&gt;
        &lt;key&gt;NSIncludesSubdomains&lt;/key&gt;
        &lt;true/&gt;
        &lt;key&gt;NSTemporaryExceptionAllowsInsecureHTTPLoads&lt;/key&gt;
        &lt;true/&gt;
      &lt;/dict&gt;
    &lt;/dict&gt;
  &lt;/dict&gt;
&lt;/dict&gt;
&lt;/plist&gt;</pre>
<p>Replace the domain names (or add more) based on your needs. You can also allow all unsecured connections, but Apple may reject App Store submissions that use this without valid reasons:</p>
<pre>&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
  &lt;!-- Include to allow all connections; avoid if possible --&gt;
  &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;
  &lt;true/&gt;
&lt;/dict&gt;</pre>
<p>For additional information, refer to the <a href="http://documentation.xojo.com/topics/application_structure/mobile/using_a_plist.html">Using a plist</a>, <a href="http://documentation.xojo.com/api/deprecated/xojo.net.httpsocket.html">Xojo.Net.HTTPSocket</a> and <a href="http://documentation.xojo.com/api/deprecated/ioshtmlviewer.html">iOSHTMLViewer</a> pages in the docs.</p>
<p>Update (August 10, 2016): Apparently there is a <a href="https://forums.developer.apple.com/thread/6205">bug in iOS</a> that prevents the use of IP addresses in this plist. So to enable http on your local computer for testing use &#8220;localhost&#8221; rather than &#8220;127.0.0.1&#8221; and be sure to use &#8220;http://localhost&#8221; in your URLs instead of &#8220;http://127.0.0.1&#8221;.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.xojo.com/2016/07/27/app-transport-security-for-ios/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>If Smartphone Encryption Is A Red Herring, How Do We Track The Bad Guys?</title>
		<link>https://blog.xojo.com/2016/02/04/if-smartphone-encryption-is-a-red-herring-how-do-we-track-the-bad-guys/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 04 Feb 2016 00:00:00 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2016/02/04/if-smartphone-encryption-is-a-red-herring-how-do-we-track-the-bad-guys/</guid>

					<description><![CDATA[Smartphone Encryption is a Red Herring, but the Good Guys have other options. We don't need universal back doors.]]></description>
										<content:encoded><![CDATA[<p>In the blog post <a href="http://blog.xojo.com/2016/01/27/smartphone-encryption-is-a-red-herring/">Smartphone Encryption is a Red Herring</a>, I pointed out the folly of requiring an encryption back door for the Good Guys to use. So the question arises- &#8220;What <em>can</em> be done? If we don&#8217;t want a global encryption back door that can be used by anyone, can we still track the Bad Guys?&#8221;</p>
<p>The answer is yes. There are plenty of options that don&#8217;t require a global back door. I&#8217;m not passing judgment on whether these are inherently good or bad options, just that they are available when there is a reason to track a Bad Guy.<br />
<span id="more-285"></span></p>
<p><strong>Keyloggers</strong><br />
A <a href="https://en.wikipedia.org/wiki/Keystroke_logging" target="_blank" rel="noopener">keylogger</a> is used to track everything someone types. They come in both software and hardware varieties. Once installed, they can provide regular data about passwords and other communications the Bad Guy is making. Some store the data for later retrieval, while others broadcast it on a regular basis. They exist in varieties for both computers and cell phones.</p>
<p><img loading="lazy" decoding="async" style="display: block; margin-left: auto; margin-right: auto;" title="keyboard.png" src="https://blog.xojo.com/wp-content/uploads/2016/02/keyboard.pngt1466486449161ampwidth424ampheight322" sizes="auto, (max-width: 424px) 100vw, 424px" alt="keyboard.png" width="424" height="322" /><br />
<strong>Online Man in the Middle</strong><br />
With proper authorization, the Good Guys <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack" target="_blank" rel="noopener">can stand between</a> the Bad Guys and common online services they might be using. Working with their internet provider, they can gather data similar to keyloggers by intercepting and relaying data back and forth.</p>
<p><strong>Digital Evidence Collection</strong><br />
When a warrant is served and computers or mobile devices are retrieved for analysis, gathering evidence quickly is paramount. The Bad Guys may have countermeasures installed on their devices, so being able to copy data from hard drives and other storage mediums across platforms while they are still online is important. Once images of the data are created, the evidence can be safely analyzed without being concerned about time bombs or other countermeasures. Xojo has been used to create tools that are used for both digital evidence collection and analysis. Being a cross platform tool is a particular advantage in this scenario.</p>
<p>None of the above options require a global back door, and they can all be limited to just the Bad Guys in question when surveillance is warranted. A <a href="https://www.onthewire.io/harvard-study-questions-going-dark-crypto-problem/" target="_blank" rel="noopener">recently released Harvard study</a> has similar findings. Some options are better than others depending on the region in the world and the technical prowess of the Bad Guys. <a href="../../../com/xojo/blog/smartphone-encryption-is-a-red-herring.html" target="_blank" rel="noopener">Smartphone Encryption is a Red Herring</a>, but the Good Guys have other options. We don&#8217;t need universal back doors.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Smartphone Encryption is a Red Herring</title>
		<link>https://blog.xojo.com/2016/01/27/smartphone-encryption-is-a-red-herring/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 27 Jan 2016 00:00:00 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2016/01/27/smartphone-encryption-is-a-red-herring/</guid>

					<description><![CDATA[Encryption Red Herring: Proposed AES encryption backdoor will not work but will create an exponentially greater problem for everyone but the bad guys.]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" style="width: 320px; margin: 0px 10px 10px 0px; float: left;" title="EnigmaMachine.png" src="https://blog.xojo.com/wp-content/uploads/2016/01/EnigmaMachine.pngt1466486449161ampwidth320" sizes="(max-width: 320px) 100vw, 320px" alt="EnigmaMachine.png" width="320" data-constrained="true" />As the Founder and CEO of a <a href="https://xojo.com/" target="_blank" rel="noopener">software company</a> that makes a development tool for mobile platforms, as well as for desktop and web, I have a lot of experience with encryption. The current controversy over encryption is really important to me. During World War II, the Germans created a way of sending encrypted messages to commanders in the field. The device came to be known as an <a href="https://en.wikipedia.org/wiki/Enigma_machine" target="_blank" rel="noopener">Engima machine</a>. It looked like a typewriter but had an encryption key that changed a message into unreadable noise. That message could only be decoded if you knew the key used to encrypt it. The Allies worked very hard to get their hands on one of these devices so they could learn how it works and be able to decrypt the messages and know what the German military plans. Ultimately the Allies figured it out and it helped them win the war. If this has peaked your curiosity, check out the movie <a href="http://www.imdb.com/title/tt0141926/?ref_=nv_sr_1" target="_blank" rel="noopener">U-571</a> (a fictional account of the effort to obtain an Enigma machine) and <a href="http://www.imdb.com/title/tt2084970/" target="_blank" rel="noopener">The Imitation Game</a> about the team that figured out the encryption key.</p>
<p><span id="more-319"></span></p>
<p>Today, terrorists are using encryption to hide their communications just like the Nazis did in WWII. What makes encryption different today is that it is also being used by millions of ordinary people, many of whom have no idea they are even using it. Almost every smartphone in use today, encrypts text messages and other data automatically. This is all done behind the scenes without the user ever being aware of it.</p>
<p style="text-align: left;">The type of encryption used on the iPhone and Android is called <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank" rel="noopener">AES</a> and it&#8217;s formidable. Intercepting your text messages isn&#8217;t actually difficult but decrypting those messages is, at best, impractical. To decrypt a message, just like with the Enigma machine, you need to know the key that was used to encrypt it. If you don&#8217;t have that key, you&#8217;d have to guess at what the key might be then look at the results of decrypting the message with that key to see if you have anything but unintelligible gibberish. Even with access to the fastest computers in the world, it could literally take years to guess the right key. It will come as no surprise that governments at almost every level don&#8217;t like this one bit. At their most transparent, they are used to getting a search warrant and being able to look at whatever you&#8217;ve got to see if it supports their suspicion that you are in fact up to no good. At their least, they wish to get on your phone (ideally from a secure, remote location) and take your data without a warrant or you having any idea they were ever there. The problem for governments is that they can&#8217;t. In Apple&#8217;s case, even if Apple was willing to compile with a request that they decrypt the data on your phone, they can&#8217;t. The key is stored on your phone in a way that even Apple can&#8217;t get to it. In this sense, Apple is in complete alignment with you in terms of your privacy.</p>
<p><img loading="lazy" decoding="async" style="display: block; margin-left: auto; margin-right: auto;" title="red_herring.png" src="https://blog.xojo.com/wp-content/uploads/2016/01/red_herring.pngt1466486449161ampwidth321ampheight225" sizes="auto, (max-width: 321px) 100vw, 321px" alt="red_herring.png" width="321" height="225" /></p>
<p>There are lawmakers here in the United States that want to force companies like Apple and Google to provide a <em>back door</em>. This would be a way for Apple to get into your data should a search warrant (presumably) be issued. Apple&#8217;s CEO Tim Cook as <a href="http://www.theguardian.com/technology/2016/jan/13/apple-tim-cook-us-government-encryption" target="_blank" rel="noopener">pointed out</a> what a <a href="http://techcrunch.com/2015/06/02/apples-tim-cook-delivers-blistering-speech-on-encryption-privacy/" target="_blank" rel="noopener">bad idea</a> this is. <strong>Back doors don&#8217;t get used by just the good guys.</strong> They will get used by the bad guys as well. In an effort to make it possible for law enforcement to get at the data of the tiny percentage of the population that is doing wrong, we would be opening everyone up to being hacked remotely. It&#8217;s not possible to make a back door that only the good guys can use. Think about your contacts, text messages, email, photos, all being exposed. Just the increased level of extortion alone would be so bad that your smartphone would go back to being useful as nothing more than a phone. Do any of you really want to go back to the 1980s?</p>
<p>What is worse than that, however, is <strong>what is not being talked about in the news</strong>. Smartphone encryption is a <a href="https://en.wikipedia.org/wiki/Red_herring" target="_blank" rel="noopener">red herring</a>. A back door wouldn&#8217;t solve the problem. Bad guys would simply write their own apps to encrypt the data themselves before they send it. This is incredibly easy to do. <a href="http://www.xojo.com" target="_blank" rel="noopener">Xojo</a>, the development tool my company created, has this same type of AES encryption built-in. Many other development tools have it as well. I could write an app to encrypt a message in a few minutes. Even if you have never written a line of code in your life, after a few hours learning Xojo, you could write the same app yourself. <strong>If you or I can do it, the bad guys can too.</strong> The smartest of them are almost certainly <em>already</em> doing this today. The end result would be that every law-abiding citizen&#8217;s personal and private data would become hackable- causing a digital tsunami of cybercrime that would be impossible for law enforcement to stop while achieving next to nothing towards actual security.</p>
<p><img decoding="async" style="width: 320px; margin: 10px auto; display: block;" title="edited_lock_and_code.png" src="https://blog.xojo.com/wp-content/uploads/2016/01/edited_lock_and_code.pngt1466486449161ampwidth320" sizes="(max-width: 320px) 100vw, 320px" alt="edited_lock_and_code.png" width="320" data-constrained="true" />I understand why our lawmakers and law enforcement are concerned about encryption. It is a barrier to evidence for them. Tim Cook has argued that we have to balance law enforcement with our personal privacy. That&#8217;s certainly true. However, in this case, you don&#8217;t even have to go that far. <strong>What our elected officials are proposing will not work and will only create an exponentially greater problem.</strong> You may be asking yourself, &#8220;Surely they have thought of this, right?&#8221; Clearly they haven&#8217;t. Too often people make decisions without complete information or having taken sufficient time to to think the matter through. We have all seen this many times in our lives. Smartphone encryption is just the latest example. It&#8217;s not the first and won&#8217;t be the last. I&#8217;m all for looking for better ways to catch the bad guys but smartphone back doors <strong>will not work</strong>. Your elected officials are wasting your precious taxpayer dollars. If you want to stop this, contact them and ask them to better educate themselves on this topic. You can point them to this blog post to start. I can&#8217;t speak for countries outside the United States, but here elected officials give considerable weight to their constituents that reach out to them. You can contact your Representatives in the House <a href="http://www.house.gov/representatives/" target="_blank" rel="noopener">here</a> and your Senators <a href="http://www.senate.gov/senators/contact/" target="_blank" rel="noopener">here</a>.</p>
<p>Lastly, while I am proud of Tim Cook for fighting back on this issue, it saddens me that he appears alone on the world stage while doing this. Powerful people in technology such as Mark Zukerberg of Facebook, Larry Page and Sergey Brin of Google, Satya Nadella of Microsoft and others should be taking an equal stand. They are in an even better position than we are as individuals to make it clear that the proposed solution won&#8217;t work. Until then, contact your elected officials and tell them that dog won&#8217;t hunt.</p>
<p style="text-align: center;"><span id="hs-cta-wrapper-2f9a74a4-35c0-4f3d-b3d0-101223008c8b" class="hs-cta-wrapper"><span id="hs-cta-2f9a74a4-35c0-4f3d-b3d0-101223008c8b" class="hs-cta-node hs-cta-2f9a74a4-35c0-4f3d-b3d0-101223008c8b"> <!-- [if lte IE 8]></p>





<div id="hs-cta-ie-element"></div>


<![endif]--> <a href="http://blog.xojo.com/2016/02/04/if-smartphone-encryption-is-a-red-herring-how-do-we-track-the-bad-guys/" target="_blank" rel="noopener"><img loading="lazy" decoding="async" id="hs-cta-img-2f9a74a4-35c0-4f3d-b3d0-101223008c8b" class="hs-cta-img aligncenter" style="border-width: 0px;" src="https://blog.xojo.com/wp-content/uploads/2013/08/2f9a74a4-35c0-4f3d-b3d0-101223008c8b.png" alt="Security: How to Track The Bad Guys" width="384" height="64" /></a></span></span><br />
<!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
