<?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>andymadge.com &#187; AndyM</title>
	<atom:link href="http://www.andymadge.com/author/andy/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andymadge.com</link>
	<description>Nothing to see here, move along…</description>
	<lastBuildDate>Sun, 23 Aug 2009 20:37:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Password Salting Techniques</title>
		<link>http://www.andymadge.com/2009/08/password-salting-techniques/</link>
		<comments>http://www.andymadge.com/2009/08/password-salting-techniques/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 18:36:52 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.andymadge.com/?p=163</guid>
		<description><![CDATA[This article is about using salting techniques to improve the security of authentication for websites.  Examples are in PHP but the techniques apply to any language.

Caveat
Before I continue, I just want to make an important point:
The single best piece of advice I can give when building your own authentication system is&#8230;

Don&#8217;t do it.

I don&#8217;t mean [...]]]></description>
			<content:encoded><![CDATA[<p>This article is about using salting techniques to improve the security of authentication for websites.  Examples are in PHP but the techniques apply to any language.<span id="more-163"></span></p>
<blockquote>
<h2>Caveat</h2>
<p>Before I continue, I just want to make an important point:</p>
<p>The single best piece of advice I can give when building your own authentication system is&#8230;</p>
<ul>
<li>Don&#8217;t do it.</li>
</ul>
<p>I don&#8217;t mean don&#8217;t use authentication, what I mean is that cryptographic techniques are complicated.  Actually they&#8217;re extremely complicated.  If you don&#8217;t have years of experience as a cryptographer, you&#8217;re going to make mistakes that will leave security holes.  Guaranteed.</p>
<p>The alternative is to use a well respected authentication framework such as:</p>
<ul>
<li><a href="http://www.openwall.com/phpass/">PHPass</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.auth.html">Zend_Auth</a> (requires Zend Framework)</li>
<li><a href="http://codeigniter.com/wiki/Category:Libraries::Authentication/">CodeIgniter Authentication Libraries</a> (require CodeIgniter)</li>
</ul>
<p><a href="http://www.openwall.com/phpass/"></a>Frameworks such as this are developed by people who really do know what they are doing, and any security holes are generally quickly discovered and plugged.</p>
<p>I&#8217;m certainly no cryptographer, and this article is based on my current understanding.</p>
<p>That said, assuming you&#8217;re going ahead anyway, let&#8217;s get back to the article&#8230;</p></blockquote>
<h2>Attacks</h2>
<p>Lets look at the type of attacks we want to protect against.</p>
<h3>Dictionary</h3>
<p>This involves having a list of common passwords and trying every one in turn.  Most dictionaries would contain millions of possibilities starting with obvious stuff like &#8220;password&#8221;, &#8220;123456&#8243; and more obscure ones such as &#8220;pa$$wOrD&#8221; (<a href="http://en.wikipedia.org/wiki/Dictionary_attack">wikipedia entry</a>)</p>
<h3>Brute Force</h3>
<p>This involves trying every possible password and in theory will always work against any system.  The problem is that it takes a LONG time to do.  As computing speed improves, obviously the time taken reduces.  Since you can&#8217;t make brute force attacks impossible, what you want to achieve is to make them take an infeasibly long time &#8211; like years. (<a href="http://en.wikipedia.org/wiki/Brute_force_attack">wikipedia entry</a>)</p>
<h3>Rainbow Tables</h3>
<p>This is a way of attacking hashed passwords.  The idea is that instead of calculating the hash of each password you want to try, you use a list of pre-calculated hashes, thus saving computation time. (<a href="http://en.wikipedia.org/wiki/Rainbow_table">wikipedia entry</a>)</p>
<p>Bearing those in mind, let&#8217;s look at the different ways you could store the password in your database:</p>
<h2 style="font-size: 1.5em;">Plain Text</h2>
<p>This is a massively bad idea.  If someone gets hold of your database, they know everybody&#8217;s password.</p>
<p>NEVER EVER STORE PASSWORDS AS PLAIN TEXT.  ANYWHERE.  EVER.</p>
<p>One argument against this is &#8220;The spec requires that the password be stored in case someone forgets it.&#8221;  If that&#8217;s the case, then you should use reversible encryption and DON&#8217;T STORE THE ENCRYPTION KEY IN THE DATABASE.</p>
<h2>Hashed Passwords</h2>
<p>A hash is a one-way algorithm that is commonly used in cryptography.  The idea is that there is no way to work backward to find out the password from the hash value.  There are many different hash algorithms, each with their own strengths and weaknesses. (<a href="http://uk3.php.net/manual/en/function.hash-algos.php">list of hash algorithms supported by PHP</a>)</p>
<p>The most commonly used hash functions are MD5 and SHA1:</p>
<pre style="padding-left: 30px; ">$password_hash = MD5( $password );</pre>
<p>Lots of people will tell you that MD5 is sufficient for most uses, others will say that SHA1 is more secure so you should use that instead.</p>
<p>While these are two of the least-secure hashing algorithms, they are still secure enough for any normal website (i.e. not a bank etc.)</p>
<p>Other more secure hash algorithms are SHA256 or Whirlpool, but these have the disadvantage of taking longer to calculate.</p>
<p>So at this point, we&#8217;re recommending:</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$password_hash = SHA1( $password );</pre>
<h3>Vulnerabilities</h3>
<p>Hashed passwords will provide complete protection against dictionary attacks.  They also protect effectively against brute force attacks since the operation would take an infeasibly long time, however they are still vulnerable to rainbow table attacks.</p>
<h2>Salting</h2>
<p><span style="font-weight: normal; font-size: 13px; ">Salting is a technique used to protect hashes against rainbow table attacks.  The idea is that an additional string &#8211; known as &#8217;salt&#8217; &#8211; is introduced into the hash value:</span></p>
<pre style="padding-left: 30px; ">$salt = "abcd";
$password_hash = SHA1( $salt . $password );</pre>
<p>So, if a rainbow table attack is successful, the attacker now still doesn&#8217;t know the password, they know <code>$salt.$password</code>.  In this trivial example, the attacker would soon work out what the salt was &#8211; especially if they break another account &#8211; and then they would know the password.</p>
<p>Let&#8217;s improve the salt&#8230;</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = "<span style="font-family: 'courier new';">ZvmLcZMXw3WIA78uudt9SFysSGocIF</span>";
$password_hash = SHA1( $salt . $password );</pre>
<p>Here we are using a random static string as the salt, which is definitely an improvement, but since the salt is static (i.e. the same for every user) then they still only need to work it out once.  After that, every user&#8217;s account it vulnerable to the same attack.</p>
<p>Note that we could also hash the salt as follows:</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = SHA1( "<span style="font-family: 'courier new';">ZvmLcZMXw3WIA78uudt9SFysSGocIF</span>" );</pre>
<p>However, all this does is increase the computation time without significantly increasing the security.  The attacker only needs to find the value of <code>$salt</code> &#8211; it&#8217;s completely irrelevant how it&#8217;s calculated.</p>
<p>We need to make the salt different for each user.  One way is to use something that will be different for each user.  The most obvious thing is the username (or maybe email):</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$password_hash = SHA1( $username . $password );</pre>
<p>This means that if two people have the same password, they will still have different password hashes.  If an attacker is successful with a rainbow table attack for one account, they know nothing about any of the other accounts on the system.</p>
<p>Better still, lets use a different randomly generated string as the salt for each user.  NOTE: In this case we&#8217;re going to need to store the salt alongside the user in the database otherwise we have no way of checking it.</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = random_string();
$password_hash = SHA1( $salt . $password );</pre>
<p><code>random_string</code> is a function defined elsewhere in your code.  There are good examples <a href="http://stackoverflow.com/questions/48124/generating-pseudorandom-alpha-numeric-strings">here</a> and <a href="http://911-need-code-help.blogspot.com/2009/06/generate-random-strings-using-php.html">here</a>.</p>
<p>Finally, let&#8217;s combine some of the above into our best-yet version:</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = random_string();
$password_hash = SHA1( $salt . MD5($email) . $password );</pre>
<p>I know I said above that there&#8217;s no point in hashing twice, but in this case it does have an effect &#8211; we don&#8217;t want the salting algorithm to be obvious and now password hash doesn&#8217;t contain anything that is recognizable as a word or email address.</p>
<p>It is important thing is that an attacker doesn&#8217;t know exactly how you have introduced the salt.  As a result you need to be careful with Open Source software, since the salting algorithm will be plainly visible in the source code &#8211; although this is mitigated if the salt contains a random string.</p>
<p>There are many different approaches to salting &#8211; this is just one fairly simple version.  For anything that requires a higher level of security, you&#8217;ll need to look at additional techniques.</p>
<p>As I mentioned above, I&#8217;m no security expert and I may have missed something.  If you think so, please let me know in the comment.</p>
<h2>Also&#8230;</h2>
<p>This hasn&#8217;t been the focus of the article but it&#8217;s relevant &#8211; whenever someone creates an account, changes their password or logs in, you&#8217;re going to be sending their password over the internet.  Unless you&#8217;re using HTTPS/SSL, then the password will be sent IN THE CLEAR i.e. as plain text.</p>
<p>Anyone who is listening in with a packet sniffer will be able to see the password so all of your back-end security goes out the window.</p>
<p>You may think &#8220;OK, so I&#8217;ll hash the password at the client using JavaScript before I send it.&#8221;   This actually doesn&#8217;t help at all &#8211; the attacker doesn&#8217;t know the password, but he does know the hash, so he can use a replay attack which in most cases is good enough for their needs.</p>
<p>You can improve the security by using <a href="http://en.wikipedia.org/wiki/Challenge_response">Challenge-Response</a> but the best alternative is to use SSL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2009/08/password-salting-techniques/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Missing tooltips in Firefox 3.5 and IE8</title>
		<link>http://www.andymadge.com/2009/07/missing-tooltips-in-firefox-35-and-ie8/</link>
		<comments>http://www.andymadge.com/2009/07/missing-tooltips-in-firefox-35-and-ie8/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 23:24:37 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://andymadge.com/blog/?p=128</guid>
		<description><![CDATA[I&#8217;ve just upgraded to Firefox 3.5 and noticed that tooltips had stopped working.  I then checked Internet Explorer 8 and found tooltips were not working there either.
On investigation it seems that the two problems were unrelated, but here are the solutions to both of them&#8230;
Firefox 3.5
It seems there&#8217;s a bug in the Google Toolbar which [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just upgraded to Firefox 3.5 and noticed that tooltips had stopped working.  I then checked Internet Explorer 8 and found tooltips were not working there either.</p>
<p>On investigation it seems that the two problems were unrelated, but here are the solutions to both of them&#8230;</p>
<h2>Firefox 3.5</h2>
<p>It seems there&#8217;s a bug in the Google Toolbar which can stop tooltips from working (you just get a small square instead). The fix is to uninstall Google Toolbar, then re-install it.</p>
<h2>Internet Explorer 8</h2>
<p>Bizarrely, this isn&#8217;t a bug.  It&#8217;s a rare occasion when IE does the right thing according to the W3C spec.  Basically, the HTML &#8220;alt&#8221; attribute has long been used to display tooltips over images, where in fact, it&#8217;s only supposed to be shown if the image doesn&#8217;t load.  The correct attribute for displaying tooltips is actually the &#8220;title&#8221; attribute.  Internet Explorer 8 has changed so that it works correctly according to the HTML spec.</p>
<p>What this means is that if a web page has only alt tags then in IE8 normal mode, you won&#8217;t see any tooltips.  If however the page is in IE8 compatibility mode, you <em>will</em> see the tooltips.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2009/07/missing-tooltips-in-firefox-35-and-ie8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Run SysInternals tools direct from the web</title>
		<link>http://www.andymadge.com/2009/01/run-sysinternals-tools-direct-from-the-web/</link>
		<comments>http://www.andymadge.com/2009/01/run-sysinternals-tools-direct-from-the-web/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 17:23:31 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/computers/2009/01/22/run-sysinternals-tools-direct-from-the-web/</guid>
		<description><![CDATA[SysInternals tools are a fantastic set of free utilities written by Mark Russinovich and Bryce Cogswell.  There are invaluable for system admins and Windows Power Users.
There is now a website that allows you to run most of the SysInternals tools directly, so you don&#8217;t have to find the right page, download it and unzip.  You [...]]]></description>
			<content:encoded><![CDATA[<p>SysInternals tools are a fantastic set of free utilities written by <a id="ctl00_mainContentContainer_ctl03" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl03',this);" href="http://blogs.technet.com/markrussinovich/about.aspx">Mark Russinovich</a> and Bryce Cogswell.  There are invaluable for system admins and Windows Power Users.<br />
There is now a website that allows you to run most of the SysInternals tools directly, so you don&#8217;t have to find the right page, download it and unzip.  You just run it directly from:</p>
<p>http://live.sysinternals.com/&lt;tool&gt;.exe</p>
<p>e.g.</p>
<p><a href="http://live.sysinternals.com/procexp.exe" target="_blank">http://live.sysinternals.com/procexp.exe</a></p>
<p>This works better in Internet Explorer than Firefox, since you can run the tool without saving it first.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2009/01/run-sysinternals-tools-direct-from-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOS Equivalent of GREP</title>
		<link>http://www.andymadge.com/2008/09/dos-equivalent-to-grep/</link>
		<comments>http://www.andymadge.com/2008/09/dos-equivalent-to-grep/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 14:40:18 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/uncategorized/2008/09/22/dos-equivalent-to-grep/</guid>
		<description><![CDATA[In Unix you can pipe the output of a command into the GREP command in order to only display the lines that contain a required string.  This is means you don&#8217;t have to scroll through pages of output to find the bit you&#8217;re interested in.  The DOS equivalent of GREP is FIND:
Searches for a text [...]]]></description>
			<content:encoded><![CDATA[<p>In Unix you can pipe the output of a command into the GREP command in order to only display the lines that contain a required string.  This is means you don&#8217;t have to scroll through pages of output to find the bit you&#8217;re interested in.  The DOS equivalent of GREP is FIND:</p>
<pre>Searches for a text string in a file or files.

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

/V         Displays all lines NOT containing the specified string.
/C         Displays only the count of lines containing the string.
/N         Displays line numbers with the displayed lines.
/I         Ignores the case of characters when searching for the string.
/OFF[LINE] Do not skip files with offline attribute set.
"string"   Specifies the text string to find.
[drive:][path]filename
Specifies a file or files to search.

<em>If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.</em></pre>
<p>this can be useful with the netstat command:</p>
<pre>netstat -ano | find /i ":80"</pre>
<p>or when viewing the DNS cache:</p>
<pre>ipconfig /displaydns | find /i "google"</pre>
<p>Although that isn&#8217;t ideal since the output of ipconfig isn&#8217;t really formatted to play nicely with the find command.</p>
<p>Reference: <a href="http://nzpcmad.blogspot.com/2007/07/dos-grep-equivalent-find-command.html">http://nzpcmad.blogspot.com/2007/07/dos-grep-equivalent-find-command.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/09/dos-equivalent-to-grep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows XP DNS Cache</title>
		<link>http://www.andymadge.com/2008/08/windows-xp-dns-cache/</link>
		<comments>http://www.andymadge.com/2008/08/windows-xp-dns-cache/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 10:34:10 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/computers/2008/08/27/windows-xp-dns-cache/</guid>
		<description><![CDATA[Windows caches DNS responses to speed up network access, but sometimes this can cause a problem.  Positive responses (i.e. successful lookups) are cached for 24 hours, and negative responses (i.e. failed lookups) for 5 minutes.
If you make changes to DNS and want to test the results straight away, you need to clear the cache with:
ipconfig [...]]]></description>
			<content:encoded><![CDATA[<p>Windows caches DNS responses to speed up network access, but sometimes this can cause a problem.  Positive responses (i.e. successful lookups) are cached for 24 hours, and negative responses (i.e. failed lookups) for 5 minutes.</p>
<p>If you make changes to DNS and want to test the results straight away, you need to clear the cache with:</p>
<pre>ipconfig /flushdns</pre>
<p>You can view the current cache with:</p>
<pre>ipconfig /displaydns</pre>
<p>or</p>
<pre>ipconfig /displaydns | more</pre>
<p>to see a screen at a time</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/08/windows-xp-dns-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Misc iPhone Tips</title>
		<link>http://www.andymadge.com/2008/07/misc-iphone-tips/</link>
		<comments>http://www.andymadge.com/2008/07/misc-iphone-tips/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 15:40:05 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/mobile-phone/iphone/2008/07/21/misc-iphone-tips/</guid>
		<description><![CDATA[Slow Response, especially in Contacts or Text
Some suggestions from around the web:

It is probably caused by memory leaks in 3rd party apps.  You can close any app by holding Home button for 6 seconds.
iPhone 3G was released with firmware 5a345 but iTunes 7.7 contains firmware 5a347.  Do a restore from iTunes to get the newer [...]]]></description>
			<content:encoded><![CDATA[<h3>Slow Response, especially in Contacts or Text</h3>
<p>Some suggestions from around the web:</p>
<ol>
<li>It is probably caused by memory leaks in 3rd party apps.  You can close any app by holding Home button for 6 seconds.</li>
<li>iPhone 3G was released with firmware 5a345 but iTunes 7.7 contains firmware 5a347.  Do a restore from iTunes to get the newer version. Make sure you have synced and backed up before doing this, since you are completely wiping the iPhone.  Lots of people are saying that helps.</li>
<li>Rebooting the phone &#8211; hold power button for several seconds, it will ask you to slide to turn off.  Hold power button to turn it back on.  This is the same as rebooting any computer &#8211; you&#8217;re cleaning up the memory.</li>
</ol>
<h3>Battery Life</h3>
<p>To extend the battry life, switch off WiFi, 3G and Bluetooth when you&#8217;re no using them. Hopefully someone will soon write a utility to do this easily and quickly from one place. I may even give it a go myself&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/misc-iphone-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take screenshot on iPhone 2.0</title>
		<link>http://www.andymadge.com/2008/07/take-screenshot-on-iphone-20/</link>
		<comments>http://www.andymadge.com/2008/07/take-screenshot-on-iphone-20/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 08:22:14 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/uncategorized/2008/07/21/take-screenshot-on-iphone-20/</guid>
		<description><![CDATA[
Hold Home button
Press Lock button

The screen will flash and image will be saved to Camera Roll
]]></description>
			<content:encoded><![CDATA[<ol>
<li>Hold Home button</li>
<li>Press Lock button</li>
</ol>
<p>The screen will flash and image will be saved to Camera Roll</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/take-screenshot-on-iphone-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Save an image from the web on iPhone</title>
		<link>http://www.andymadge.com/2008/07/save-an-image-from-the-web-on-iphone/</link>
		<comments>http://www.andymadge.com/2008/07/save-an-image-from-the-web-on-iphone/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 08:12:56 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/iphone/2008/07/21/save-an-image-from-the-web-on-iphone/</guid>
		<description><![CDATA[With the iPhone v2.0 software you can now save an image from the web to the Camera Roll on the iPhone.  Tap and hold on an image in Safari and you&#8217;ll get a menu asking if you want to save the image.
Once it&#8217;s in the Camera Roll you can set it as wallpaper.
]]></description>
			<content:encoded><![CDATA[<p>With the iPhone v2.0 software you can now save an image from the web to the Camera Roll on the iPhone.  Tap and hold on an image in Safari and you&#8217;ll get a menu asking if you want to save the image.</p>
<p>Once it&#8217;s in the Camera Roll you can set it as wallpaper.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/save-an-image-from-the-web-on-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X keyboard shortcuts</title>
		<link>http://www.andymadge.com/2008/07/mac-os-x-keyboard-shortcuts/</link>
		<comments>http://www.andymadge.com/2008/07/mac-os-x-keyboard-shortcuts/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 17:43:29 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Keyboard Shortcuts]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/computers/2008/07/14/mac-os-x-keyboard-shortcuts/</guid>
		<description><![CDATA[Useful OS X keyboard shortcuts, particularly if you&#8217;re switching from Windows.  It&#8217;s not exhaustive, but it&#8217;s got the ones I use regularly.
This page will be updated as I find new ones to include.

The &#8984; key is also known as Command
The &#8997; key is also known as Alt or Option
The &#8677; key is also known as [...]]]></description>
			<content:encoded><![CDATA[<p>Useful OS X keyboard shortcuts, particularly if you&#8217;re switching from Windows.  It&#8217;s not exhaustive, but it&#8217;s got the ones I use regularly.</p>
<p>This page will be updated as I find new ones to include.</p>
<p><span id="more-59"></span></p>
<p>The &#8984; key is also known as Command<br />
The &#8997; key is also known as Alt or Option<br />
The &#8677; key is also known as Tab</p>
<table class="cleantable" border="0">
<tbody>
<tr>
<th>Action</th>
<th>Shortcut</th>
</tr>
<tr>
<td>Open the Spotlight menu to start a search</td>
<td>&#8984;-Space (Command-Space)</td>
</tr>
<tr>
<td>Open the Spotlight window</td>
<td>&#8984;-&#8997;-Space (Command-Option-Space)</td>
</tr>
<tr>
<td>Show a spotlight result item in the Finder</td>
<td>&#8984;-click it (Command-click it)</td>
</tr>
<tr>
<td>Force Quit an application</td>
<td>&#8984;-&#8997;-Escape (Command-Option-Escape)</td>
</tr>
<tr>
<td>Force Reboot of OS X</td>
<td>Ctrl-&#8984;-Power (Ctrl-Command-Power)</td>
</tr>
<tr>
<td>Force Shutdown of computer</td>
<td>&#8984;-&#8997;-Shift-Power (Command-Option-Shift-Power)</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/mac-os-x-keyboard-shortcuts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restore a Minimized OS X Window</title>
		<link>http://www.andymadge.com/2008/07/restore-a-minimized-os-x-window/</link>
		<comments>http://www.andymadge.com/2008/07/restore-a-minimized-os-x-window/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 17:26:51 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Apple Mac]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/computers/applemac/2008/07/14/restore-a-minimized-os-x-window/</guid>
		<description><![CDATA[[Sorry, this post got corrupted and is displaying '?' instead of the keys.  I'll fix it once I remember what they were... Oops. ]
In OS X you can swap between applications in a similar way to Windows (Alt+Tab on Windows, ?+Tab on OS X) however there&#8217;s one important difference &#8211; Windows swaps between all [...]]]></description>
			<content:encoded><![CDATA[<p>[Sorry, this post got corrupted and is displaying '?' instead of the keys.  I'll fix it once I remember what they were... Oops. ]</p>
<p>In OS X you can swap between applications in a similar way to Windows (Alt+Tab on Windows, ?+Tab on OS X) however there&#8217;s one important difference &#8211; Windows swaps between all open windows, but OS X only swaps between apps.  The problem is that in OS X you can switch to the right application but the window you want can be minimized.</p>
<p>To restore the window from the dock you need to:</p>
<ol>
<li>Hold ?</li>
<li>Press Tab until the correct app is highlighted</li>
<li>Hold Alt</li>
<li>Release ?</li>
<li>Release Alt</li>
</ol>
<p>It&#8217;s a bit tricky but you soon get the hang of it and it&#8217;s easier than picking up the mouse <img src='http://www.andymadge.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/restore-a-minimized-os-x-window/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
