Porting bcrypt.codeplex.com dengan keamanan yang ditingkatkan, perbaikan yang hilang, fitur, dan dukungan .net yang lebih baik.
Unduh menggunakan nuget atau Paket (https://fsprojects.github.io/Paket/)
Paket: https://www.nuget.org/packages/BCrypt.Net-Next/
Paket yang Ditandatangani - https://www.nuget.org/packages/BCrypt.Net-Next.StrongName/
Ada berbagai contoh di folder test-harness dan unit-test kami
Penggunaan paling sederhana adalah sebagai berikut...
Untuk meng-hash kata sandi:
Ruang nama cakupan file ditampilkan; bayangkan tanda kurung kurawal jika perlu.
Top level namespace
namespace DotNetSix ;
using BCrypt . Net ;
string passwordHash = BCrypt . HashPassword ( "my password" ) ;
Karena penamaan perpustakaan jika namespace setelah pernyataan penggunaan, panggilan berubah karena .net gagal menyelesaikan penamaan dengan benar. Saya sarankan daripada memasukkan seluruh namespace Anda cukup menggunakan alias impor seperti di bawah ini.
using BC = BCrypt . Net . BCrypt ;
namespace DotNetSix ;
string passwordHash = BC . HashPassword ( "my password" ) ;
Anda juga dapat melakukan aliasing di level CSProj; dan tidak perlu menambahkan pernyataan penggunaan sama sekali
Contoh ini memungkinkan Anda menggunakan alias BC.HashPassword() dalam kode Anda
< ItemGroup >
<!-- emits global using BcryptNet = global::BCrypt.Net.BCrypt; -->
< Using Include = " BCrypt.Net.BCrypt " Alias = " BC " />
</ ItemGroup >
Versi ini memungkinkan Anda memanggil Verify
dan HashPassword
di basis kode Anda tanpa referensi lain.
< ItemGroup >
<!-- emits global using static global::BCrypt.Net.BCrypt; -->
< Using Include = " BCrypt.Net.BCrypt " Static = " True " />
</ ItemGroup >
Catatan: Meskipun perpustakaan ini memungkinkan Anda untuk menyediakan garam Anda sendiri, sangat disarankan agar Anda mengizinkan perpustakaan untuk menghasilkan garam untuk Anda. Metode ini disediakan untuk menjaga kompatibilitas dan untuk persyaratan lintas platform lebih lanjut yang mungkin memerlukan penggunaannya.
Untuk Memverifikasi kata sandi terhadap hash (dengan asumsi Anda telah menyimpan hash dan mengambilnya dari penyimpanan untuk verifikasi):
Semua catatan sebelumnya tentang penspasian nama juga berlaku di sini
BCrypt . Verify ( "my password" , passwordHash ) ;
Implementasi hashing ini akan menghasilkan garam secara otomatis untuk Anda dengan faktor kerja (2^jumlah putaran) yang disetel ke 11 (yang cocok dengan default di sebagian besar implementasi dan saat ini dipandang sebagai tingkat keamanan/risiko yang baik).
Untuk menghemat perhitungan matematika, tabel kecil yang mencakup iterasi disediakan di bawah ini. Minimum yang diperbolehkan di perpustakaan ini adalah 4 untuk kompatibilitas, maksimum adalah 31 (pada 31 prosesor Anda akan berharap mati).
| Cost | Iterations |
|-------|--------------------------|
| 8 | 256 iterations |
| 9 | 512 iterations |
| 10 | 1,024 iterations |
| 11 | 2,048 iterations |
| 12 | 4,096 iterations |
| 13 | 8,192 iterations |
| 14 | 16,384 iterations |
| 15 | 32,768 iterations |
| 16 | 65,536 iterations |
| 17 | 131,072 iterations |
| 18 | 262,144 iterations |
| 19 | 524,288 iterations |
| 20 | 1,048,576 iterations |
| 21 | 2,097,152 iterations |
| 22 | 4,194,304 iterations |
| 23 | 8,388,608 iterations |
| 24 | 16,777,216 iterations |
| 25 | 33,554,432 iterations |
| 26 | 67,108,864 iterations |
| 27 | 134,217,728 iterations |
| 28 | 268,435,456 iterations |
| 29 | 536,870,912 iterations |
| 30 | 1,073,741,824 iterations |
| 31 | 2,147,483,648 iterations |
etc
dan tolok ukur sederhana yang dapat Anda jalankan dengan membuat program konsol, menambahkan Perpustakaan BCrypt ini dan menggunakan kode ini.
var cost = 16 ;
var timeTarget = 100 ; // Milliseconds
long timeTaken ;
do
{
var sw = Stopwatch . StartNew ( ) ;
BCrypt . HashPassword ( "RwiKnN>9xg3*C)1AZl.)y8f_:GCz,vt3T]PI" , workFactor : cost ) ;
sw . Stop ( ) ;
timeTaken = sw . ElapsedMilliseconds ;
cost -= 1 ;
} while ( ( timeTaken ) >= timeTarget ) ;
Console . WriteLine ( "Appropriate Cost Found: " + ( cost + 1 ) ) ;
Console . ReadLine ( ) ;
Ini akan dimulai pada 16 yaitu 65,536 iterations
dan mengurangi biaya hingga target waktu tercapai. Terserah Anda berapa waktu yang Anda anggap diperbolehkan, tetapi jika di bawah 10, saya sangat menyarankan untuk membiarkannya di 10 dan mungkin berinvestasi dalam paket server yang lebih besar.
Batas kata sandi 56 byte yang direkomendasikan (termasuk byte terminasi nol) untuk bcrypt berkaitan dengan batas 448 bit kunci Blowfish; Setiap byte yang melebihi batas tersebut tidak sepenuhnya tercampur ke dalam hash, sehingga membuat batas absolut 72 byte pada kata sandi bcrypt menjadi kurang relevan mengingat efek aktual byte tersebut terhadap hash yang dihasilkan.
Bahasa lain telah menangani masalah yang dirasakan ini dengan melakukan hashing terlebih dahulu pada frasa sandi/kata sandi untuk meningkatkan entropi yang digunakan, dropbox menjadi salah satu artikel publik mengenai hal ini.
Anda dapat ikut serta dalam hashing yang ditingkatkan hanya dengan menggunakan kode berikut (pada dasarnya mengawali pemanggilan metode dengan Enhanced)
var enhancedHashPassword = BCrypt . EnhancedHashPassword ( myPassword ) ;
var validatePassword = BCrypt . EnhancedVerify ( myPassword , enhancedHashPassword ) ;
Secara default perpustakaan menggunakan hashing SHA384 pada frasa sandi, materi yang dihasilkan kemudian diteruskan ke bcrypt untuk membentuk hash Anda melalui rutinitas bcrypt biasa. Jika Anda ingin menentukan versi SHA yang berbeda, atau hanya ingin secara eksplisit mengatur dalam kode Anda versi yang digunakan seandainya versi tersebut berubah dalam rilis utama perpustakaan, Anda dapat melakukannya dengan menggunakan perubahan berikut di atas.
var enhancedHashPassword = BCrypt . EnhancedHashPassword ( myPassword , hashType : HashType . SHA384 ) ;
var validatePassword = BCrypt . EnhancedVerify ( myPassword , enhancedHashPassword , hashType : HashType . SHA384 ) ;
Mengapa SHA384? Ini memiliki keseimbangan yang baik antara kinerja, keamanan, perlindungan tabrakan dan merupakan satu-satunya versi yang tidak rentan terhadap serangan ekstensi panjang https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash -serangan-ekstensi-panjang.
Haruskah saya menggunakan Entropi yang Ditingkatkan? Anda tidak kehilangan apa pun dengan menggunakannya
Mengapa saya perlu mengubah tipe SHA? Beberapa perpustakaan menyukai hash PassLib menggunakan SHA256, jadi sebagian besar merupakan masalah kompatibilitas. DropBox menggunakan SHA512 jadi jika Anda bekerja di dropbox Anda pasti menginginkan kompatibilitas. Peningkatan ini sebagian besar merupakan ekstensi kenyamanan karena Anda sudah dapat melakukan pra-hash dan meneruskan ke panggilan metode standar.
Apa fungsinya? Kami mengambil byte utf8 kata sandi Anda sebagai inputBytes SHA hash, mengonversinya ke base64 (untuk kompatibilitas dengan implementasi bahasa lain) lalu menggunakan byte tersebut untuk melakukan panggilan bcrypt standar.
Anda memerlukan setidaknya VS2022 dengan SDK saat ini https://www.microsoft.com/net/download;
Paket nuget dapat dibuat dengan menjalankan buildfornuget.cmd
atau
dotnet restore . s rc
dotnet pack . s rc B Crypt.Net --configuration Release
Anda dapat menjalankan pengujian dari folder utama dengan mengetik dotnet test .srcBCrypt.Net.UnitTests
Menjalankan TestGenerateSaltWithMaxWorkFactor
akan memakan waktu lama.
Port .Net jBCrypt diimplementasikan di C#. Ia menggunakan varian jadwal kunci algoritma enkripsi Blowfish, dan memperkenalkan faktor kerja, yang memungkinkan Anda menentukan seberapa mahal fungsi hash, sehingga algoritma tersebut menjadi "tahan di masa depan".
Ini, untuk semua maksud dan tujuan, merupakan port langsung dari jBCrypt yang ditulis oleh Damien Miller. Perbedaan utamanya adalah penambahan beberapa metode kemudahan dan beberapa pemfaktoran ulang ringan. Cara termudah untuk memverifikasi paritas BCrypt.Net dengan jBCrypt adalah dengan membandingkan pengujian unit.
Untuk gambaran umum mengapa BCrypt penting, lihat Cara Menyimpan Kata Sandi dengan Aman. Secara umum, ini adalah algoritme hashing yang dapat disesuaikan seiring waktu agar memerlukan lebih banyak daya CPU untuk menghasilkan hash. Hal ini pada dasarnya memberikan perlindungan terhadap Hukum Moore. Artinya, seiring bertambahnya kecepatan komputer, algoritme ini dapat disesuaikan agar memerlukan lebih banyak daya CPU. Semakin banyak daya CPU yang diperlukan untuk melakukan hash pada kata sandi tertentu, semakin banyak waktu yang harus diinvestasikan oleh "peretas", per kata sandi. Karena "faktor kerja" tertanam dalam hash yang dihasilkan, hash yang dihasilkan oleh algoritme ini kompatibel maju/mundur.
Ia menggunakan varian jadwal kunci algoritma enkripsi Blowfish dan memperkenalkan faktor kerja, yang memungkinkan Anda menentukan seberapa mahal fungsi hash. Karena itu, BCrypt dapat mengikuti hukum Moore. Saat komputer menjadi lebih cepat, Anda dapat meningkatkan faktor kerja dan hash akan menjadi lebih lambat.
Niels Provos dan David Mazières merancang skema crypt() yang disebut bcrypt berdasarkan Blowfish, dan mempresentasikannya di USENIX pada tahun 1999.[14]
Bentuk hash yang dapat dicetak dimulai dengan
$2$ – Currently obsolete
$2a$ – The current key used to identify this scheme.
Since a major security flaw was discovered in 2011 in a third-party implementation of the algorithm,
hashes indicated by this string are now ambiguous and might have been generated by the flawed
implementation, or a subsequent fixed, implementation.
The flaw may be triggered by some password strings containing non-ASCII characters, such as specially
crafted password strings.
$2b$ – Used by some recent implementations which include a mitigation to a wraparound problem.
Previous versions of the algorithm have a problem with long passwords. By design, long passwords
are truncated at 72 characters, but there is an 8-bit wraparound problem with certain password
lengths resulting in weak hashes.
$2x$ – Post-2011 bug discovery, old hashes can be renamed to be $2x$ to indicate that they were generated with
the broken algorithm. These hashes are still weak, but at least it's clear which algorithm was used to
generate them.
$2y$ – Post Post-2011 bug discovery, $2y$ may be used to unambiguously use the new, corrected algorithm. On an
implementation suffering from the bug, $2y$ simply won't work. On a newer, fixed implementation, it will
produce the same result as using $2a$.
Pertama dan terpenting perpustakaan ini berasal dari port jBCrypt dari mindrot
, dan selanjutnya revisi bcrypt disetel agar sesuai, yang dalam hal ini adalah $2a$
. Hal ini telah diubah karena hanya menangani revisi tunggal yang menyebabkan masalah lintas platform dengan implementasi yang dipindahkan mengubah revisinya untuk menangani migrasi dan masalah lainnya.
The original bcrypt code (released in OpenBSD 2.1) identified itself as
$2$. Shortly after release, a bug was fixed and the hash identifier
changed to $2a$. Support for "minor" versions wasn't really
planned, but it was backwards compatible.
Solar Designer wrote a second implementation of bcrypt. This
reimplementation suffered from a flaw dealing with 8 bit characters
and led to the introduction of the 'x' and 'y' flavours. OpenBSD did
not have this problem and supports neither 'x' nor 'y' hash versions.
---
Solar found a bug in their OpenBSD implementation of bcrypt when hashing
long passwords. The length is stored in an unsigned char type, which
will overflow and wrap at 256. Although we consider the existence of
affected hashes very rare, in order to differentiate hashes generated
before and after the fix, we are introducing a new minor 'b'.
OpenBSD 5.5 (coming this spring) will accept and verify 'b' hashes,
although it will still generate 'a' hashes. OpenBSD 5.6 (coming this
fall) will change to generating 'b' hashes by default.
A future release of Solar's bcrypt code should also support 'b'.
Tidak ada perbedaan antara 2a, 2x, 2y, dan 2b. Semuanya menghasilkan hasil yang sama.
catatan rilis ada di sini https://github.com/BcryptNet/bcrypt.net/releases
v4.0.3 - Penambahan penargetan .net 6; merapikan sasaran.
v4.0.2 - Penambahan penargetan .net 5; bungkus kreasi shaxxx
untuk digunakan untuk melepaskan.
v4.0.0 (perubahan yang dapat menyebabkan gangguan) - Bug dalam Enhanced Hashing
ditemukan yang menyebabkan hash yang dibuat tidak dapat dioperasikan di antara bahasa yang berbeda. V4 menyediakan perbaikan untuk ini serta menambahkan vektor pengujian dari PHP dan Python untuk memastikan masalah tetap teratasi di masa mendatang. V4 juga menghapus opsi 384 lama yang ada sebelum Base64 ditambahkan.
v3.5.0 - Bug dalam Enhanced Hashing
ditemukan yang menyebabkan hash yang dibuat tidak dapat dioperasikan di antara bahasa yang berbeda. Sebagai bagian dari rilis perbaikan 3.5 berisi kemampuan untuk Verify
dan HashPassword
diberi parameter v4CompatibleEnhancedEntropy
tambahan. Hal ini memungkinkan pengguna untuk memverifikasi hash yang Ditingkatkan seperti biasa; lalu hash ulang + simpan menggunakan V4. Fungsionalitas ini murni untuk memungkinkan migrasi dan dihapus di V4.
v3.3.3 -Kinerja (pengurangan tumpukan) untuk netcore dan penghapusan regex https://github.com/BcryptNet/bcrypt.net/releases/tag/3.3.0
v2.1.3 -
v2.1.2 -
PasswordNeedsReshash
menjadi PasswordNeedsRehash
v2.1.1 -
v2.1.0 -
PasswordNeedsReshash(string hash, int newMinimumWorkLoad)
sebagai metode pembantu yang dapat digunakan pengembang saat memasukkan pengguna untuk meningkatkan beban kerja lamaValidateAndReplacePassword
untuk memungkinkan validasi dan penggantian kata sandi sebaris. Melempar BcryptAuthenticationException
jika terjadi kegagalan otentikasi.v2.0.1 -
v2.0.0 -
Rilis baru dikemas untuk sebagian besar .net & berisi safe-equals untuk mengurangi risiko serangan waktu https://en.wikipedia.org/wiki/Timing_action / https://cryptocoding.net/index.php/Coding_rules#Compare_secret_strings_in_constant_time Secara teknis, rincian implementasi BCrypt secara teoritis memitigasi serangan waktu. Namun fungsi validasi resmi Bcrypt.net rentan terhadap serangan waktu karena fungsi tersebut kembali segera setelah byte yang tidak cocok ditemukan dalam perbandingan hash.