SHA-512 알고리즘을 사용하여 SQL Server 2008에서 암호 해시 및 암호 해독 솔루션을 구현하려고합니다. 이 솔루션은 Michael Coles의 저서 "Expert SQL Server 2008 Encryption"을 기반으로합니다. 그의 예제를 기반으로 Visual Studio 2010 (C#의 .NET 3.5)에서 프로젝트를 빌드하고 SQL Server 2008에 배포 할 수 있습니다 (아래 코드 참조).SQL Server 2008의 암호 해시 CLR
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Cryptography;
namespace Apress.Samples
{
public partial class CustomEncryption
{
[Microsoft.SqlServer.Server.SqlFunction
(
IsDeterministic = true,
DataAccess = DataAccessKind.None
)]
public static SqlBytes SaltedHash
(
SqlString Algorithm,
[SqlFacet(MaxSize = -1)] SqlBytes PlainText,
SqlBytes Salt
)
{
// Return NULL if any of the parameters is NULL
if (Algorithm.IsNull || PlainText.IsNull || Salt.IsNull)
return SqlBytes.Null;
// Determine which algorithm to use
bool HashDefined = true;
HashAlgorithm Hash = null;
switch (Algorithm.Value.ToUpper())
{
case "SHA256":
Hash = new SHA256Managed();
break;
case "SHA384":
Hash = new SHA384Managed();
break;
case "SHA512":
Hash = new SHA512Managed();
break;
default:
HashDefined = false;
break;
}
if (!HashDefined)
throw new Exception
("Unsupported hash algorithm - use SHA256, SHA384 or SHA512");
// Combine the plaintext with the salt
byte[] PlainTextWithSalt = new byte[PlainText.Length + Salt.Length];
for (long i = 0; i < Salt.Length; i++)
PlainTextWithSalt[i] = Salt[i];
for (long i = Salt.Length; i < PlainText.Length; i++)
PlainTextWithSalt[i] = PlainText.Value[i - Salt.Length];
// Generate the hash and return the result
byte[] HashBytes = Hash.ComputeHash(PlainTextWithSalt);
return new SqlBytes(HashBytes);
}
}
}
아래 코드를 사용하여 SQL에서 테스트를 수행하면 각 알고리즘에 대해 예상대로 해시가 생성됩니다.
DECLARE @plaintext varchar(15);
SET @plaintext = 'ABCDEFGHIJ';
DECLARE @salt varbinary(16);
SET @salt = Crypt_Gen_Random(16);
DECLARE @sha256 varbinary(32)
DECLARE @sha384 varbinary(48)
DECLARE @sha512 varbinary(64)
SELECT @sha256 = dbo.SaltedHash('SHA256', CAST(@plaintext AS varbinary(max)), @salt);
SELECT @sha384 = dbo.SaltedHash('SHA384', CAST(@plaintext AS varbinary(max)), @salt);
SELECT @sha512 = dbo.SaltedHash('SHA512', CAST(@plaintext AS varbinary(max)), @salt);
SELECT 'SHA-256' AS algorithm, @sha256 AS hash
UNION ALL
SELECT 'SHA-384', @sha384
UNION ALL
SELECT 'SHA-512', @sha512;
난 내가 사용자 레코드에 저장되는 소금 값을 검색하고 SaltedHash 기능, 그것은 것까지 함께 전달할 필요가 있으리라 믿고있어 로그인을, 검증을 위해 이것을 사용하고 싶습니다 해시 된 값을 리턴하십시오. 거기에서, 나는 함수에 의해 반환 된 해시 된 값을 사용자 레코드에 저장된 해쉬 된 값과 비교할 것이다.
내가 겪고있는 문제는 평문 ('ABCDEFGHIJ')와 함께 하드 코딩 된 소금 값 ('0x0E5ECC235FF6BD7337FFDDE5799D4EEA')을 전달하여 테스트 할 때 해시 된 값 (예 : 해시 암호 비교)을 시뮬레이트하는 경우입니다. 동일한 하드 코딩 된 소금 값을 사용하여 ('1234567890')의 일반 텍스트 값을 제공하면 정확히 동일한 해시 값을 반환합니다. 사실, 10 문자의 일반 텍스트 값은 동일한 해시 값을 반환합니다.
DECLARE @plaintext varchar(15);
SET @plaintext = 'ABCDE12345';
DECLARE @salt varbinary(16);
SET @salt = 0x0E5ECC235FF6BD7337FFDDE5799D4EEA; // Hardcoded salt value!
SELECT @salt
DECLARE @sha256 varbinary(32)
DECLARE @sha384 varbinary(48)
DECLARE @sha512 varbinary(64)
SELECT @sha256 = dbo.SaltedHash('SHA256', CAST(@plaintext AS varbinary(max)), @salt);
SELECT @sha384 = dbo.SaltedHash('SHA384', CAST(@plaintext AS varbinary(max)), @salt);
SELECT @sha512 = dbo.SaltedHash('SHA512', CAST(@plaintext AS varbinary(max)), @salt);
SELECT 'SHA-256' AS algorithm, @sha256 AS hash
UNION ALL
SELECT 'SHA-384', @sha384
UNION ALL
SELECT 'SHA-512', @sha512;
"평문과 소금을 결합하는"코드에 문제가 있다고 가정하고 있지만 확실하지 않습니다.
이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
소금이 최종 솔루션에 하드 코드 된 경우 소금이 아닙니다. 그것은 [Pepper] (http://security.stackexchange.com/questions/3272/password-hashing-add-salt-pepper-or-is-salt-enough) 일 것이며, 소금은 암호마다 고유하므로 일반적으로 cyphertext의 bytearray의 앞이나 뒤쪽에있는 다음 열에 소금을 보관하거나 병합하십시오. –
'Pepper'에 익숙하지 않아서 고맙습니다. 내 의도는 당신이 제안한대로 비밀 번호 당 고유 한 소금을 만드는 것입니다. – vanexellent