Sample code for 30+ languages & platforms
SQL Server

Encrypting and Decrypting Content

See more XML Examples

Demonstrates how to encrypt and decrypt the content of an XML node using 128-bit CBC AES encryption.

The input XML, available at http://www.chilkatsoft.com/data/fox.xml, is this:

<root>
    <fox1>The quick brown fox jumps over the lazy dog</fox1>
    <fox2>The quick brown fox jumps over the lazy dog
        <child1>ABC</child1>
        <child2>XYZ</child2>
    </fox2>
</root>

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

    DECLARE @xml int
    EXEC @hr = sp_OACreate 'Chilkat.Xml', @xml OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- The sample input XML is available at http://www.chilkatsoft.com/data/fox.xml
    EXEC sp_OAMethod @xml, 'LoadXmlFile', @success OUT, 'fox.xml'
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @xml, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @xml
        RETURN
      END

    -- Navigate to the "fox1" node, which is the 1st child:
    EXEC sp_OAMethod @xml, 'FirstChild2', @success OUT

    -- Encrypt the content:
    EXEC sp_OAMethod @xml, 'EncryptContent', @success OUT, 'myPassword'

    -- Navigate back to the root:
    EXEC sp_OAMethod @xml, 'GetRoot2', NULL

    -- Examine the new XML document:
    EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
    PRINT @sTmp0

    -- This is the XML w/ the encrypted content:
    -- <root>
    --     <fox1>1hTtf7XmO+78H+OIr5eWHIuXxP78KPeYrZbsD0HX4negO9ZRqYMBY4s46sPNp+Q+
    --     </fox1>
    --     <fox2>The quick brown fox jumps over the lazy dog
    --         <child1>ABC</child1>
    --         <child2>XYZ</child2>
    --     </fox2>
    -- </root>

    -- Now decrypt and show that the original content was restored:
    EXEC sp_OAMethod @xml, 'FirstChild2', @success OUT
    EXEC sp_OAMethod @xml, 'DecryptContent', @success OUT, 'myPassword'
    EXEC sp_OAMethod @xml, 'GetRoot2', NULL
    EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
    PRINT @sTmp0

    -- Now encrypt the content of the "fox2" node.
    -- First navigate to the "fox2" child.
    EXEC sp_OAMethod @xml, 'FindChild2', @success OUT, 'fox2'
    EXEC sp_OAMethod @xml, 'EncryptContent', @success OUT, 'myPassword'
    EXEC sp_OAMethod @xml, 'GetRoot2', NULL
    EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
    PRINT @sTmp0

    -- This is the XML w/ the "fox2" encrypted content:

    -- <root>
    --     <fox1>The quick brown fox jumps over the lazy dog</fox1>
    --     <fox2>1hTtf7XmO+78H+OIr5eWHIuXxP78KPeYrZbsD0HX4negO9ZRqYMBY4s46sPNp+Q+
    -- 
    --         <child1>ABC</child1>
    --         <child2>XYZ</child2>
    --     </fox2>
    -- </root>

    -- Notice that the *content* of the node is encrypted.  The child nodes are NOT encrypted.
    -- This is intentional.  To encrypt the content + the subtrees rooted at a given node, 
    -- one would call ZipTree to transform the content and subtrees
    -- to Base64-encoded compressed content, and then call
    -- EncryptContent to encrypt.

    -- Finally, decrypt the "fox2" content:
    EXEC sp_OAMethod @xml, 'FindChild2', @success OUT, 'fox2'
    EXEC sp_OAMethod @xml, 'DecryptContent', @success OUT, 'myPassword'
    EXEC sp_OAMethod @xml, 'GetRoot2', NULL
    EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
    PRINT @sTmp0

    EXEC @hr = sp_OADestroy @xml


END
GO