<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Everything You Need To Know About Registration Systems</title>
	<atom:link href="http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/feed/" rel="self" type="application/rss+xml" />
	<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/</link>
	<description>The schedule: 8 days.  The budget: $60.  The results: read on.</description>
	<pubDate>Sat, 19 Jul 2008 23:10:10 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
		<item>
		<title>By: joske vermeulen</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-62930</link>
		<dc:creator>joske vermeulen</dc:creator>
		<pubDate>Mon, 10 Mar 2008 15:36:23 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-62930</guid>
		<description>Typo police alert: 4th paragraph: "If you will permit be " -&#62; "If you will permit me ".

Anyway, Justin: you are right. What Patrick means (I think :) ) is to use a signature and to check that signature with the public key. I'm also not quite sure why you'd need to use a hash of the identifying data or the relevance of the md5 remark. As far as I can tell (and how I've implemented it  :) ) it's enough to make a signature of the username and any eventual other identifying information. You then check the signature with the public key which you've embedded in your application.</description>
		<content:encoded><![CDATA[<p>Typo police alert: 4th paragraph: &#8220;If you will permit be &#8221; -&gt; &#8220;If you will permit me &#8220;.</p>
<p>Anyway, Justin: you are right. What Patrick means (I think <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) is to use a signature and to check that signature with the public key. I&#8217;m also not quite sure why you&#8217;d need to use a hash of the identifying data or the relevance of the md5 remark. As far as I can tell (and how I&#8217;ve implemented it  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) it&#8217;s enough to make a signature of the username and any eventual other identifying information. You then check the signature with the public key which you&#8217;ve embedded in your application.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Justin</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-58725</link>
		<dc:creator>Justin</dc:creator>
		<pubDate>Mon, 03 Dec 2007 20:30:31 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-58725</guid>
		<description>I'm not sure the public key encryption method works. You say to guard the private key with your life but in the next paragraph say that your software "decrypts the serial number" which requires use of the private key. a hacker look in the code to determine the encryption key and generate their own forged product key by encrypting it with the same key used for decryption. it seems that any symmetric encyrption algorithm could work just as well. another simpler approach is using a hash function in the code and making the product key = [unhashedportion]+[hash]. if the user types a product key where the second part is not the hash of the first part you know it is invalid. in other words, the approach described here is security by obscurity, and there are simpler methods than symmetric encryption to accomplish that.

i think only assymetric cryptography SIGNATURES can prevent forged license codes. the license code should be digitally signed (not encrypted) by the software publisher using a private secret key. then the software embeds the public key and verifies the signature. inspecting the code won't help hackers because they'll only find the public key there, and that is not enough to generate a signature. in other words, the product key becomes [serialNumCapabilities]+[SignatureOfPrevious]. the problem is that an RSA 512 bit key signature is 103 base32 characters, which is cumbersome for the user to type in.</description>
		<content:encoded><![CDATA[<p>I&#8217;m not sure the public key encryption method works. You say to guard the private key with your life but in the next paragraph say that your software &#8220;decrypts the serial number&#8221; which requires use of the private key. a hacker look in the code to determine the encryption key and generate their own forged product key by encrypting it with the same key used for decryption. it seems that any symmetric encyrption algorithm could work just as well. another simpler approach is using a hash function in the code and making the product key = [unhashedportion]+[hash]. if the user types a product key where the second part is not the hash of the first part you know it is invalid. in other words, the approach described here is security by obscurity, and there are simpler methods than symmetric encryption to accomplish that.</p>
<p>i think only assymetric cryptography SIGNATURES can prevent forged license codes. the license code should be digitally signed (not encrypted) by the software publisher using a private secret key. then the software embeds the public key and verifies the signature. inspecting the code won&#8217;t help hackers because they&#8217;ll only find the public key there, and that is not enough to generate a signature. in other words, the product key becomes [serialNumCapabilities]+[SignatureOfPrevious]. the problem is that an RSA 512 bit key signature is 103 base32 characters, which is cumbersome for the user to type in.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Clay Dowling</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-55820</link>
		<dc:creator>Clay Dowling</dc:creator>
		<pubDate>Fri, 12 Oct 2007 13:51:23 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-55820</guid>
		<description>Patrick,

Just wanted to say that this is a very good article and covers a lot of stuff that people need to know.  It should probably be listed on the BoS wiki.  I wrote my own registration component using a symmetric encryption technique rather than the asymmetric method of public key encryption, which seems sufficient unto my needs.  I wrote the article up here: http://www.lazarusid.com/how-lazarus-registration-works.html</description>
		<content:encoded><![CDATA[<p>Patrick,</p>
<p>Just wanted to say that this is a very good article and covers a lot of stuff that people need to know.  It should probably be listed on the BoS wiki.  I wrote my own registration component using a symmetric encryption technique rather than the asymmetric method of public key encryption, which seems sufficient unto my needs.  I wrote the article up here: <a href="http://www.lazarusid.com/how-lazarus-registration-works.html" rel="nofollow">http://www.lazarusid.com/how-lazarus-registration-works.html</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tracy</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-55364</link>
		<dc:creator>Tracy</dc:creator>
		<pubDate>Wed, 03 Oct 2007 06:51:07 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-55364</guid>
		<description>Very nice read, something I am thinking about as we are developing a piece of software. Nice to read a blog where the editor has a sense of humour</description>
		<content:encoded><![CDATA[<p>Very nice read, something I am thinking about as we are developing a piece of software. Nice to read a blog where the editor has a sense of humour</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: The Piracy Loss Formula &#124; Flowchart Dude</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-54238</link>
		<dc:creator>The Piracy Loss Formula &#124; Flowchart Dude</dc:creator>
		<pubDate>Thu, 13 Sep 2007 05:07:32 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-54238</guid>
		<description>[...] the correct formula, but also that nascent microISV&#8217;s are better off implementing their own simple licensing system than relying on 3rd party tools with potential side effects.  Give a little link love:These icons [...]</description>
		<content:encoded><![CDATA[<p>[...] the correct formula, but also that nascent microISV&#8217;s are better off implementing their own simple licensing system than relying on 3rd party tools with potential side effects.  Give a little link love:These icons [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Patrick</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-46281</link>
		<dc:creator>Patrick</dc:creator>
		<pubDate>Wed, 04 Jul 2007 13:15:46 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-46281</guid>
		<description>My first answer is "Ignore them, because they'll win anyhow, and if they don't win they'll just download a cracked version of your software".  This remains my best answer.  But if you really want to use your time trying to frustrate a small segment of the non-cooperative population:

But you could save the date of install in the registry somewhere, and leave it after an uninstall.  The only problem with that is folks can easily use software to see exactly what keys your app leaves in the registry, and they can rollback to a "clean" state.  

You can drop a file somewhere on their hard drive -- ditto.  Watch changes to the filesystem, revert them, done.  Or, run the software in a virtual machine.

You can have your application "phone home" on install with a bit of hashed data which is personally identifiable for the computer, like say the hard drive serial number, but these things can be changed at will and phone home schemes WILL annoy honest users.</description>
		<content:encoded><![CDATA[<p>My first answer is &#8220;Ignore them, because they&#8217;ll win anyhow, and if they don&#8217;t win they&#8217;ll just download a cracked version of your software&#8221;.  This remains my best answer.  But if you really want to use your time trying to frustrate a small segment of the non-cooperative population:</p>
<p>But you could save the date of install in the registry somewhere, and leave it after an uninstall.  The only problem with that is folks can easily use software to see exactly what keys your app leaves in the registry, and they can rollback to a &#8220;clean&#8221; state.  </p>
<p>You can drop a file somewhere on their hard drive &#8212; ditto.  Watch changes to the filesystem, revert them, done.  Or, run the software in a virtual machine.</p>
<p>You can have your application &#8220;phone home&#8221; on install with a bit of hashed data which is personally identifiable for the computer, like say the hard drive serial number, but these things can be changed at will and phone home schemes WILL annoy honest users.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jez</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-44795</link>
		<dc:creator>Jez</dc:creator>
		<pubDate>Mon, 18 Jun 2007 16:33:24 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-44795</guid>
		<description>Patrick :

How do you handle the smart user who uninstall the trial version one day before it expires and then reinstall it ?

The Private/Public Key does not solve this problem

On windows do you have to flag something in the registry to handle this ?</description>
		<content:encoded><![CDATA[<p>Patrick :</p>
<p>How do you handle the smart user who uninstall the trial version one day before it expires and then reinstall it ?</p>
<p>The Private/Public Key does not solve this problem</p>
<p>On windows do you have to flag something in the registry to handle this ?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Patrick</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-44666</link>
		<dc:creator>Patrick</dc:creator>
		<pubDate>Sun, 17 Jun 2007 16:56:02 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-44666</guid>
		<description>Congratulations!</description>
		<content:encoded><![CDATA[<p>Congratulations!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Derek Pollard</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-44661</link>
		<dc:creator>Derek Pollard</dc:creator>
		<pubDate>Sun, 17 Jun 2007 16:03:55 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-44661</guid>
		<description>Patrick,
It has been a while, but I'm pleased  to say that I have public key encryption implemented in my registration key system.  Getting it running in Java was easy, then the PHP side wasn't much harder (except that I'm a PHP novice) and once I had figured out how to share the keys it was running.  What a moment that was :-)    Now that is a system that I can just reuse in future versions and products.
Cheers,

Derek.</description>
		<content:encoded><![CDATA[<p>Patrick,<br />
It has been a while, but I&#8217;m pleased  to say that I have public key encryption implemented in my registration key system.  Getting it running in Java was easy, then the PHP side wasn&#8217;t much harder (except that I&#8217;m a PHP novice) and once I had figured out how to share the keys it was running.  What a moment that was <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />    Now that is a system that I can just reuse in future versions and products.<br />
Cheers,</p>
<p>Derek.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Patrick</title>
		<link>http://kalzumeus.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-41101</link>
		<dc:creator>Patrick</dc:creator>
		<pubDate>Thu, 31 May 2007 23:53:23 +0000</pubDate>
		<guid isPermaLink="false">http://microisvjournal.wordpress.com/2006/09/05/everything-you-need-to-know-about-registration-systems/#comment-41101</guid>
		<description>Your public key will be algorithmically generated from your private key.  Since it is embedded in software, no one has to type it in, so it can be as complex as you need it to be.  I'd suggest 256 bits or better.  Your private key, which will never be given to anyone other than yourself, will be the same length.  You can fairly easily generate one of these by taking a strong password and hashing it with MD5 to the appropriate length.</description>
		<content:encoded><![CDATA[<p>Your public key will be algorithmically generated from your private key.  Since it is embedded in software, no one has to type it in, so it can be as complex as you need it to be.  I&#8217;d suggest 256 bits or better.  Your private key, which will never be given to anyone other than yourself, will be the same length.  You can fairly easily generate one of these by taking a strong password and hashing it with MD5 to the appropriate length.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
