sql >> データベース >  >> RDS >> Sqlserver

SQLサーバーからパスワードを復号化する方法は?

    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


    1. シングルトンアプローチでのSQLiteメモリの問題

    2. OracleのDBMS_OUTPUTパッケージについて学ぶ

    3. テーブルから最初のデータのみをクエリします

    4. 統計とクエリストアを待つ