<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>SQL Server Storage Engine : SQL Server Security</title><link>http://blogs.msdn.com/sqlserverstorageengine/archive/tags/SQL+Server+Security/default.aspx</link><description>Tags: SQL Server Security</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Fun with execution context switching</title><link>http://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/21/642061.aspx</link><pubDate>Wed, 21 Jun 2006 15:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:642061</guid><dc:creator>RobWalters</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/sqlserverstorageengine/comments/642061.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sqlserverstorageengine/commentrss.aspx?PostID=642061</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;Having multiple users each owning various objects is commonplace &lt;/FONT&gt;&lt;FONT face=Arial&gt;in the database world. When one user wants to give access of &lt;/FONT&gt;&lt;FONT face=Arial&gt;their object to another user -- that’s when administration of &lt;/FONT&gt;&lt;FONT face=Arial&gt;databases gets rather interesting.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;Consider the following SQL Server 2000 experience:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;User Barney has a table of Rock and Roll hits&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;User Fred wrote a stored procedure that accepts a time period and &lt;/FONT&gt;&lt;FONT face=Arial&gt;returns a list of the hits of that year&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;In the current scenario, Fred needs at least SELECT access to &lt;/FONT&gt;&lt;FONT face=Arial&gt;Barney's table in order for the stored procedure to work. This &lt;/FONT&gt;&lt;FONT face=Arial&gt;seems like a logical administrative task.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;Now suppose Wilma wants to use Fred's stored procedure.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In SQL Server &lt;/FONT&gt;&lt;FONT face=Arial&gt;2000, Wilma would need explicit access to Barney's table or Fred would have to own the table in order for Wilma to accomplish this.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Now imagine trying to manage this for hundreds of users in an enterprise and you can see that managing all these permissions could be quite cumbersome unless we came up with some consistent strategy.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;To help alleviate some of this administrative burden, SQL Server 2005&amp;nbsp;allows users the ability to specify the execution context of which an object like a stored procedure or user-defined function will run under.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;Imagine in our scenario that Fred could say, when this stored proc executes, execute it under my credentials so that Wilma doesn't have to go and get permissions on everything within the stored procedure in order for her to use it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;In SQL Server 2005, this would be accomplished using EXECUTE AS OWNER.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In fact there are four possibilities when it comes to changing the execution context.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;They are as follows:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;EXECUTE AS CALLER&lt;/STRONG&gt; – This will execute under the credentials of the &lt;/FONT&gt;&lt;FONT face=Arial&gt;caller.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This is the same default behavior as in previous versions &lt;/FONT&gt;&lt;FONT face=Arial&gt;of SQL Server.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;I.e. when Wilma calls the stored proc, the proc runs under Wilma.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;EXECUTE AS SELF&lt;/STRONG&gt; – This will execute under the credentials of the &lt;/FONT&gt;&lt;FONT face=Arial&gt;user who last modified the stored procedure.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In our scenario if Bam-Bam modified Fred's stored proc and Wilma called Fred's Proc, the proc would run under Bam-Bam.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;EXECUTE AS ‘(insert name of login)’&lt;/STRONG&gt; – This will execute under the &lt;/FONT&gt;&lt;FONT face=Arial&gt;credentials of the login identified.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In order for this to work, &lt;/FONT&gt;&lt;FONT face=Arial&gt;the user creating or modifying the stored procedure needs to have &lt;/FONT&gt;&lt;FONT face=Arial&gt;IMPERSONATE permission for the login specified.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In our scenario if Fred wanted to run the stored proc under Dino's credentials, Fred would need the IMPERSONATE permissions granted to him by the sysadmin first, then he could EXECUTE AS 'Dino'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;EXECUTE AS OWNER&lt;/STRONG&gt; – This will execute under the credentials of the &lt;/FONT&gt;&lt;FONT face=Arial&gt;login who owns the stored procedure.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;As explained previously, Fred's stored proc will be run under Fred regardless of who executes it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;Referring back to our example, let us write a few examples of execution context switching. &lt;/FONT&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;To gain the most&amp;nbsp;from this, it is best to walk through this line by line in your favorite TSQL editor or simply read through the comments.&lt;/FONT&gt;&lt;/o:p&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&lt;FONT color=#008000 size=5&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;&lt;STRONG&gt;-- Demo setup&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;&lt;STRONG&gt;-- create our logins, users and database&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;use&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; master&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;login&lt;/FONT&gt; BarneyLogin &lt;FONT color=#0000ff&gt;with&lt;/FONT&gt; password&lt;FONT color=#808080&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'!@w9Kfvn3'&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;login&lt;/FONT&gt; FredLogin &lt;FONT color=#0000ff&gt;with&lt;/FONT&gt; password&lt;FONT color=#808080&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'MN3@8YU8u'&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;login&lt;/FONT&gt; WilmaLogin &lt;FONT color=#0000ff&gt;with&lt;/FONT&gt; password&lt;FONT color=#808080&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'Nb29D%&amp;amp;2j'&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;database&lt;/FONT&gt; Music&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;use&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; Music&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Create our database users mapped to their login&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#ff00ff&gt;user&lt;/FONT&gt; BarneyUser &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;login&lt;/FONT&gt; BarneyLogin &lt;FONT color=#0000ff&gt;with&lt;/FONT&gt; default_schema&lt;FONT color=#808080&gt;=&lt;/FONT&gt;BarneySchema&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#ff00ff&gt;user&lt;/FONT&gt; FredUser &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;login&lt;/FONT&gt; FredLogin &lt;FONT color=#0000ff&gt;with&lt;/FONT&gt; default_schema&lt;FONT color=#808080&gt;=&lt;/FONT&gt;FredSchema&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#ff00ff&gt;user&lt;/FONT&gt; WilmaUser &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;login&lt;/FONT&gt; WilmaLogin &lt;FONT color=#0000ff&gt;with&lt;/FONT&gt; default_schema&lt;FONT color=#808080&gt;=&lt;/FONT&gt;WilmaSchema&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Create our schemas for each user&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;schema&lt;/FONT&gt; BarneySchema&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;authorization&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; BarneyUser&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;schema&lt;/FONT&gt; FredSchema&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;authorization&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; FredUser&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;schema&lt;/FONT&gt; WilmaSchema&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;authorization&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; WilmaUser&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Create a table that Barney's schema owns&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;use&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; Music&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;table&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#808080&gt;
&lt;P&gt;&lt;STRONG&gt;(&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt;YearPublished &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; &lt;FONT color=#808080&gt;NOT&lt;/FONT&gt; &lt;FONT color=#808080&gt;NULL,&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;Title &lt;FONT color=#0000ff&gt;nvarchar&lt;/FONT&gt;&lt;FONT color=#808080&gt;(&lt;/FONT&gt;50&lt;FONT color=#808080&gt;)&lt;/FONT&gt; &lt;FONT color=#808080&gt;NOT&lt;/FONT&gt; &lt;FONT color=#808080&gt;NULL)&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Insert some data into the table&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;insert&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;into&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits &lt;FONT color=#0000ff&gt;values&lt;/FONT&gt;&lt;FONT color=#808080&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'1960'&lt;/FONT&gt;&lt;FONT color=#808080&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'Pebbles Jam'&lt;/FONT&gt;&lt;FONT color=#808080&gt;)&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;insert&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;into&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits &lt;FONT color=#0000ff&gt;values&lt;/FONT&gt;&lt;FONT color=#808080&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'1961'&lt;/FONT&gt;&lt;FONT color=#808080&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'Dino Disco'&lt;/FONT&gt;&lt;FONT color=#808080&gt;)&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;insert&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;into&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits &lt;FONT color=#0000ff&gt;values&lt;/FONT&gt;&lt;FONT color=#808080&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'1961'&lt;/FONT&gt;&lt;FONT color=#808080&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'Fred''s Dance Formula'&lt;/FONT&gt;&lt;FONT color=#808080&gt;)&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;GRANT&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;SELECT&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;ON&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits &lt;FONT color=#0000ff&gt;to&lt;/FONT&gt; FredUser&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Create the stored procedure that Fred's Schema owns, remember&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--EXECUTE AS CALLER is the same as SQL Server 2000 behavior&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--The stored proc executes under whomever is calling it&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;create&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;procedure&lt;/FONT&gt; FredSchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;ListHits&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;@Year &lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;WITH&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;EXECUTE&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;AS&lt;/FONT&gt; CALLER&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;AS&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;BEGIN&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;select&lt;/FONT&gt; &lt;FONT color=#ff00ff&gt;CURRENT_USER&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;'(Execute as Caller), Current User Context='&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;select&lt;/FONT&gt; YearPublished&lt;FONT color=#808080&gt;,&lt;/FONT&gt;Title &lt;FONT color=#0000ff&gt;from&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits &lt;FONT color=#0000ff&gt;where&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;YearPublished&lt;FONT color=#808080&gt;=&lt;/FONT&gt;@Year&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;END&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Let's grant Wilma the ability to execute this stored proc&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;GRANT&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;EXECUTE&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;ON&lt;/FONT&gt; FredSchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;ListHits &lt;FONT color=#0000ff&gt;to&lt;/FONT&gt; WilmaUser&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--At this point we can begin playing with context switching&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--We have given Fred access to Barney's table of hits&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--We created the stored proc with SQL Server 2000&amp;nbsp;behavior i.e. EXECUTE AS CALLER&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--We have given Wilma access to Fred's Stored Proc&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--Lets begin by logging in as Fred and seeing if this stored proc works&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;execute&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#ff00ff&gt;user&lt;/FONT&gt;&lt;FONT color=#808080&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'FredUser'&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;exec&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; ListHits 1961&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--The result is "Executing as FredUser" and the two titles from 1961&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--A note on using executing as:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--We used "Execute as user='FredUser'" to context switch inline to&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--The database user "FredUser", we could have used, "Execute as login='FredLogin'"&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--However, this would have expanded the scope of the current connection to&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--FredLogin e.g. this connection could not only use FredUser but could use any database user&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--that was mapped to FredLogin!&amp;nbsp; So its best to scope the context switch&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--as narrow as possible, in our demo we only care about the database user FredUser within the Music database so we use execute as user.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--Now let's have Wilma try and execute the stored proc&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;REVERT&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#008000&gt;--go back to sysadmin&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;EXECUTE&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;AS&lt;/FONT&gt; &lt;FONT color=#ff00ff&gt;user&lt;/FONT&gt;&lt;FONT color=#808080&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'WilmaUser'&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;exec&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; FredSchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;ListHits 1961&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--We get the SELECT permission denied error as expected&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--because the stored proc is executing as WilmaUser&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--Now let's ALTER the stored procedure so that it will run under&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--its owner, Fred.&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;REVERT&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;GO&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;ALTER&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;PROCEDURE&lt;/FONT&gt; FredSchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;ListHits&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;@Year &lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;WITH&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;EXECUTE&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;AS&lt;/FONT&gt; OWNER&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;AS&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;BEGIN&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;select&lt;/FONT&gt; &lt;FONT color=#ff00ff&gt;CURRENT_USER&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;'(Execute as Owner), Current User Context='&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;select&lt;/FONT&gt; YearPublished&lt;FONT color=#808080&gt;,&lt;/FONT&gt;Title &lt;FONT color=#0000ff&gt;from&lt;/FONT&gt; BarneySchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;RockHits &lt;FONT color=#0000ff&gt;where&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;YearPublished&lt;FONT color=#808080&gt;=&lt;/FONT&gt;@Year&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;END&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;GO&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--Now let's try Wilma again&lt;/STRONG&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;EXECUTE&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;FONT color=#0000ff&gt;AS&lt;/FONT&gt; &lt;FONT color=#ff00ff&gt;user&lt;/FONT&gt;&lt;FONT color=#808080&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;'WilmaUser'&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;STRONG&gt;go&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;STRONG&gt;exec&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; FredSchema&lt;FONT color=#808080&gt;.&lt;/FONT&gt;ListHits 1961&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;
&lt;P&gt;&lt;STRONG&gt;--As you can see the current user context is FredUser! and we didn't&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--have to give Wilma explicit permissions to the underlying table in&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;--Fred's stored proc.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=5&gt;&lt;FONT size=3&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;The previous example showed how one might leverage execution context switching with stored procedures.&amp;nbsp; Have fun!&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Arial size=2&gt;&lt;EM&gt;Side note: One of the things we have found recently is if you are switching to a domain user SQL Server needs to hit a domain controller so if the DC is offline, the command will fail.&amp;nbsp; SQL Server doesn't cache domain credentials.&amp;nbsp; We are looking into this issue.&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=642061" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sqlserverstorageengine/archive/tags/SQL+Server+Security/default.aspx">SQL Server Security</category></item><item><title>Encryption 101</title><link>http://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/19/637529.aspx</link><pubDate>Mon, 19 Jun 2006 15:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:637529</guid><dc:creator>RobWalters</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/sqlserverstorageengine/comments/637529.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sqlserverstorageengine/commentrss.aspx?PostID=637529</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial&gt;With the release of SQL Server 2005 comes a plethora of new security related features.&amp;nbsp; Over time we will cover these in detail.&amp;nbsp; To start, let's look at the world of encryption.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;When it comes to protecting data we can take a mile high view of this problem and determine that we need to protect it while its in trasit (over the wire) and when its at rest (while stored on a physcial disk or memory).&amp;nbsp; Some of you have probably read various&amp;nbsp;stories about company laptop's being stolen that contain large amounts of sensitive information.&amp;nbsp; This is a great example of the need to protect sensitive data stored at rest.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;In previous versions of SQL Server (pre-2005), the server had limited features out of the box to protect data while in transit and had no native support to encrypt data within the database.&amp;nbsp; (There are some third party vendors that added this type of functionality in SQL 2000).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Before we go into details on encryption, we should first go through some of the key concepts in this space.&amp;nbsp; If you can already define words like "symmetric key" and&amp;nbsp;"certificate", then you can skip ahead to the "Protecting data while in transit" section later in this post.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;&lt;U&gt;Encryption Primer:&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Let's say I have a table of customer credit card numbers and I want to encrypt the credit card number column.&amp;nbsp; In order to encrypt this text I need three things: an encryption key, an algorithm, and the actual text I want to encrypt.&amp;nbsp; When we take the text and key and run the algorithm on it, we end up with what is known as ciphertext (the encrypted data).&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;"4428-0123-4567-8910" --Now becomes--&amp;gt; 0x01238EB28401AC0283...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;There are two types of keys we will talk about in this blog: Symmetric and Asymmetric.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;U&gt;A symmetric key&lt;/U&gt; is a&amp;nbsp;single key that is used for both encrypting and decrypting data.&amp;nbsp; So&amp;nbsp;if I&amp;nbsp;wanted you to be able to decrypt&amp;nbsp;my credit card list, I would simply give you the same symmetric key I used when I encrypted it.&amp;nbsp; Now al you have to do is pass the encrypted ciphertext and key into the algorithm and voila you have the original plain text. Symmetric key encryption and decryption is fast relative to asymmetric keys, however, there are some important points to remember when using symmetric keys.&amp;nbsp; What if as I was giving you the key someone saw the key and copied it?&amp;nbsp; Now everytime I send you the encrypted credit card list, the attacker who has made a copy of the symmetric key can easily decrypt it and now we have a serious problem.&amp;nbsp; So when we use symmetric key encryption we absolutely must&amp;nbsp;protect the keys or else all of this encryption business is&amp;nbsp;irrelevant.&amp;nbsp; In SQL Server 2005 we do protect symmetric keys in two ways, via password and via encryption by another key.&amp;nbsp; I will explain more in the "Protecting data while at rest" section.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;U&gt;An Asymetric&amp;nbsp;key &lt;/U&gt;is essentially two keys: A public key and a private key.&amp;nbsp;&amp;nbsp; Both of these keys are mathematically similar so when something is encrypted using my public key I can decrypt it using my private key and vise versa.&amp;nbsp; This allows me to give everyone in the world my public key and I can have them send me encrypted messages that can only be decrypted using my private key (which I don't give out to anyone and lock it under 100 feet of lead and cement, a couple guard dogs, boobie-traps, land-mines and whatever else I can use to protect it).&amp;nbsp; This behavior works well for the web.&amp;nbsp; When you request a connection over HTTPS: you essentially are requesting their public key to be used in decrypting the contents on their web pages.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;U&gt;A certificate&lt;/U&gt; is an asymmetric key with some extra metadata like an expiration date, the name of the certificate authroity that issued the certificate, etc.&amp;nbsp; Having a third-party certificate authority&amp;nbsp;issue you a certificate can be important depending on the size of your organization and how you are using the certificate.&amp;nbsp; It basically gives users more confidence that the data they are receiving and sending to someone is actually coming from that person and not some impersonator.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The amount of &lt;U&gt;algorithms&lt;/U&gt; available depend on which version of the operating system you are using.&amp;nbsp; Each algorithm has pros and cons and if you are interesting in learning more about these, there is a ton of information on the web for further study.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&amp;nbsp;XPSP2 supports DES, 3DES, RC2, RC4, RSA&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Windows 2003 server supports DES, 3DES, AES128, AES192, AES256, RC2, RC4, RSA&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;I am just scratching the surface when it comes to introducing these topics, if you are interested there are bunch of good books out there that describe cryptography in great detail.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;&lt;U&gt;Protecting data while in transit in SQL Server 2005:&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Using the SQL Server Computer Manager you can set your server to always encrypt connections.&amp;nbsp; Likewise you can configure your client machines to always encrypt connections and whether or not to validate the certificate.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Regardless of whether you change either of these settings, a&lt;/FONT&gt;&lt;FONT face=Arial&gt;ll connection/authentication requests to SQL Server&amp;nbsp;(both via SQL Authentication and Windows Authentication) that use the SQL Native Client APIs will always be encrypted no matter what the server or client setting is.&amp;nbsp; This is because SQL Server creates a self-signed certificate upon installation and uses this to encrypt the connection request.&amp;nbsp; Once the login credentials are passed and the connection is confirmed, the connection will return to clear text or encrypted (depending on if you required the connection to be encrypted or not).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Remember that there is a small performance hit anytime you decide to require all connections encrypted.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;A note on the "Trust Server Certificate" option in the SQL Native Client properties dialog.&amp;nbsp; As we discussed before, SQL Server issues a self-signed certificate.&amp;nbsp; Since this certificate is not signed by a certificate authority it is not&amp;nbsp;automatically trusted (like when you obtain a cert using Verisign, etc).&amp;nbsp; You could get a signed certificate from one of the certificate authories and upload it to the server if you wish.&amp;nbsp; This costs some cash though (because the certificate authories charge money for this service).&amp;nbsp; So how you set this up depends upon how your organization is using SQL Server and its exposure to the outside world.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;STRONG&gt;&lt;U&gt;Protecting data while at rest in SQL Server 2005:&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Here is where SQL Server 2005 has a lot of added value out of the box.&amp;nbsp; In the primer section of this post I talked about the basic needs of encryption needing the text, the key and the algorithm.&amp;nbsp; These actions of creating and managing keys have their own DDL in SQL Server as well as a few built-in functions like EncryptByKey() that make the work of encrypting data -- easy.&amp;nbsp; You will though have to change some code in your application to make encryption work, there is no magic checkbox (yet) that says, "make this column encrypted" and everyone is happy.&amp;nbsp; That is currently a mild pain point for some customers in the whole encryption discussion -- just take a few pain killers and continue reading.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The easiest way to demonstrate encryption is to run through a demo.&amp;nbsp; In this example we have a user called, "HR_User" who needs access to the salary table.&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;LOGIN&lt;/FONT&gt;&lt;FONT size=2&gt; HR_Login &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;WITH&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'SomeComplexPassword'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;DATABASE&lt;/FONT&gt;&lt;FONT size=2&gt; ExampleDB&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;use&lt;/FONT&gt;&lt;FONT size=2&gt; ExampleDB&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt;USER&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;FOR&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;LOGIN&lt;/FONT&gt;&lt;FONT size=2&gt; HR_Login&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Now we must create a Database Master Key for the ExampleDB.&amp;nbsp; Database Master Keys&lt;/P&gt;
&lt;P&gt;--are used so that SQL Server can&amp;nbsp;encrypt the keys you created.&amp;nbsp; To protect this key we&lt;/P&gt;
&lt;P&gt;--supply a password&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; MASTER &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; ENCRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'AComplexPassword'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Create the table that will store sensitive information&lt;/P&gt;
&lt;P&gt;--Notice we use a varbinary for our salary information&lt;/P&gt;
&lt;P&gt;--This is because the ciphertext (encrypted data) is binary&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;TABLE&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;
&lt;P&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;employee &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;nvarchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;50&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;department &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;nvarchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;50&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;salary &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;varbinary&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;60&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Give access to this table to HR_User so they can add data&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;GRANT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;INSERT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;TO&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Create a Symmetric Key&lt;/P&gt;
&lt;P&gt;--Encrypt the key with a password &lt;/P&gt;
&lt;P&gt;--Give access to the key to HR_User&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;AUTHORIZATION&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;WITH&lt;/FONT&gt;&lt;FONT size=2&gt; ALGORITHM&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;TRIPLE_DES&lt;/P&gt;
&lt;P&gt;ENCRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'CompensationPlansRule'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Now, let's login as HR_User and encrypt some data&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;EXECUTE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;AS&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;LOGIN&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'HR_Login'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--First, we need to open the key that will be used to encrypt data&lt;/P&gt;
&lt;P&gt;--Notice &lt;U&gt;we always have to pass the password for the key -- what a pain in the.. &lt;/U&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;OPEN&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key DECRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'CompensationPlansRule'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--This system view shows a list of open keys that can be used for encryption&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;select&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;*&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;from&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;sys.openkeys&lt;/P&gt;
&lt;P&gt;--Now let us insert sensitive data into the table&lt;/P&gt;
&lt;P&gt;--encryptByKey takes the GUID of the key and the text of the data&lt;/P&gt;
&lt;P&gt;--Since remembering GUIDs is not easy, Key_GUID is a function&lt;/P&gt;
&lt;P&gt;--that does the lookup for us&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;INSERT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;INTO&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;VALUES&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;
&lt;P&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Bryan'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Sales'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;encryptByKey&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;Key_GUID&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'HR_User_Key'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'125000'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;INSERT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;INTO&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;VALUES&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;
&lt;P&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Tammie'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Sales'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;encryptByKey&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;Key_GUID&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'HR_User_Key'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'122000'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;INSERT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;INTO&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;VALUES&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;
&lt;P&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Frank'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Development'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;encryptByKey&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;Key_GUID&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'HR_User_Key'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'97500'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;INSERT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;INTO&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;VALUES&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;
&lt;P&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Fran'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Marketing'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;encryptByKey&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;Key_GUID&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'HR_User_Key'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'99500'&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--When we are done, always close all keys&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CLOSE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;ALL&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; KEYS&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--View the table as it lives in the database, notice the salary column is all binary&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;select&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;*&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;from&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Now, let's decrypt and view the contents&lt;/P&gt;
&lt;P&gt;--We use decryptByKey and pass the column name&lt;/P&gt;
&lt;P&gt;--We don't have to specify a key GUID because SQL will look&lt;/P&gt;
&lt;P&gt;--at all your open keys and use the appropriate one automatically&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;OPEN&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key DECRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'CompensationPlansRule'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; employee&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;department&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt;
&lt;P&gt;CONVERT&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;varchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;decryptByKey&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;salary&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;FROM&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CLOSE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;ALL&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; KEYS&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Revert back to sysadmin&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;REVERT&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--When encrypting by password, need to know the password &lt;/P&gt;
&lt;P&gt;--and pass it everytime you encrypt something.&lt;/P&gt;
&lt;P&gt;--Alternatively you can create a certificate and give access to &lt;/P&gt;
&lt;P&gt;--the HR User. With this, the user doesn't have to provide a password&lt;/P&gt;
&lt;P&gt;--and you can easily revoke access to that encrypted data by simply&lt;/P&gt;
&lt;P&gt;--removing the cert&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CERTIFICATE&lt;/FONT&gt;&lt;FONT size=2&gt; HRCert1&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;AUTHORIZATION&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;WITH&lt;/FONT&gt;&lt;FONT size=2&gt; SUBJECT&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'Certificate used by the Human Resources person'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Open the key so we can modify it&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;OPEN&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key DECRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'CompensationPlansRule'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--We can not remove the password because we would leave the key&lt;/P&gt;
&lt;P&gt;--exposed without encryption so we need to add the certificate first&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;ALTER&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;ADD&lt;/FONT&gt;&lt;FONT size=2&gt; ENCRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CERTIFICATE&lt;/FONT&gt;&lt;FONT size=2&gt; HRCert1&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Now we can remove the password encryption from the key &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;ALTER&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;DROP&lt;/FONT&gt;&lt;FONT size=2&gt; ENCRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; PASSWORD&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'CompensationPlansRule'&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;CLOSE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;ALL&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; KEYS&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Now change context to HR_Login to test our changes&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;EXECUTE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;AS&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;LOGIN&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'HR_Login'&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;--Notice, we opened the key without a password!&lt;/P&gt;
&lt;P&gt;--This is because we created the certificate and gave authorization&lt;/P&gt;
&lt;P&gt;--on it explicitly to HR_User&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;OPEN&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SYMMETRIC&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;KEY&lt;/FONT&gt;&lt;FONT size=2&gt; HR_User_Key DECRYPTION &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;BY&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CERTIFICATE&lt;/FONT&gt;&lt;FONT size=2&gt; HRCert1&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; employee&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;department&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt;
&lt;P&gt;CONVERT&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;varchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;FONT size=2&gt;decryptByKey&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;salary&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;))&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;FROM&lt;/FONT&gt;&lt;FONT size=2&gt; SalaryInfo&lt;/P&gt;
&lt;P&gt;GO&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Times New Roman" size=3&gt;This post is meant to give an overview of encryption in SQL Server 2005.&amp;nbsp; There are two members of the SQL Engine team, Laurentiu Cristofor and Raul Garcia who have blogs dedicated to supporting encryption in SQL Server.&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Times New Roman" size=3&gt;For information on encryption check out these blogs:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://blogs.msdn.com:443/lcris"&gt;&lt;FONT face="Times New Roman" size=3&gt;http://blogs.msdn.com/lcris&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://blogs.msdn.com:443/raulga"&gt;&lt;FONT face="Times New Roman" size=3&gt;http://blogs.msdn.com/raulga&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=637529" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sqlserverstorageengine/archive/tags/SQL+Server+Security/default.aspx">SQL Server Security</category></item></channel></rss>