SQL Serverのパスワードハッシュアルゴリズム:
hashBytes = 0x0100 | fourByteSalt | SHA1(utf16EncodedPassword+fourByteSalt)
たとえば、パスワードをハッシュするには「正しい馬の電池のステープル」 。まず、ランダムなソルトを生成します:
fourByteSalt = 0x9A664D79;
次に、パスワード(UTF-16でエンコード)をソルトと一緒にハッシュします:
SHA1("correct horse battery staple" + 0x9A66D79);
=SHA1(0x63006F007200720065006300740020006200610074007400650072007900200068006F00720073006500200073007400610070006C006500 0x9A66D79)
=0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
syslogins
に保存されている値 表は次の連結です:
[ヘッダー]+[ソルト]+[ハッシュ]
0x0100
9A664D79
6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
SQL Serverで確認できるもの:
SELECT
name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
WHERE name = 'sa'
name PasswordHash
==== ======================================================
sa 0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
- バージョンヘッダー:
0100
- 塩(4バイト):
9A664D79
- ハッシュ:
6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
(SHA-1は20バイト、160ビット)
検証
同じハッシュを実行してパスワードを検証します:
- 保存された
PasswordHash
からソルトを取得します :0x9A664D79
もう一度ハッシュを実行します:
SHA1("correct horse battery staple" + 0x9A66D79);
これは同じハッシュになり、パスワードが正しいことがわかります。
以前は良かったが、現在は弱い
1999年にSQLServer7で導入されたハッシュアルゴリズムは、1999年に適していました。
- パスワードハッシュがソルトされているのは良いことです。
- 追加するのは良いことです 先頭に追加するのではなく、パスワードにソルトを追加する それ。
しかし、今日それは時代遅れです。ブルートフォース攻撃を阻止するために、ハッシュを1回だけ実行し、数千回実行する必要があります。
実際、MicrosoftのBaseline Security Analyzerは、チェックの一環として、パスワードを総当たり攻撃しようとします。推測すると、パスワードが弱いと報告されます。そして、それはいくらか得ます。
ブルートフォーシング
いくつかのパスワードをテストするのに役立つように:
DECLARE @hash varbinary(max)
SET @hash = 0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
--Header: 0x0100
--Salt: 0x9A664D79
--Hash: 0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
DECLARE @password nvarchar(max)
SET @password = 'password'
SELECT
@password AS CandidatePassword,
@hash AS PasswordHash,
--Header
0x0100
+
--Salt
CONVERT(VARBINARY(4), SUBSTRING(CONVERT(NVARCHAR(MAX), @hash), 2, 2))
+
--SHA1 of Password + Salt
HASHBYTES('SHA1', @password + SUBSTRING(CONVERT(NVARCHAR(MAX), @hash), 2, 2))
SQLServer2012およびSHA-512
SQL Server 2012以降、MicrosoftはSHA-2512ビットの使用に切り替えました:
hashBytes = 0x0200 | fourByteSalt | SHA512(utf16EncodedPassword+fourByteSalt)
バージョンプレフィックスを0x0200
に変更する :
SELECT
name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
name PasswordHash
---- --------------------------------
xkcd 0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
- バージョン:
0200
(SHA-2 256ビット) - 塩:
6A80BA22
- ハッシュ(64バイト):
9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
これは、UTF-16でエンコードされたパスワードをソルトサフィックスでハッシュすることを意味します:
- SHA512(「正しい馬のバッテリーステープル」 +
6A80BA22
) - SHA512(
63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500
+6A80BA22
) -
9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38