<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dreaming in PowerShell : Credential, Access Token</title><link>http://powershell.com/cs/blogs/tobias/archive/tags/Credential/Access+Token/default.aspx</link><description>Tags: Credential, Access Token</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Encrypting Passwords in PowerShell (Part 2)</title><link>http://powershell.com/cs/blogs/tobias/archive/2010/10/25/encrypting-passwords-in-powershell-part-2.aspx</link><pubDate>Mon, 25 Oct 2010 09:16:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:7982</guid><dc:creator>Tobias</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=7982</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2010/10/25/encrypting-passwords-in-powershell-part-2.aspx#comments</comments><description>&lt;p&gt;In &lt;a target="_blank" href="http://powershell.com/cs/blogs/tobias/archive/2010/10/22/encrypting-passwords.aspx"&gt;Part 1&lt;/a&gt;, you learned how to &lt;strong&gt;&amp;quot;obfuscate&amp;quot;&lt;/strong&gt; passwords in your scripts. Obfuscation is &lt;strong&gt;not secure&lt;/strong&gt; because at the end of the day, the user could still retrieve the password. Obfuscation is just a technique to make it harder to obtain the password. So let&amp;#39;s examine some ways to increase security.&lt;/p&gt;
&lt;h2&gt;Hiding the Secret&lt;/h2&gt;
&lt;p&gt;The only &lt;strong&gt;safe way&lt;/strong&gt; to hard-code passwords in scripts is to encrypt them with a secret that is not shared in the same script. One such secret would be your &lt;strong&gt;access token&lt;/strong&gt; (your identity). This technique is useful when you want to hard-code a password in your script and you (and only you) are using that script. Let&amp;#39;s say you have to log on to some servers regularly or want to automate some personal tasks. Then you could encrypt your password with your access token. Whenever you launch the script, the password can be unencrypted. If someone else snoops through your hard drive and finds your script, or if you store it on a USB drive and lose it, &lt;strong&gt;no one else can ever get to your hard coded password&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Using Your Identity as Secret&lt;/h2&gt;
&lt;p&gt;Actually, you can almost use the script presented in &lt;a target="_blank" href="http://powershell.com/cs/blogs/tobias/archive/2010/10/22/encrypting-passwords.aspx"&gt;Part 1&lt;/a&gt;. All you do is remove the lines dealing with a separate encryption key. If you do not use an encryption key, PowerShell uses your identity as secret instead:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span style="color:#008000;"&gt;&lt;span class="comment"&gt;# Path to the script to be created:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;c:\scripts\template.ps1&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;span class="comment"&gt;# Create empty template script:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Item&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ItemType&lt;/span&gt;&lt;/span&gt; File &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Force&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ErrorAction&lt;/span&gt;&lt;/span&gt; SilentlyContinue | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-Null&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$pwd&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Read-Host&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Enter Password&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#5f9ea0;"&gt;&lt;span class="modifier"&gt;-AsSecureString&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Read-Host&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Enter Username&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$pwdencrypted&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$pwd&lt;/span&gt;&lt;/span&gt; | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;ConvertFrom-SecureString&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$private:ofs&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;$password = &amp;quot;{0}&amp;quot;&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-f&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$pwdencrypted&lt;/span&gt;&lt;/span&gt;) | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-File&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$path&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;$passwordSecure = ConvertTo-SecureString -String $password&amp;#39;&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-File&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#5f9ea0;"&gt;&lt;span class="modifier"&gt;-Append&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;$cred = New-Object system.Management.Automation.PSCredential(&amp;quot;{0}&amp;quot;, $passwordSecure)&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-f&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user&lt;/span&gt;&lt;/span&gt;) |&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-File&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#5f9ea0;"&gt;&lt;span class="modifier"&gt;-Append&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;$cred&amp;#39;&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Out-File&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#5f9ea0;"&gt;&lt;span class="modifier"&gt;-Append&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;ise &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;You can download this script here: &lt;a target="_blank" href="http://powershell.com/cs/media/p/7981.aspx"&gt;http://powershell.com/cs/media/p/7981.aspx&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Creating a Safe Password Script&lt;/h2&gt;
&lt;p&gt;Run the script. It will ask you for the password you want to encrypt and the user name. Then, it autogenerates the script for you and opens it in ISE.&lt;/p&gt;
&lt;p&gt;Once you run the autogenerated script, you get back a valid credential object that you can use to authenticate against WMI or start processes with. Since the secret key is now your identity, no secret key is stored within the script. Instead, when someone else runs your script the decryption process will fail, and the password is safe.&lt;/p&gt;
&lt;h2&gt;Exporting and Importing Credentials&lt;/h2&gt;
&lt;p&gt;On a related page, you can also &lt;strong&gt;export&lt;/strong&gt; &lt;strong&gt;credentials&lt;/strong&gt; to an xml file and import them later. This approach uses the very same technique. Here is how: &lt;a href="http://powershell.com/cs/blogs/tips/archive/2009/12/08/exporting-and-importing-credentials.aspx"&gt;http://powershell.com/cs/blogs/tips/archive/2009/12/08/exporting-and-importing-credentials.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Of course, the approach described today only works when the person encrypting the password is the same person using that password later on. If you need to create a script that is run by someone else, you need to use the unsafe approach outlined in &lt;a target="_blank" href="http://powershell.com/cs/blogs/tobias/archive/2010/10/22/encrypting-passwords.aspx"&gt;Part 1&lt;/a&gt; of this series - or you&amp;#39;d have to wait for Part 3 where I present some additional cool ways of encrypting passwords.&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Microsoft MVP PowerShell Germany&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;P.S.&lt;br /&gt;If you live in Germany or other parts of Europe and your company would like to set up a truly great PowerShell training, just contact me! I regularly train mid- to large-size companies. Trainings are always a blast with tons of real-world-examples and solutions. Here&amp;#39;s how to get in touch with me: &lt;a href="mailto:tobias.weltner@scriptinternals.de"&gt;&lt;span style="color:#3366cc;"&gt;tobias.weltner@scriptinternals.de&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=7982" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Credential/default.aspx">Credential</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Encrypt/default.aspx">Encrypt</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Password/default.aspx">Password</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Access+Token/default.aspx">Access Token</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Export/default.aspx">Export</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Import/default.aspx">Import</category></item></channel></rss>