Bagaimana cara menyimpan nama pengguna dan kata sandi ke API dalam opsi wordpress DB?

19

Saat ini saya sedang mengembangkan sebuah plugin dan kemungkinan besar saya akan merilisnya di repositori plugin publik sehingga orang lain dapat menggunakannya.

Plugin akan menggunakan API dan untuk menggunakan API ini Anda harus memberikan nama pengguna dan kata sandi. Jadi plugin saya perlu menyimpan kredensial login ini dalam database. Saya tidak ingin menyimpan ini dalam teks biasa meskipun API membutuhkannya dalam teks biasa.

Jadi pertanyaan saya adalah bagaimana cara menyimpan sedikit informasi sensitif ini? Hashing keluar, jadi harus semacam enkripsi.

Di WordPress adakah kunci unik yang bisa digunakan yang akan berbeda dari blog ke blog? Apa fungsi php yang harus saya gunakan untuk mengenkripsi dan mendekripsi? Saya mencari fungsi yang kemungkinan besar akan berfungsi pada semua instalasi WP.

Brady
sumber
3
Ini agak tidak terpecahkan. Tidak masalah seberapa banyak Anda mengenkripsi jika perlu dibalik. Jika WP dapat mendekripsi dan WP dikompromikan maka enkripsi tidak masalah.
Rarst
Tetapi mengapa API Anda perlu mengetahui kata sandi? Bukankah itu cukup jika API tahu bahwa pengguna tahu kata sandi?
onetrickpony
1
@One Trick Pony - Kata sandi perlu disimpan agar prosesnya dapat otomatis tanpa campur tangan pengguna.
Brady
1
@Rarst - Saya sadar bahwa jika WP dikompromikan maka kata sandinya juga. Saya tidak bisa mencegah ini. Apa yang bisa saya cegah adalah bahwa jika dump SQL diperoleh maka kata sandi tidak dalam teks biasa.
Brady
@ Brady ya, jika hanya SQL dump dikompromikan maka enkripsi akan membantu. Namun saya menemukan skenario seperti itu tidak mungkin. Jika Anda memiliki akses basis data, itu juga mudah untuk berkompromi dengan WP.
Rarst

Jawaban:

4

Sementara saya setuju dengan jawaban sebelumnya, untuk menjawab pertanyaan yang sebenarnya Anda tanyakan, yang muncul di pikiran adalah menggunakan salah satu dari konstanta ini untuk wp-config.php:

define ('AUTH_KEY', 'redacted');
define ('SECURE_AUTH_KEY', 'redacted');
define ('LOGGED_IN_KEY', 'redacted');
define ('NONCE_KEY', 'redacted');

Mereka dimaksudkan untuk menjadi unik di seluruh instalasi wordpress - dan merupakan satu-satunya pilihan untuk kunci yang sudah ada yang dapat ditemukan di wordpress. Alternatifnya adalah dengan menambahkan konstanta serupa Anda sendiri yang dibangun dengan mem-hashing salah satunya terhadap alamat email admin atau sejenis - dan kemudian menyimpannya dalam opsi pengaturan tersembunyi - untuk melindungi dari kehilangan kunci Anda jika seseorang secara tidak sengaja memodifikasi kunci setelah Anda plugin terpasang. Bahayanya adalah, jika mereka tidak dibuat unik pada instalasi awal, tetapi admin / pemilik situs memutuskan untuk memperbaiki kegagalan setelah fakta, mereka tidak seharusnya secara tidak sengaja merusak enkripsi kata sandi Anda.

Adapun fungsi enkripsi / dekripsi - pencarian Google cepat mengembalikan daftar berikut dengan kode yang tampaknya sesuai dengan tagihan: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong- enkripsi-dekripsi-php-fungsi /

fungsi mengenkripsi ($ input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = hash ('sha256', $ key, TRUE);
    return base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ h_key, $ input_string, MCRYPT_MODE_ECB, $ iv));
}

function decrypt ($ encrypted_input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = hash ('sha256', $ key, TRUE);
    trim kembali (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ h_key, base64_decode ($ encrypted_input_string), MCRYPT_MODE_ECB, $ iv));
}

Berikut beberapa dokumentasi enkripsi AES yang digunakan di sini: http://www.chilkatsoft.com/p/php_aes.asp

marfarma
sumber
4

Ini persisnya keadaan yang dirancang untuk OAuth.

Dari beranda OAuth :

Untuk pengembang Penyedia Layanan ...

Jika Anda mendukung ...

  • aplikasi web
  • API sisi server
  • mashup

Jika Anda menyimpan data yang dilindungi atas nama pengguna Anda, mereka tidak boleh menyebarkan kata sandi mereka di web untuk mendapatkan akses ke sana. Gunakan OAuth untuk memberi pengguna Anda akses ke data mereka sambil melindungi kredensial akun mereka.

Keuntungan dari OAuth adalah Anda tidak perlu menyimpan kata sandi pengguna. Ketika mereka pertama kali mengatur plugin, mereka diminta untuk masuk dengan nama pengguna dan kata sandi melalui aplikasi (biasanya sebuah halaman di-host di server yang sama dengan API dan dimuat baik di halaman redirect, thickbox, atau iframe) .

Setelah pengguna masuk, server (sistem Anda) membuat kunci aman yang dapat digunakan sistem mereka (WordPress) untuk berinteraksi dengan API. Kunci ini unik untuk akun pengguna dan situs - dan ini memberikan izin aplikasi (di WordPress) untuk melakukan hal-hal dengan API atas nama pengguna tanpa menyampaikan informasi otentikasi mereka setiap kali.

Jika Anda ingin melihat contoh tindakan ini, periksa Jetpack .

Ketika Anda mengaktifkan plugin, itu mengeluh tidak terhubung. Ketika Anda "menghubungkan" itu, Anda memasukkan kredensial Anda melalui WordPress.com dan mengatur interaksi OAuth antara WordPress dan API mereka.

Tetapi Anda hanya perlu melakukan ini sekali saja dan nama pengguna / kata sandi WordPress.com Anda tidak pernah disimpan dalam basis data WordPress lokal Anda.

EAMann
sumber
1
Akan menyenangkan untuk menggunakan ini tetapi API yang saya tangani bukan milik saya dan mereka tidak memiliki sistem OAuth di tempat.
Brady
1
Dalam hal ini, satu-satunya pilihan nyata Anda adalah menerima bahwa Anda perlu menyimpan kata sandi dalam DB dan apakah Anda mengenkripsi atau tidak benar-benar membuat tidak ada perbedaan yang nyata dengan keamanan. Seperti yang telah disebutkan di atas, jika ada dalam db dan enkripsi dapat dibalikkan, maka siapa pun yang memiliki akses ke WordPress (sah atau diretas) dapat memahami hal itu.
EAMann
0

Ini adalah masalah penting, karena banyak layanan masih tidak mendukung OAuth dan menyimpan kata sandi dalam basis data opsi membuatnya dapat dibaca oleh setiap plugin Wordpress tunggal (lihat komentar saya di atas).

Ini bukan (belum) jawaban nyata untuk pertanyaan, tetapi juga terlalu lama untuk komentar. Saya berharap untuk memulai diskusi dengan ini, dengan tujuan menghasilkan solusi "terbaik" untuk masalah "tidak dapat diselesaikan" ini.

Ide dasar yang membuat saya berpikir bahwa mengenkripsi kata sandi adalah mungkin adalah sebagai berikut:

Ada satu informasi rahasia yang dimiliki setiap pengguna: kata sandi Wordpress mereka. Seharusnya dimungkinkan untuk menyimpan kredensial ke layanan pihak ketiga yang dienkripsi dengan bentuk turunan rahasia kata sandi dan hanya mendekripsi mereka ketika pengguna login.

Dengan cara ini seharusnya dimungkinkan untuk setidaknya membuat tidak mungkin untuk mencuri kata sandi dari salinan file dan database Wordpress. Itu tidak dapat memecahkan masalah plugin lain mencuri kredensial, karena setiap plugin dapat menangkap kata sandi teks biasa saat login.

Sebenarnya dekripsi agak mudah dilakukan: Misalkan kita sudah memiliki versi terenkripsi dari layanan pihak ketiga yang disimpan dalam database, kita dapat menghubungkan ke dalam 'authenticate'filter atau dengan menimpa wp_authenticate()fungsi, menghasilkan hash asin dari kata sandi pengguna teks biasa (oleh berarti wp_hash_password()), simpan kata sandi yang hash sebagai kunci enkripsi di suatu tempat pribadi sampai pengguna logout (gunakan'wp_logout' kait untuk menghapus kunci) dan menggunakannya setiap kali kita membutuhkan kata sandi pihak ketiga untuk mendekripsi nilai terenkripsi dalam database.

Walaupun saya merasa seharusnya membuat ini berhasil, ada beberapa masalah yang belum terpecahkan:

  1. Bagaimana cara melakukan enkripsi? Secara potensial seseorang dapat menyimpan kata sandi teks biasa sampai pengguna keluar dan masuk lagi dan melakukan enkripsi selama 'authenticate'. Pengguna dapat diminta untuk masuk untuk menjaga periode sampai periode ini singkat.
  2. Di mana menyimpan kunci dan cara menghapusnya saat logout? Apakah saya mengerti benar bahwa 'authenticate'hanya berjalan ketika pengguna benar-benar masuk?
  3. Jika sekarang ada cara untuk menyimpan kata sandi hash, mungkin seseorang dapat mengambil kunci dari cookie sesi?
  4. Siapa yang menangani perubahan kata sandi? Sepertinya dimungkinkan untuk mengetahui perubahan kata sandi tersebut, dan kata sandi pihak ketiga kemudian harus dienkripsi ulang dengan kunci yang berasal dari kata sandi baru.
  5. Apakah ada cara untuk memberikan dukungan multi-pengguna? Idealnya seseorang menginginkan pengguna admin untuk dapat mengatur kata sandi pihak ketiga dalam pengaturan yang kemudian dapat dituntut oleh pengguna yang kurang istimewa untuk berinteraksi dengan layanan pihak ketiga, idealnya bahkan tanpa mengungkapkan kata sandi tersebut kepada mereka. Untuk ini, pengguna admin harus dapat membuat kunci untuk semua pengguna yang hanya dapat dihasilkan oleh pengguna lain untuk diri mereka sendiri. Apakah itu mungkin?
cgogolin
sumber