Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara mendekripsi kata sandi dari SQL server?

Algoritma hashing kata sandi SQL Server:

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

Misalnya, untuk membuat hash sandi "staples baterai kuda yang benar" . Pertama kita buat garam acak:

fourByteSalt = 0x9A664D79;

Dan kemudian hash kata sandi (dikodekan dalam UTF-16) bersama dengan garam:

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

Nilai yang disimpan di syslogins tabel adalah gabungan dari:

[header] + [salt] + [hash]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Yang dapat Anda lihat di SQL Server:

SELECT 
   name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
WHERE name = 'sa'

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Header versi:0100
  • Garam (empat byte):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 adalah 20 byte; 160 bit)

Validasi

Anda memvalidasi kata sandi dengan melakukan hash yang sama:

  • ambil garam dari PasswordHash yang disimpan :0x9A664D79

dan lakukan hash lagi:

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

yang akan keluar dengan hash yang sama, dan Anda tahu kata sandinya benar.

Dulu bagus, tapi sekarang lemah

Algoritme hashing yang diperkenalkan dengan SQL Server 7, pada 1999, bagus untuk 1999.

  • Ada baiknya hash kata sandi diasinkan.
  • Sebaiknya menambahkan garam ke kata sandi, daripada tambahkan dia.

Tapi hari ini sudah ketinggalan zaman. Itu hanya menjalankan hash sekali, di mana ia harus menjalankannya beberapa ribu kali, untuk menggagalkan serangan brute force.

Faktanya, Penganalisis Keamanan Dasar Microsoft akan, sebagai bagian dari pemeriksaannya, mencoba untuk memaksa kata sandi. Jika ada yang menebak, ia melaporkan kata sandinya lemah. Dan memang mendapatkan beberapa.

Pemaksaan Brute

Untuk membantu Anda menguji beberapa sandi:

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 dan SHA-512

Dimulai dengan SQL Server 2012, Microsoft beralih menggunakan SHA-2 512-bit:

hashBytes = 0x0200 | fourByteSalt | SHA512(utf16EncodedPassword+fourByteSalt)

Mengubah awalan versi menjadi 0x0200 :

SELECT 
   name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Versi:0200 (SHA-2 256-bit)
  • Garam:6A80BA22
  • Hash (64 byte):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

Ini berarti kami meng-hash kata sandi yang disandikan UTF-16, dengan akhiran garam:

  • SHA512("staples baterai kuda yang benar" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kunci Asing ke beberapa tabel

  2. 3 Cara Mengekstrak Bulan dari Tanggal di SQL Server (T-SQL)

  3. Gunakan sys.trigger_event_types untuk Mencantumkan Jenis Peristiwa Pemicu di SQL Server

  4. Apakah urutan kolom dalam klausa WHERE penting?

  5. Alat Manajemen SQL Server 2017