Qual è il modo corretto per importare tutti gli utenti Discourse esistenti in intercoin.app da Discourse? Esiste una sorta di endpoint REST che restituisce tutti gli utenti con le loro password hashate e i salt, tra le altre cose? Qual è il link all’algoritmo di hash su GitHub? Dovrò codificare dalla nostra parte, per utilizzare lo stesso algoritmo di hash con la password e il salt inseriti, se il nostro non dovesse funzionare, per consentire a questi ragazzi di accedere. Penso che il punto #2 sia rilevante ogni volta che un utente Discourse attiva l’SSO in seguito (come stiamo facendo noi), quindi risolverlo aiuterebbe anche altri utenti Discourse.
Eccellente! Ora qual è l’endpoint HTTP che devo chiamare per ottenere tutte le informazioni dell’utente, inclusi hash della password e salt?
Immagino che non ce ne sia uno da servire al pubblico in generale (perché rendere più facile hackerare le persone?) Quindi cosa posso fare? Connettersi al database MySQL? Scrivere un plugin Discourse?
Ho appena parlato con il nostro team e sono d’accordo, sono disposto a pagare qualcuno per creare un piccolo plugin Discourse che esponga tramite un endpoint alcune informazioni JSON su un utente, dato il suo indirizzo email.
Quindi dato un’email il plugin cercherà semplicemente nella tabella user_email per posta, troverà user_id e prenderà la riga dell’utente, e invierà tutti i campi “sicuri”, incluso il sale.
Per maggiore sicurezza, le richieste possono essere firmate tramite HMAC utilizzando un segreto condiviso che può essere fornito al plugin.
Qualcuno vuole realizzarlo? Mandami un messaggio o rispondi qui e fammi sapere come contattarti. Si spera che sia semplice (un paio di SELECT e un controllo per HMAC se il segreto è stato impostato). Leggeremo il JSON.
La libreria xorcist è solo un xor di stringa più veloce, giusto? Cosa succede se uno dei caratteri risulta essere 0 perché ‘a’ è stato xor con ‘a’? Le stringhe non sono terminate da null?
Il mio obiettivo è portarlo in PHP, quindi qualsiasi cosa tu possa fare per aiutarmi (come darmi informazioni su come replicarlo in PHP) sarà molto utile.
Inoltre, cosa sta facendo questa riga? ret.bytes.map { |b| (\"0\" + b.to_s(16))[-2..-1] }.join(\"\")
Sì! Sono riuscito a creare uno script che scorre tutti gli utenti di Discourse e li importa sulla nostra piattaforma con il loro hash della passphrase.
Presto potremo consentire a chiunque abbia un forum Discourse di aggiungere anche Eventi, Videoconferenze, Media e altro, con Discourse che risiede nella scheda “Discuss”. Puoi vedere il risultato su https://intercoin.app
In pratica, trasformiamo qualsiasi installazione di Discourse in un social network moderno alla Facebook. Abbiamo lavorato per anni su queste funzionalità e ora vogliamo integrarle strettamente anche con Discourse e Wordpress. In modo che le persone possano combinare Wordpress, Discourse e Qbix e auto-ospitare la loro intera community.
In Qbix, effettuiamo l’hashing della password sul client almeno con sha1(password + userId) prima di inviarla al server. Anche quando è https. Lo facciamo in modo che il server o qualsiasi MITM NON abbia MAI la password, per riutilizzarla su più siti. Ma Discourse invia semplicemente la password al server. Quindi abbiamo dovuto disattivare questo hashing sul lato client. È possibile eseguire alcune iterazioni di hash_pbkdf2 sul lato client e il resto sul lato server? Ho provato e non sembra corrispondere:
Sarebbe possibile utilizzare semplicemente Discourse come Provider SSO, invece di usare il nostro sito come provider SSO? Allora gli host dei forum Discourse sarebbero ancora più propensi ad espanderlo con le funzionalità di Qbix, dato che il login rimarrebbe esattamente lo stesso, e dal lato di Discourse. Facebook, Google e chiunque altro. Esiste una documentazione su che tipo di informazioni restituisce Discourse Connect come Provider SSO al nostro sito consumer? Include cose come la foto che possiamo scaricare, il nome, il cognome e almeno il nome utente?
A dire il vero, non credo che l’invio di una password tramite HTTPS da parte di Discourse sia la tua più grande sfida di sicurezza in questo momento.
Certo. Penso che otterrai la maggior parte delle cose nel serializzatore utente standard.
Ma se non bastasse, puoi sempre usare l’API per recuperare maggiori informazioni da Discourse.
Consiglierei a Discourse di hashare le cose con un salt (userId funziona) prima di inviare la password attraverso la rete. Perché no? Non deve diventare incompatibile con ciò che stai memorizzando nel database ora. Semplicemente fai le prime 100 iterazioni in Javascript, poi sottrai 10 da 64000. Hai un’implementazione personalizzata comunque (copiata da rails) quindi invieresti semplicemente una variabile isHashed, e se è vera, allora fai solo gli “ultimi” 64K-10 passaggi.
L’ID utente non è noto prima del login, quindi non funzionerà…
10 iterazioni non sono sicure e 63990 iterazioni sono meno sicure di 64000 iterazioni. Quindi, sebbene sia marginale, sembra che tu stia sostituendo un metodo sicuro con due metodi meno sicuri e molta complessità aggiuntiva.