Category: Blog

  • Does TDE really work on MDF files?

    Yes, it does. However, let’s prove it. First let’s create a database, a table, and enter some data:

    -- create a database
    CREATE DATABASE TDE_Primer
    ;
    GO
    -- create and populate a table
    USE TDE_Primer
    go
    CREATE TABLE MyTable
    ( myid INT
    , myname VARCHAR(20)
    , mychar VARCHAR(200)  
    )
    ;
    go
    DECLARE @i INT = 65;
    WHILE @i < 92
     begin
      INSERT mytable SELECT @i, 'Steve Jones', REPLICATE(CHAR(@i), 200);
      SELECT @i = @i + 1;
     END
    ;
    GO
    SELECT * FROM Mytable;
    go

    If I look at the table, I see my name with lots of data:

    Capture_030

    Now let’s detach the database and examine the results with a hex editor:

    -- detach database
    USE [master]
    GO
    EXEC master.dbo.sp_detach_db @dbname = N'TDE_Primer'
    ;
    
    GO

    I use XVI32 as an editor. It’s free, and you can download it. If I open up my MDF in this utility, here’s what I see:

    Capture_031

    If I search for my name:

    Capture_032

    I find it:

    Capture_033

    This is what I expect, and you should as well. Even without SQL Server, your data files are readable, which is why you must protect them.

    Now let’s attach the file and enable TDE.

    USE [master]
    GO
    CREATE DATABASE [TDE_Primer] ON 
    ( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TDE_Primer.mdf' ),
    ( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TDE_Primer_log.ldf' )
     FOR ATTACH
    GO
    
    USE TDE_Primer
    go
    SELECT * FROM mytable
    ;
    go
    
    -- begin encryption setup
    -- from http://msdn.microsoft.com/en-us/library/bb934049.aspx
    USE master;
    GO
    -- create master key for master
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'AlwaysU$eaStr0ngP@ssword4This'
    ;
    go
    
    -- create certificate to secure TDE
    CREATE CERTIFICATE TDEPRimer_CertSecurity WITH SUBJECT = 'TDE_Primer DEK Certificate';
    go
    
    USE TDE_Primer;
    GO
    -- Create DEK
    CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_128
    ENCRYPTION BY SERVER CERTIFICATE TDEPRimer_CertSecurity;
    GO
    
    -- backup TDE cert
    USE master
    ;
    go
    BACKUP CERTIFICATE TDEPRimer_CertSecurity
     TO FILE = 'tdeprimer_cert'
      WITH PRIVATE KEY (
                   FILE = 'tdeprimer_cert.pvk',
                   ENCRYPTION BY PASSWORD = 'AStr0ngB@ckUpP@ssw0rd4TDEcERT%')
    ;
    go
    
    -- check encryption status
    SELECT
        db.name,
        db.is_encrypted,
        dm.encryption_state,
        dm.percent_complete,
        dm.key_algorithm,
        dm.key_length
    FROM
        sys.databases db
        LEFT OUTER JOIN sys.dm_database_encryption_keys dm
            ON db.database_id = dm.database_id;
    GO
    
    -- enable encryption
    USE TDE_Primer
    ;
    GO
    ALTER DATABASE TDE_Primer
      SET ENCRYPTION ON;
    GO
    -- check encryption status
    SELECT
        db.name,
        db.is_encrypted,
        dm.encryption_state,
        dm.percent_complete,
        dm.key_algorithm,
        dm.key_length
    FROM
        sys.databases db
        LEFT OUTER JOIN sys.dm_database_encryption_keys dm
            ON db.database_id = dm.database_id;
    GO
    -- TDE_PRimer and tempdb encrypted
    
    -- detach database again.
    -- detach database
    USE [master]
    GO
    EXEC master.dbo.sp_detach_db @dbname = N'TDE_Primer'
    ;
    
    GO

    I won’t go into all the code, but this encrypts the database, backs up the certificate and then detaches it again. There are a few other things, but I cover them in another post.

    Now let’s open up the file in the hex editor again.

    Capture_034

    It looks the same. It’s not in the image, but just below this you can see the database name. There is a header, which is not encrypted. However when I search for my name, it fails.

    Capture_035

    If you scroll further around, you’ll see that most of the file is now encrypted.

    Capture_036

    Play with this and prove to yourself that TDE does really encrypt things.

  • Doing Your Job

    I wish this were the mantra of all people, but certainly those in technology:

    job

  • SQL Saturday #175–Fargo

    One of the goals early on with SQL Saturday was to spread them far and wide. Andy Warren and I used to chat about how long it would be before we had 12 events in a year, or one event a month, or an event in every state. Karla Landrum (b | t) has made many of those milestones come true and is working hard to try and get an event in every state in the US, as well as in as many countries around the world as possible.

    SQL Saturday #175 comes to Fargo, North Dakota, on Saturday, April 27, 2013. The first event in this state, and also my first time visiting the state. I’ll be heading out Friday morning, and seeing what Fargo has to offer that day before talking on Saturday. I may just have to see the Wood Chipper.

    My talk is The Encryption Primer, but there are some other great choices if you’re looking to increase your SQL Server knowledge. The schedule is up and includes these:

    • Aaron King giving you a complete BI solution in an hour.
    • Powershell from Jim Dorame
    • Dimentional Modeling from Jason Horner
    • Indexing from Jes Borland
    • T-SQL from Kathi Kellenberger
    • and more

    Lots of great sessions, and it should be fun.

    If you’re close to Fargo, consider registering and joining us at the first North Dakota SQL Saturday.

  • Customizing SSMS–Results

    This is a short series on some customizations in SSMS to make it visually more appealing.

    As a presenter, I’ve learned how to change the way Management Studio (SSMS) looks to make it easier for people to see the screen on a projector. I had wrongly assumed that so many people knew many of these tricks, which is a poor attitude on my part. That should be especially apparent as I saw a presentation recently where the speaker didn’t know how to make things easier to see.

    In a previous post I talked about changing the query font size. In this post we’ll look at result sizes.

    The Defaults

    This is what I see, and it’s not easy to read.

    Capture_009

    The results are much smaller than the query itself. How can we change this and make things easier to read?

    I wrote about one way: using results to text. This works well, but it isn’t the best solution for everyone, and you still want to change the size of your results. The technique I’ll show you works for that as well.

    Customization

    If you go to the Tools | Options menu, in the Fonts tab as I showed in the last post, you’ll find there’s a drop down titled “Show settings for:” at the top. If you select Grid results, you can change the font settings.

    Capture_006

    The default is 8, and I usually up that a bit.

    Capture_007

    Once that is done, you click OK, and get this note:

    Capture_008

    Make sure your tabs are saved, since you need to restart SSMS. Once you do, your results will be much easier to read.

    Capture_005

    Note that in the drop down for settings, there is an item for “Results to text”. If you change that, your text results will be larger.