web-dev-qa-db-ja.com

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

私はSQL Server 2000でこのクエリを持っています:

select pwdencrypt('AAAA')

「AAAA」の暗号化された文字列を出力します。

 0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D 

どのようにしてOrigin( 'AAAA')からの出力を変換(復号化)できますか?

16
sef

Pwdencryptはハッシュを使用しているため、ハッシュされた文字列を実際に逆にすることはできません。アルゴリズムは不可能に設計されています。

ユーザーが通常の手法で入力したパスワードを検証する場合、それをハッシュし、データベース内のハッシュされたバージョンと比較します。

これは、ユーザーが入力したテーブルを確認する方法です

SELECT password_field FROM mytable WHERE password_field=pwdencrypt(userEnteredValue)

UserEnteredValueを(大きな驚き)ユーザーが入力した値に置き換えます:)

16
Svet

SQL Serverパスワードハッシュアルゴリズム:

hashBytes = 0x0100 | fourByteSalt | SHA1(utf16EncodedPassword+fourByteSalt)

たとえば、パスワードをハッシュするには「正しい馬バッテリーステープル」。まず、ランダムなソルトを生成します:

fourByteSalt = 0x9A664D79;

次に、ソルトとともにパスワード(UTF-16でエンコードされた)をハッシュします。

 SHA1("correct horse battery staple" + 0x9A66D79);
=SHA1(0x63006F007200720065006300740020006200610074007400650072007900200068006F00720073006500200073007400610070006C006500 0x9A66D79)
=0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

sysloginsテーブルに保存される値は、次の連結です。

[ヘッダー] + [塩] + [ハッシュ]
0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

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年にSQL Server 7で導入されたハッシュアルゴリズムは、1999年に適していました。

  • パスワードハッシュがソルト化されていると便利です。
  • prepend itではなく、appendパスワードのソルトにするとよいでしょう。

しかし、今日では時代遅れです。ブルートフォース攻撃を阻止するために、ハッシュを1回だけ実行し、数千回実行する必要があります。

実際、Microsoftのベースラインセキュリティアナライザーは、チェックの一環として、パスワードのブルートフォースを試みます。推測した場合、パスワードは脆弱であると報告します。そして、それはいくらか得ます。

ブルートフォーシング

いくつかのパスワードのテストを支援するには:

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))

SQL Server 2012およびSHA-512

SQL Server 2012以降、MicrosoftはSHA-2 512ビットの使用に切り替えました。

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-bit)
  • ソルト:6A80BA22
  • ハッシュ(64バイト):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

これは、ソルトサフィックスを使用して、UTF-16でエンコードされたパスワードをハッシュすることを意味します。

  • SHA512( "正しい馬バッテリーステープル"+ 6A80BA22
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
20
Ian Boyd

あなたは将来のために自分の背中のためにロッドを作っているかもしれないことに気づきます。 pwdencrypt()およびpwdcompare()は文書化されていない関数であり、SQL Serverの将来のバージョンでは同じように動作しない可能性があります。

DBにアクセスする前に、SHA-2などの予測可能なアルゴリズムを使用してパスワードをハッシュしませんか?

12
Kev

パスワードを暗号化解除するべきではありません。

アプリケーションに入力したパスワードを暗号化し、データベースの暗号化されたパスワードと比較する必要があります。

編集-パスワードが忘れられたためである場合、新しいパスワードを作成するメカニズムをセットアップします。

4
Dynite

簡単な google は、pwdencrypt()が決定論的ではないことを示し、ステートメントselect pwdencrypt( 'AAAA')は、インストール時に異なる値を返します!

この記事も参照してください http://www.theregister.co.uk/2002/07/08/cracking_ms_sql_server_passwords/

1
devio

このパスワードを再度復号化することはできませんが、「pwdcompare」という名前の別の方法があります。 SQL構文で使用する方法の例を次に示します。

USE TEMPDB
GO
declare @hash varbinary (255)
CREATE TABLE tempdb..h (id_num int, hash varbinary (255))
SET @hash = pwdencrypt('123') -- encryption
INSERT INTO tempdb..h (id_num,hash) VALUES (1,@hash)
SET @hash = pwdencrypt('123')
INSERT INTO tempdb..h (id_num,hash) VALUES (2,@hash)
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 2
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
INSERT INTO tempdb..h (id_num,hash) 
VALUES (3,CONVERT(varbinary (255),
0x01002D60BA07FE612C8DE537DF3BFCFA49CD9968324481C1A8A8FE612C8DE537DF3BFCFA49CD9968324481C1A8A8))
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 3
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
DROP TABLE tempdb..h
GO
1
Anheledir