Cara Ruby yang mudah untuk menggunakan Pwned Passwords API.
dokumen API | Repositori GitHub
API Kata Sandi Pwned Troy Hunt memungkinkan Anda memeriksa apakah kata sandi telah ditemukan dalam salah satu pelanggaran data besar.
Pwned
adalah perpustakaan Ruby yang menggunakan model k-Anonimitas API Kata Sandi Pwned untuk menguji kata sandi terhadap API tanpa mengirimkan seluruh kata sandi ke layanan.
Data dari API ini disediakan oleh Apakah saya telah di-pwned?. Sebelum menggunakan API, harap periksa penggunaan dan lisensi API yang dapat diterima.
Berikut adalah postingan blog yang saya tulis tentang cara menggunakan permata ini di aplikasi Ruby Anda untuk membuat kata sandi pengguna Anda lebih baik.
Tambahkan baris ini ke Gemfile aplikasi Anda:
gem 'pwned'
Dan kemudian jalankan:
$ bundle
Atau instal sendiri sebagai:
$ gem install pwned
Ada beberapa cara Anda dapat menggunakan permata ini:
Untuk menguji kata sandi terhadap API, buat instance objek Pwned::Password
lalu tanyakan apakah objek tersebut pwned?
.
password = Pwned :: Password . new ( "password" )
password . pwned?
#=> true
password . pwned_count
#=> 3303003
Anda juga dapat memeriksa berapa kali kata sandi muncul di kumpulan data.
password = Pwned :: Password . new ( "password" )
password . pwned_count
#=> 3303003
Karena Anda mungkin menggunakan ini sebagai bagian dari alur pendaftaran, disarankan agar Anda menyelamatkan kesalahan sehingga jika layanan tidak berfungsi, perjalanan pengguna Anda tidak terganggu.
begin
password = Pwned :: Password . new ( "password" )
password . pwned?
rescue Pwned :: Error => e
# Ummm... don't worry about it, I guess?
end
Seringkali Anda hanya peduli apakah kata sandi telah dibuat sebelumnya atau belum. Anda dapat menggunakan pengakses yang disederhanakan untuk memeriksa apakah kata sandi telah dibuat, atau berapa kali kata sandi dibuat:
Pwned . pwned? ( "password" )
#=> true
Pwned . pwned_count ( "password" )
#=> 3303003
Anda dapat mengatur opsi permintaan HTTP untuk digunakan dengan Net::HTTP.start
saat membuat permintaan ke API. Opsi ini didokumentasikan dalam dokumentasi Net::HTTP.start
.
Anda dapat meneruskan opsi ke konstruktor:
password = Pwned :: Password . new ( "password" , read_timeout : 10 )
Anda juga dapat menentukan default global:
Pwned . default_request_options = { read_timeout : 10 }
Opsi :headers
mendefinisikan header HTTP. Header ini harus berupa kunci string.
password = Pwned :: Password . new ( "password" , headers : {
'User-Agent' => 'Super fun new user agent'
} )
Proksi HTTP dapat diatur menggunakan variabel lingkungan http_proxy
atau HTTP_PROXY
. Ini adalah cara yang sama Net::HTTP
menangani proxy HTTP jika tidak ada opsi proxy yang diberikan. Lihat URI::Generic#find_proxy
untuk detail selengkapnya tentang cara Ruby mendeteksi proxy dari lingkungan.
# Set in the environment
ENV [ "http_proxy" ] = "https://username:[email protected]:12345"
# Will use the above proxy
password = Pwned :: Password . new ( "password" )
Anda dapat menentukan proksi HTTP khusus dengan opsi :proxy
:
password = Pwned :: Password . new (
"password" ,
proxy : "https://username:[email protected]:12345"
)
Jika Anda tidak ingin menyetel proksi dan tidak ingin proksi disimpulkan dari lingkungan, setel kunci :ignore_env_proxy
:
password = Pwned :: Password . new ( "password" , ignore_env_proxy : true )
Ada validator khusus yang tersedia untuk model ActiveRecord Anda:
class User < ApplicationRecord
validates :password , not_pwned : true
# or
validates :password , not_pwned : { message : "has been pwned %{count} times" }
end
Anda dapat mengubah pesan kesalahan menggunakan I18n (gunakan %{count}
untuk menginterpolasi berapa kali kata sandi terlihat dalam pelanggaran data):
en :
errors :
messages :
not_pwned : has been pwned %{count} times
pwned_error : might be pwned
Jika Anda setuju dengan kata sandi yang muncul beberapa kali sebelum Anda memutuskan kata sandi itu tidak valid, Anda dapat menetapkan ambang batas. Validator akan memeriksa apakah pwned_count
lebih besar dari ambang batas.
class User < ApplicationRecord
# The record is marked as valid if the password has been used once in the breached data
validates :password , not_pwned : { threshold : 1 }
end
Secara default, catatan akan dianggap valid ketika kami tidak dapat menjangkau server hasibeenpwned.com. Ini dapat diubah dengan parameter validator :on_error
:
class User < ApplicationRecord
# The record is marked as valid on network errors.
validates :password , not_pwned : true
validates :password , not_pwned : { on_error : :valid }
# The record is marked as invalid on network errors
# (error message "could not be verified against the past data breaches".)
validates :password , not_pwned : { on_error : :invalid }
# The record is marked as invalid on network errors with custom error.
validates :password , not_pwned : { on_error : :invalid , error_message : "might be pwned" }
# We will raise an error on network errors.
# This means that `record.valid?` will raise `Pwned::Error`.
# Not recommended to use in production.
validates :password , not_pwned : { on_error : :raise_error }
# Call custom proc on error. For example, capture errors in Sentry,
# but do not mark the record as invalid.
validates :password , not_pwned : {
on_error : -> ( record , error ) { Raven . capture_exception ( error ) }
}
end
Anda dapat mengonfigurasi permintaan jaringan yang dibuat dari validator menggunakan :request_options
(lihat Net::HTTP.start untuk daftar opsi yang tersedia).
validates :password , not_pwned : {
request_options : {
read_timeout : 5 ,
open_timeout : 1
}
}
Opsi ini mengesampingkan opsi default yang ditentukan secara global (lihat di atas).
Selain opsi tersebut, Anda juga dapat mengatur hal berikut:
Header HTTP dapat ditentukan dengan kunci :headers
(misalnya "User-Agent"
)
validates :password , not_pwned : {
request_options : {
headers : { "User-Agent" => "Super fun user agent" }
}
}
Proksi HTTP dapat diatur menggunakan variabel lingkungan http_proxy
atau HTTP_PROXY
. Ini adalah cara yang sama Net::HTTP
menangani proxy HTTP jika tidak ada opsi proxy yang diberikan. Lihat URI::Generic#find_proxy
untuk detail selengkapnya tentang cara Ruby mendeteksi proxy dari lingkungan.
# Set in the environment
ENV [ "http_proxy" ] = "https://username:[email protected]:12345"
validates :password , not_pwned : true
Anda dapat menentukan proksi HTTP khusus dengan :proxy
:
validates :password , not_pwned : {
request_options : {
proxy : "https://username:[email protected]:12345"
}
}
Jika Anda tidak ingin menyetel proksi dan tidak ingin proksi disimpulkan dari lingkungan, setel kunci :ignore_env_proxy
:
validates :password , not_pwned : {
request_options : {
ignore_env_proxy : true
}
}
Anda mungkin memiliki kasus penggunaan untuk melakukan hashing kata sandi terlebih dahulu, dan kemudian melakukan panggilan ke Pwned Passwords API nanti (misalnya jika Anda ingin memasukkan pekerjaan ke dalam antrean tanpa menyimpan kata sandi teks biasa). Untuk melakukan ini, Anda dapat meng-hash kata sandi dengan metode Pwned.hash_password
dan kemudian menginisialisasi kelas Pwned::HashedPassword
dengan hash, seperti ini:
hashed_password = Pwned . hash_password ( password )
# some time later
Pwned :: HashedPassword . new ( hashed_password , request_options ) . pwned?
Konstruktor Pwned::HashedPassword
mengambil semua opsi yang sama seperti konstruktor Pwned::Password
biasa.
Jika Anda menggunakan Rancangan, saya sarankan Anda menggunakan ekstensi rancang-pwned_password yang sekarang didukung oleh permata ini.
Jika Anda menggunakan Rodauth maka Anda dapat menggunakan fitur rodauth-pwned yang didukung oleh permata ini.
Permata ini menyediakan utilitas baris perintah untuk memeriksa kata sandi. Anda dapat memanggilnya dari aplikasi terminal Anda seperti ini:
$ pwned password
Pwned !
The password has been found in public breaches 3645804 times.
Jika Anda tidak ingin kata sandi yang Anda periksa terlihat, hubungi:
$ pwned --secret
Anda akan dimintai kata sandi, tetapi kata sandi tidak akan ditampilkan.
Untuk mengurangi permintaan jaringan yang tidak perlu, proyek unpwn menggunakan daftar satu juta kata sandi teratas untuk memeriksa kata sandi. Hanya jika kata sandi tidak termasuk dalam jutaan teratas barulah kata sandi tersebut diperiksa dengan API Kata Sandi Pwned.
@daz membagikan contoh fantastis penggunaan permata ini untuk menunjukkan berapa kali digit Pi digunakan sebagai kata sandi dan bocor.
require 'pwned'
PI = '3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111'
for n in 1 .. 40
password = Pwned :: Password . new PI [ 0 .. ( n + 1 ) ]
str = [ n . to_s . rjust ( 2 ) ]
str << ( password . pwned? ? '?' : '?' )
str << password . pwned_count . to_s . rjust ( 4 )
str << password . password
puts str . join ' '
end
Hasilnya mungkin mengejutkan Anda atau mungkin juga tidak.
1 ? 16 3.1
2 ? 238 3.14
3 ? 34 3.141
4 ? 1345 3.1415
5 ? 2552 3.14159
6 ? 791 3.141592
7 ? 9582 3.1415926
8 ? 1591 3.14159265
9 ? 637 3.141592653
10 ? 873 3.1415926535
11 ? 137 3.14159265358
12 ? 103 3.141592653589
13 ? 65 3.1415926535897
14 ? 201 3.14159265358979
15 ? 41 3.141592653589793
16 ? 57 3.1415926535897932
17 ? 28 3.14159265358979323
18 ? 29 3.141592653589793238
19 ? 1 3.1415926535897932384
20 ? 7 3.14159265358979323846
21 ? 5 3.141592653589793238462
22 ? 2 3.1415926535897932384626
23 ? 2 3.14159265358979323846264
24 ? 0 3.141592653589793238462643
25 ? 3 3.1415926535897932384626433
26 ? 0 3.14159265358979323846264338
27 ? 0 3.141592653589793238462643383
28 ? 0 3.1415926535897932384626433832
29 ? 0 3.14159265358979323846264338327
30 ? 0 3.141592653589793238462643383279
31 ? 0 3.1415926535897932384626433832795
32 ? 0 3.14159265358979323846264338327950
33 ? 0 3.141592653589793238462643383279502
34 ? 0 3.1415926535897932384626433832795028
35 ? 0 3.14159265358979323846264338327950288
36 ? 0 3.141592653589793238462643383279502884
37 ? 0 3.1415926535897932384626433832795028841
38 ? 0 3.14159265358979323846264338327950288419
39 ? 0 3.141592653589793238462643383279502884197
40 ? 0 3.1415926535897932384626433832795028841971
Setelah memeriksa repositori, jalankan bin/setup
untuk menginstal dependensi. Kemudian, jalankan rake spec
untuk menjalankan pengujian. Anda juga dapat menjalankan bin/console
untuk perintah interaktif yang memungkinkan Anda bereksperimen.
Untuk memasang permata ini ke mesin lokal Anda, jalankan bundle exec rake install
. Untuk merilis versi baru, perbarui nomor versi di version.rb
, lalu jalankan bundle exec rake release
, yang akan membuat tag git untuk versi tersebut, dorong git commit dan tag, dan dorong file .gem
ke rubygems.org.
Laporan bug dan permintaan penarikan diterima di GitHub di https://github.com/philnash/pwned. Proyek ini dimaksudkan untuk menjadi ruang kolaborasi yang aman dan ramah, dan kontributor diharapkan mematuhi kode etik Perjanjian Kontributor.
Permata ini tersedia sebagai sumber terbuka berdasarkan ketentuan Lisensi MIT.
Setiap orang yang berinteraksi dalam basis kode proyek Pwned, pelacak masalah, ruang obrolan, dan milis diharapkan mengikuti kode etik.