Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) Duplicate .NET's Rfc2898DeriveBytes FunctionalityDemonstrates how to duplicate the results produced by .NET's System.Security.Cryptography.Rfc2898DeriveBytes class.
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int -- This example assumes Chilkat Crypt2 to have been previously unlocked. -- See Unlock Crypt2 for sample code. -- This example demonstrates how to duplicate the results produced -- by .NET's System.Security.Cryptography.Rfc2898DeriveBytes class. -- For example, here is C# code that transforms a password string into -- bytes that can be used as a secret key for symmetric encryption (such as AES, blowfish, 3DES, etc.) -- -- Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes("secret", System.Text.Encoding.UTF8.GetBytes("saltsalt123"), numIterations); -- byte[] secretKeyBytes = deriveBytes.GetBytes(numBytes); -- (The Rfc2898DeriveBytes computation is really just the PBKDF2 algorithm with SHA-1 hashing.) -- In Chilkat, this is what we do to match... -- First, let's get a test vector with known results. Both Chilkat AND Microsoft should produce -- the same results. RFC 6070 has some PBKDF2 HMAC-SHA1 Test Vectors. Here is one of them: -- Input: -- P = "passwordPASSWORDpassword" (24 octets) -- S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" (36 octets) -- c = 4096 -- dkLen = 25 -- -- Output: -- DK = 3d 2e ec 4f e4 1c 84 9b -- 80 c8 d8 36 62 c0 e4 4a -- 8b 29 1a 96 4c f2 f0 70 -- 38 (25 octets) -- -- DECLARE @crypt int -- Use "Chilkat_9_5_0.Crypt2" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Crypt2', @crypt OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END DECLARE @salt nvarchar(4000) SELECT @salt = 'saltSALTsaltSALTsaltSALTsaltSALTsalt' -- Given that the salt is really binary data (can be any random bunch of bytes), -- we must pass the exact hex string representation of the salt bytes. -- In this case, we're getting the utf-8 byte representation of our salt string, -- which is identical to the us-ascii byte representation because there are no 8bit chars.. DECLARE @saltHex nvarchar(4000) EXEC sp_OAMethod @crypt, 'EncodeString', @saltHex OUT, @salt, 'utf-8', 'hex' -- Duplicate the test vector as shown above. DECLARE @dkHex nvarchar(4000) EXEC sp_OAMethod @crypt, 'Pbkdf2', @dkHex OUT, 'passwordPASSWORDpassword', 'utf-8', 'sha1', @saltHex, 4096, 25 * 8, 'hex' PRINT @dkHex EXEC @hr = sp_OADestroy @crypt END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.