2016-04-29 15 views
1

OracleとSQL Serverの間でETLプロセス(プライマリキーなし - トランザクションレプリケーションなし)を行い、MD5ハッシュを使用してソースとデスティネーションデータベースの違いを検出しています。SQL Serverハッシュバイスと拡張Ascii

これは、データが最初の127文字のASCII文字に該当するレコードでは問題ありません。しかし、,°または©のような '拡張ascii' *文字がある場合、SQL ServerのHASHBYTES関数はこれらの文字を非標準的な方法でハッシュします(つまり、OracleのDBMS_CRYPTO.Hash、.Net暗号化ライブラリなどとは異なります)。

だから私は、Oracleでこれを実行すると:

select rawtohex(
DBMS_CRYPTO.Hash (
    UTL_I18N.STRING_TO_RAW ('°', 'AL32UTF8'), 
    2) 
) from dual; 

私が取得:4723EB5AA8B0CD28C7E09433839B8FAE

そして私は、SQL Serverでこれを実行すると:EC655B6DA8B9264A7C7C5E1A70642FA7

そして、私はこのC#のコードを実行する場合:

SELECT HASHBYTES('md5', '°'); 

私が手

string password = "°"; 

// byte array representation of that string 
byte[] encodedPassword = new UTF8Encoding().GetBytes(password); 

// need MD5 to calculate the hash 
byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword); 

// string representation (similar to UNIX format) 
string encoded = BitConverter.ToString(hash) 
    // without dashes 
    .Replace("-", string.Empty) 
    // make lowercase 
    .ToLower(); 

を私は4723EB5AA8B0CD28C7E09433839B8FAEを得ると同じすなわちオラクルと私が使用したすべてのオンラインツールで。

この問題のSQLベースのソリューションはありますか、またはCLRストアドプロシージャを作成し、そこにデータをハッシュする必要がありますか?


*私は今のようにMS SQL Serverには、UTF-8のサポートはありません用語は

+1

MD5は、MD5で出​​力が異なる場合は、入力が異なる - 場合入力は、入力のバイナリ解釈に関連するエンコーディングの問題と同じに見えます。そのようなHASHBYTES()コールの入力と出力を期待どおりの結果とともに表示できますか? –

+1

SQL Serverは、ISO-8859-1、 'HASHBYTES(' md5 '、N'° ');と解釈される文字列のハッシュを返すと、Oracleで使用できる場合はUTF16結果が返されますか? –

+1

[C#.NET md5とは異なるTSQL md5ハッシュ]の重複の可能性があります(http://stackoverflow.com/questions/27908449/tsql-md5-hash-different-to-c-sharp-net-md5) –

答えて

0

using System; 
using System.Security.Cryptography; 
using System.Text; 
using Microsoft.SqlServer.Server; 

public class Functions 
{ 
    [SqlFunction] 
    public static string GetMD5Hash (string input) 
    { 
    var encodedPassword = new UTF8Encoding().GetBytes(input); 

    var hash = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword); 

    return BitConverter.ToString(hash).Replace("-", string.Empty); 
    } 
} 
2

多少議論があることを認識しています。このため、ソース文字列を最も一般的な分母(この場合はUTF-16(おそらく))に切り替えるまで、ハッシュは常に異なります。

私はネット暗号化ライブラリを使用するCLRストアドプロシージャを実装することによって、拡張ASCIIのSQL Serverの治療の周りに決めた
関連する問題