mirror of
https://github.com/RoboSats/robosats.git
synced 2024-12-14 03:16:24 +00:00
Add new PGP keys validation on backend. Raise default bond size to 3% and minimum to 2%
This commit is contained in:
parent
9c343c8428
commit
7623d30670
@ -56,8 +56,8 @@ FEE = 0.002
|
|||||||
MAKER_FEE_SPLIT=0.125
|
MAKER_FEE_SPLIT=0.125
|
||||||
|
|
||||||
# Bond size as percentage (%)
|
# Bond size as percentage (%)
|
||||||
DEFAULT_BOND_SIZE = 1
|
DEFAULT_BOND_SIZE = 3
|
||||||
MIN_BOND_SIZE = 1
|
MIN_BOND_SIZE = 2
|
||||||
MAX_BOND_SIZE = 15
|
MAX_BOND_SIZE = 15
|
||||||
|
|
||||||
# Time out penalty for canceling takers in SECONDS
|
# Time out penalty for canceling takers in SECONDS
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
from tkinter import N
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from api.lightning.node import LNNode
|
from api.lightning.node import LNNode
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
@ -98,35 +99,42 @@ class Logics:
|
|||||||
enc_priv_key = enc_priv_key.replace('\r\n', '\n')
|
enc_priv_key = enc_priv_key.replace('\r\n', '\n')
|
||||||
pub_key = pub_key.replace('\r\n', '\n')
|
pub_key = pub_key.replace('\r\n', '\n')
|
||||||
|
|
||||||
# Try to import and export the public key (without passphrase)
|
# Try to import the public key
|
||||||
try:
|
import_pub_result = gpg.import_keys(pub_key)
|
||||||
import_pub_result = gpg.import_keys(pub_key)
|
if not import_pub_result.imported == 1:
|
||||||
pub_key = gpg.export_keys(import_pub_result.fingerprints[0])
|
|
||||||
except Exception as e:
|
|
||||||
e = "Your system time might be in the future " if str(e)=="list index out of range" else str(e)
|
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
{
|
{
|
||||||
"bad_request":
|
"bad_request":
|
||||||
f"Your PGP public key does not seem valid. Error: {str(e)}"
|
f"Your PGP public key does not seem valid.\n"+
|
||||||
|
f"Stderr: {str(import_pub_result.stderr)}\n"+
|
||||||
|
f"ReturnCode: {str(import_pub_result.returncode)}\n"+
|
||||||
|
f"Summary: {str(import_pub_result.summary)}\n"+
|
||||||
|
f"Results: {str(import_pub_result.results)}\n"+
|
||||||
|
f"Imported: {str(import_pub_result.imported)}\n"
|
||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
None)
|
None)
|
||||||
|
# Exports the public key again for uniform formatting.
|
||||||
|
pub_key = gpg.export_keys(import_pub_result.fingerprints[0])
|
||||||
|
|
||||||
# Try to import the encrypted private key (without passphrase)
|
# Try to import the encrypted private key (without passphrase)
|
||||||
try:
|
import_priv_result = gpg.import_keys(enc_priv_key)
|
||||||
import_priv_result = gpg.import_keys(enc_priv_key)
|
if not import_priv_result.sec_imported == 1:
|
||||||
except Exception as e:
|
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
{
|
{
|
||||||
"bad_request":
|
"bad_request":
|
||||||
f"Your PGP private key does not seem valid. Exception: {str(e)}"
|
f"Your PGP encrypted private key does not seem valid.\n"+
|
||||||
|
f"Stderr: {str(import_priv_result.stderr)}\n"+
|
||||||
|
f"ReturnCode: {str(import_priv_result.returncode)}\n"+
|
||||||
|
f"Summary: {str(import_priv_result.summary)}\n"+
|
||||||
|
f"Results: {str(import_priv_result.results)}\n"+
|
||||||
|
f"Sec Imported: {str(import_priv_result.sec_imported)}\n"
|
||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
None)
|
None)
|
||||||
|
|
||||||
|
|
||||||
return True, None, pub_key, enc_priv_key
|
return True, None, pub_key, enc_priv_key
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -95,7 +95,7 @@ Every order has an expiration counter. By default, in RoboSats v0.1.0 new orders
|
|||||||
|
|
||||||
When you are decided for an order to take simply tap the "Take Order" button. You will see the contract box. Follow the contract box indications until you complete the trade! :)
|
When you are decided for an order to take simply tap the "Take Order" button. You will see the contract box. Follow the contract box indications until you complete the trade! :)
|
||||||
|
|
||||||
First thing is to lock a small fidelity bond (just 1% of the trade amount), so the seller knows you can be trusted. The satoshis in this bond will just freeze in your wallet. If you try to cheat or cancel unilaterally, you will lose the satoshis locked in the bond.
|
First thing is to lock a small fidelity bond (just 3% of the trade amount by default), so the seller knows you can be trusted. The satoshis in this bond will just freeze in your wallet. If you try to cheat or cancel unilaterally, you will lose the satoshis locked in the bond.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="/assets/images/how-to-use/contract-box-1.png" width="370" />
|
<img src="/assets/images/how-to-use/contract-box-1.png" width="370" />
|
||||||
|
@ -97,7 +97,7 @@ Jedes Angebot hat einen Verfallszähler. In RoboSats v0.1.0 bleiben neue Angebot
|
|||||||
|
|
||||||
Wenn du dich für ein Angebot entschieden hast, tippe einfach auf die Schaltfläche "Take Order". Du siehst dann die Kontraktbox. Folge den Anweisungen der Kontraktbox, bis du den Handel abgeschlossen hast! :)
|
Wenn du dich für ein Angebot entschieden hast, tippe einfach auf die Schaltfläche "Take Order". Du siehst dann die Kontraktbox. Folge den Anweisungen der Kontraktbox, bis du den Handel abgeschlossen hast! :)
|
||||||
|
|
||||||
Als erstes musst du eine kleine Kaution hinterlegen (nur 1% des Handelsbetrags), damit der Verkäufer weiß, dass du vertrauenswürdig bist. Die Satoshis in dieser Kaution werden einfach in deiner Wallet eingefroren. Wenn du versuchst zu betrügen oder einseitig zu kündigen, verlierst du die in der Kaution enthaltenen Satoshis.
|
Als erstes musst du eine kleine Kaution hinterlegen (nur 3% des Handelsbetrags), damit der Verkäufer weiß, dass du vertrauenswürdig bist. Die Satoshis in dieser Kaution werden einfach in deiner Wallet eingefroren. Wenn du versuchst zu betrügen oder einseitig zu kündigen, verlierst du die in der Kaution enthaltenen Satoshis.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="/assets/images/how-to-use/contract-box-1.png" width="370" />
|
<img src="/assets/images/how-to-use/contract-box-1.png" width="370" />
|
||||||
|
@ -159,7 +159,7 @@ Al crear una orden, solo es requerido especificar la moneda, el tipo de orden (c
|
|||||||
<img src="/assets/images/how-to-use/contract-box-7.png" width="370" />
|
<img src="/assets/images/how-to-use/contract-box-7.png" width="370" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Debes copiar o escanear la factura con tu billetera lightning para bloquear tu fianza de fidelidad como creador (1% del valor total de la transacción). Al bloquear esta fianza, los compradores perciben que eres de fiar y se comprometen a seguir con el intercambio. En tu billetera puede mostrarse como un pago en tránsito, congelarse o incluso aparentemente romper tu billetera. Siempre debes verificar en la web de RoboSats si el depósito ha sido bloqueado (¡tu billetera probablemente no te lo dirá! Comprueba la [lista de compatibilidad de billeteras](https://github.com/Reckless-Satoshi/robosats/issues/44))
|
Debes copiar o escanear la factura con tu billetera lightning para bloquear tu fianza de fidelidad como creador (3% del valor total de la transacción por defecto). Al bloquear esta fianza, los compradores perciben que eres de fiar y se comprometen a seguir con el intercambio. En tu billetera puede mostrarse como un pago en tránsito, congelarse o incluso aparentemente romper tu billetera. Siempre debes verificar en la web de RoboSats si el depósito ha sido bloqueado (¡tu billetera probablemente no te lo dirá! Comprueba la [lista de compatibilidad de billeteras](https://github.com/Reckless-Satoshi/robosats/issues/44))
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="/assets/images/how-to-use/contract-box-8.png" width="370" />
|
<img src="/assets/images/how-to-use/contract-box-8.png" width="370" />
|
||||||
|
@ -18,4 +18,4 @@ RUN npm install
|
|||||||
|
|
||||||
# launch
|
# launch
|
||||||
|
|
||||||
CMD ["npm", "run", "dev"]
|
CMD ["npm", "run", "build"]
|
@ -52,7 +52,7 @@ class MakerPage extends Component {
|
|||||||
publicExpiryTime: new Date(0, 0, 0, 23, 59),
|
publicExpiryTime: new Date(0, 0, 0, 23, 59),
|
||||||
escrowExpiryTime: new Date(0, 0, 0, 3, 0),
|
escrowExpiryTime: new Date(0, 0, 0, 3, 0),
|
||||||
enableAmountRange: false,
|
enableAmountRange: false,
|
||||||
bondSize: 1,
|
bondSize: 3,
|
||||||
limits: null,
|
limits: null,
|
||||||
minAmount: "",
|
minAmount: "",
|
||||||
maxAmount: "",
|
maxAmount: "",
|
||||||
@ -655,12 +655,12 @@ class MakerPage extends Component {
|
|||||||
<Slider
|
<Slider
|
||||||
sx={{width:220, align:"center"}}
|
sx={{width:220, align:"center"}}
|
||||||
aria-label="Bond Size (%)"
|
aria-label="Bond Size (%)"
|
||||||
defaultValue={1}
|
defaultValue={3}
|
||||||
valueLabelDisplay="auto"
|
valueLabelDisplay="auto"
|
||||||
valueLabelFormat={(x) => (x+'%')}
|
valueLabelFormat={(x) => (x+'%')}
|
||||||
step={0.25}
|
step={0.25}
|
||||||
marks={[{value: 1,label: '1%'},{value: 5,label: '5%'},{value: 10,label: '10%'},{value: 15,label: '15%'}]}
|
marks={[{value: 2,label: '2%'},{value: 5,label: '5%'},{value: 10,label: '10%'},{value: 15,label: '15%'}]}
|
||||||
min={1}
|
min={2}
|
||||||
max={15}
|
max={15}
|
||||||
onChange={(e) => this.setState({bondSize: e.target.value})}
|
onChange={(e) => this.setState({bondSize: e.target.value})}
|
||||||
/>
|
/>
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
# Cómo usar OpenKeychain para cifrar datos sensibles al usar RoboSats.
|
|
||||||
|
|
||||||
## ¿Por qué es necesaria la encriptación?
|
|
||||||
|
|
||||||
Dado que RoboSats funciona a través de la red Tor, todas las comunicaciones están cifradas de extremo a extremo. Esto ayuda a prevenir ataques de intermediarios que podrían leer o manipular datos durante su transmisión. Además, el protocolo Tor asegura que el usuario esté conectado al nombre de dominio en la barra de direcciones del navegador, en este caso la dirección Tor oficial de RoboSats (robosats6tkf3eva7x2voqso3a5wcorsnw34jveyxfqi2fu7oyheasid.onion). Sin embargo, en RoboSats v0.1.0, los datos se transfieren como texto sin formato a través del front-end (la interfaz de usuario) y el back-end (administración) de la aplicación. Esto podría hacer que los datos confidenciales como la información del pago en fiat (ARS, EUR, USD, …) puedan ser interceptados por un rastreador malicioso en el dispositivo de cualquiera de las partes o incluso en el servidor de RoboSats en la capa de abstracción de la aplicación. Esto supondría un ataque a la privacidad del titular de los datos. Incluso si el chat de RoboSats estuviera completamente encriptado en cada paso, no deberías confiar en que los datos confidenciales estén encriptados. La mejor práctica para evitar este problema es usar encriptación asimétrica durante el intercambio de datos confidenciales. Esta guía detalla un método que garantiza la confidencialidad de los datos personales utilizando el estándar PGP.
|
|
||||||
|
|
||||||
## La aplicación OpenKeychain.
|
|
||||||
|
|
||||||
OpenKeychain es una aplicación de Android de código abierto que permite crear y administrar pares de claves criptográficas y firmar y/o cifrar/descifrar texto y archivos. OpenKeychain se basa en el estándar OpenPGP que hace que el cifrado sea compatible en todos los dispositivos y sistemas. Puedes consultar una lista de software compatible para Windows, Mac OS y otros sistemas operativos, en este enlace: [openpgp.org/software/](openpgp.org/software/). Ya que el concepto es el mismo, este método se puede replicar utilizando cualquier otra aplicación. La aplicación OpenKeychain se puede encontrar en F-droid.org [[Link]](https://f-droid.org/packages/org.sufficientlysecure.keychain/) o en Google play store [[Link]](https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain)
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<img src="images/sensitive-data-asymmetric-cipher-guide/OpenKeychain-logo.png" width="150"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Esquema de cifrado.
|
|
||||||
|
|
||||||
En la mayoría de los casos, la información confidencial que queremos proteger es la información de pago en moneda fiat del vendedor, es decir: el número de teléfono, la cuenta de PayPal, etc. La imagen a continuación muestra el esquema de encriptación que garantiza que la información de pago del vendedor solo pueda ser leída por el comprador.
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<img src="images/sensitive-data-asymmetric-cipher-guide/encrypted-communication-schema.png" width="900"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
El proceso de intercambio de datos se ha dividido en 3 sencillos pasos:
|
|
||||||
|
|
||||||
- Creación de pares de claves por parte del comprador.
|
|
||||||
|
|
||||||
- Compartir la clave pública del comprador con el vendedor.
|
|
||||||
|
|
||||||
- Intercambio de datos encriptados.
|
|
||||||
|
|
||||||
## Guía paso a paso.
|
|
||||||
|
|
||||||
### Creación de pares de claves por parte del comprador.
|
|
||||||
|
|
||||||
El primer paso para garantizar la confidencialidad de los datos es crear un par de claves pública/privada. A continuación se muestran los pasos para crear un par de claves en la aplicación OpenKeychain. Este procedimiento solo debe ser realizado por el comprador. Este paso solo se debe realizar una vez, no es necesario repetirlo cuando el comprador quiera volver a comprar, ya que en una futura operación ya tendrá el par de claves.
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<img src="images/sensitive-data-asymmetric-cipher-guide/PGP-keys-creation-steps.png" width="900"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
### Compartir la clave pública del comprador con el vendedor.
|
|
||||||
|
|
||||||
Ahora el comprador tiene dos claves: la clave privada sólo debe ser conocida por su propietario (en este caso concreto el comprador, que también la ha creado); la clave pública puede ser conocida por cualquier otra persona (el vendedor). El vendedor necesita la clave pública del comprador para cifrar los datos confidenciales, por lo que el comprador debe enviar el texto sin formato que representa la clave pública. Los pasos a continuación muestran cómo compartir el texto sin formato que representa la clave pública (imágenes 1-2), y también cómo el vendedor puede agregarla a su aplicación OpenKeychain para usarla más tarde (imágenes 3-8).
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<img src="images/sensitive-data-asymmetric-cipher-guide/pub-key-sharing-steps.png" width="900"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
La clave debe copiarse incluyendo el encabezado `(-----BEGIN PGP PUBLIC KEY BLOCK-----)` y el pie de página `(-----END PGP PUBLIC KEY BLOCK-----)` para el funcionamiento correcto de la aplicación.
|
|
||||||
|
|
||||||
### Intercambio de datos encriptados.
|
|
||||||
|
|
||||||
Una vez que el vendedor tiene la clave pública del comprador, se puede aplicar el esquema de cifrado que se muestra arriba. Los siguientes pasos describen el proceso de intercambio de datos cifrados.
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<img src="images/sensitive-data-asymmetric-cipher-guide/encrypted-data-sharing-steps.png" width="900"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
Los datos cifrados deben copiarse incluyendo el encabezado `(-----BEGIN PGP MESSAGE-----)` y el pie de página `(-----END PGP MESSAGE-----)` para el funcionamiento correcto de la aplicación. Si el comprador visualiza correctamente en la app los datos del vendedor significa que el intercambio ha sido exitoso y la confidencialidad de los datos está asegurada ya que la única clave que puede descifrarlos es la clave privada del comprador.
|
|
||||||
|
|
||||||
Si quieres leer un tutorial sobre cómo usar OpenKeychain para uso general, consulta [As Easy as P,G,P](https://diverter.hostyourown.tools/as-easy-as-pgp/)
|
|
Loading…
Reference in New Issue
Block a user