it-swarm-eu.dev

Výběr správného algoritmu ve funkci HashBytes

Pro účely porovnání musíme vytvořit hash hodnotu nvarchar dat. V T-SQL je k dispozici více algoritmů hash, ale který z nich je nejlepší vybrat v tomto scénáři?

Chceme zajistit, aby riziko dvojité hodnoty hash pro dvě různé hodnoty nvarchar bylo minimální. Na základě mého výzkumu na internetu se MD5 jeví jako nejlepší. Je to správně? MSDN nám řekne (níže uvedený odkaz) o dostupných algoritmech, ale žádný popis, který z nich za jakých podmínek?

HASHBYTES (Transact-SQL)

Musíme spojit dvě tabulky ve dvou sloupcích nvarchar (max). Jak si dokážete představit, dotaz trvá po provedení. Mysleli jsme si, že by bylo lepší uchovat hašovací hodnotu každého nvarcharového (max) dat a spojit se s hashovými hodnotami namísto nvarcharových (max) hodnot, které jsou kuličky. Otázkou je, který hashovací algoritmus poskytuje jedinečnost, takže se nehrozí riziko, že jedna hashovací hodnota bude mít více než jednu nvarchar (max).

22
Sky

Funkce HASHBYTES bere jako vstup pouze 8000 bytů. Protože jsou vaše vstupy potenciálně větší, duplikáty v rozsahu pole, které hashed will způsobí kolize, bez ohledu na zvolený algoritmus. Pečlivě zvažte rozsah dat, která hodláte hashovat - pomocí prvních 4000 znaků je volba zřejmé, ale nemusí to být volba nejlepší pro vaše data .

V každém případě, protože je hashovací funkce, i když jsou vstupy 8000 bajtů nebo méně, pouze způsob, jak zajistit 100% správnost výsledků, je porovnání základních hodnot v některých bod (přečteno: ne nutně první). Doba.

Podnik bude diktovat, zda je požadována 100% přesnost. To vám řekne, že je požadováno (a) porovnání základních hodnot , nebo (b) byste měli zvážit ne porovnání základních hodnot - jak velká přesnost by měla být vyměněna za výkon.

Zatímco v jedinečné vstupní sadě jsou možné kolize hashů, jsou nekonečně vzácné, bez ohledu na zvolený algoritmus. Celá myšlenka použití hašovací hodnoty v tomto scénáři je efektivně zúžit výsledky spojení na zvládnutelnější sadu, nikoli nutně okamžité dosažení konečné sady výsledků. Opět platí, že pro 100% přesnost je tento nemůže poslední krok v procesu. Tento scénář nepoužívá hashování za účelem kryptografie, takže algoritmus jako MD5 bude fungovat dobře.

Bylo by pro mě velmi obtížné ospravedlnit přechod na algoritmus SHA-x pro účely „přesnosti“, protože pokud se podnik chystá vyděsit z možností minimálních kolizí MD5, je pravděpodobné, že také vyděsí, že algoritmy SHA-x také nejsou dokonalé. Buď se musí vyrovnat s mírnou nepřesností, nebo nařídit, aby dotaz byl stoprocentně přesný a aby žil se souvisejícími technickými důsledky. Předpokládám, že když generální ředitel spí lépe v noci, protože ví, že jste místo MD5 použili SHA-x, dobře, dobře; v tomto případě to z technického hlediska ještě moc neznamená.

Když už mluvíme o výkonu, pokud jsou tabulky většinou čteny a výsledek spojení je často potřebný, zvažte implementaci indexovaného pohledu, abyste eliminovali potřebu vypočítat celé spojení, kdykoli je to požadováno. Samozřejmě za to vyměníte úložiště, ale může to být dobré pro zlepšení výkonu, zejména pokud je vyžadována 100% přesnost.

Pro další čtení o indexování hodnot dlouhých řetězců jsem publikoval článek , který prochází příkladem, jak to udělat pro jednu tabulku, a předkládá věci, které je třeba zvážit při pokusu o úplný scénář v této otázce.

19
Jon Seigel

MD5 by měl být v pořádku a výstup může být uložen v binárním formátu (16). Pravděpodobnost kolize (viz paradox narozeniny ) je stále velmi nízká, a to i při velké fyzické velikosti vzorku. Výstup SHA-1 trvá 20 bytů a výstup SHA-256 trvá 32 bytů. Pokud nemáte tak velký počet záznamů, že pravděpodobnost kolize vašich narozenin se stane významnou (fyzicky nemožnou nebo alespoň nepraktickou se současnými hardwarovými technologiemi), bude pravděpodobně v pořádku.

Chtěl bych jít se SHA-1, je to lepší z dostupných algoritmů a ze všech je nejmenší pravděpodobnost kolize (2 ^ 51 ve srovnání s MD5, což je 2 ^ 20,96). V určitých scénářích se také ukázalo, že MD5 je zranitelný vůči kolizím.

Zdroje:

http://en.wikipedia.org/wiki/SHA-1http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysishttp: //en.wikipedia.org/wiki/MD5

4
Mr.Brownstone

Neviděl jsem to v odpovědích, ale za MSDN :

Počínaje serverem SQL Server 2016 (13.x) jsou všechny algoritmy jiné než SHA2_256 a SHA2_512 zastaralé. Starší algoritmy (nedoporučují se) budou pokračovat v práci, ale vyvolá událost deprecation.

Zeptal jsem se podobná otázka , takže je jen na vás, zda chcete používat zastaralou funkci, jako je MD5 (pokud jste v roce 2016+). Můžete provést testování a zjistit, jaký je rozdíl v úložišti a výkonu mezi MD5 a SHA2.

0
Gabe