bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


Your (re)login has failed.
mysql_aes

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
mysql_aes [2024/02/01 23:39]
enric_mieza_sanchez [Exemple: encriptació de vot]
mysql_aes [2024/02/02 17:47] (actual)
enric_mieza_sanchez [Exemple: encriptació per a vot secret]
Línia 1: Línia 1:
 ====== Encriptació AES a MySQL ====== ====== Encriptació AES a MySQL ======
  
-L'encriptació AES és reversible, a diferència de SHA2 que és destructiva (intencionadament). Els //strings// codificats en AES seran recuperables si es té la clau d'encriptació.+L'encriptació AES és reversible (permet desencriptar), a diferència de SHA2 que és una funció de //hash// destructiva. Els //strings// codificats en AES seran recuperables si es té la clau d'encriptació. 
 + 
 +En AES es fa servir la mateixa clau per encriptar i desencriptar, d'aquí que es classifiqui com a sistema d'encriptació de clau simètrica. Altre algorismes com RSA son de clau asimètrica, ja que requereixen una clau diferent per encriptar i desencriptar (sistema de clau pública/privada). Els asimètrics permeten certes utilitats però són computacionalment més feixucs. 
 + 
 +{{ https://protonvpn.com/blog/wp-content/uploads/2021/12/2022-01-pv-blog-what-is-aes.png?400 }}
  
 Referències: Referències:
Línia 12: Línia 16:
 ===== Exemple bàsic ===== ===== Exemple bàsic =====
  
-L'exemple més senzill seria el següent (ULL! el ''block_encryption_mode'' és important):+L'exemple més senzill seria el següent
 +<WRAP important> 
 +ULL! El ''block_encryption_mode = 'aes-256-ecb';'' és important 
 +</WRAP>
  
 <WRAP prewrap> <WRAP prewrap>
Línia 39: Línia 46:
 \\ \\
  
-===== Exemple: encriptació de vot =====+===== Exemple: encriptació per a vot secret =====
  
-En aquest exemple volem encriptar el vot en una aplicació de votacions per tal de que sigui secret. Això significa que ningú que no sigui l'usuari pot veure el què ha votat, ni tan sols l'administrador del sistema.+En aquest exemple volem **encriptar el vot en una aplicació de votacions per tal de que sigui secret**. Això significa que ningú que no sigui l'usuari pot veure el què ha votat, ni tan sols l'administrador del sistema.
  
-Tenim invitacions a l'enquesta, i enlloc de posar la opció de vot directament, la separarem en una taula de votacions i encriptarem el id_invitació amb una "sal" que només és accessible a l'usuari, ja que la codifiquem amb la pròpia contrasenya. El //sysadmin// no podrà relacionar la invitació amb la votació, però si podrà fer el recompte.+{{db_vota.png}}
  
 +Tenim invitacions a l'enquesta, i enlloc de posar la opció de vot directament, la separarem en una taula de votacions i **encriptarem el id_invitació amb una "sal" que només és accessible a l'usuari, ja que la codifiquem amb la pròpia contrasenya**. El //sysadmin// no podrà relacionar la invitació amb la votació, però sí que podrà fer el recompte.
 +
 +L'encriptació dle ID_INVITACIÓ la podem expressar així, concatenant el ID_INVITACIO amb la sal de l'usuari:
 +
 +  ID_INVITACIO_ENC = SHA2( ID_INVITACIO + SAL_USUARI )
 +
 +==== Creació de la BD de votacions ====
 <WRAP prewrap> <WRAP prewrap>
 <code mysql> <code mysql>
Línia 92: Línia 106:
 </WRAP> </WRAP>
  
 +Les dades quedarien així:
 +<code>
 +mysql> select * from usuaris;
 ++----+--------+-----------------+--------------+---------------------+
 +| id | nom    | email           | contrasenya  | enc_salt            |
 ++----+--------+-----------------+--------------+---------------------+
 +|  1 | pepa   | [email protected]   | 67109992...  | 0x5CDBCDE0E5B34F... |
 +|  2 | manolo | [email protected] | b1d731d8...  | 0x188CC1D6391244... |
 ++----+--------+-----------------+--------------+---------------------+
  
 +mysql> select * from invitacions;
 ++------+-----------+-------------+
 +| id   | id_usuari | id_enquesta |
 ++------+-----------+-------------+
 +|   10 |         1 |          11 |
 +|   20 |         2 |          22 |
 ++------+-----------+-------------+
 +
 +mysql> select * from vots;
 ++------------------------------+----------+
 +| id_invitacio_enc             | id_opcio |
 ++------------------------------+----------+
 +| 0x613835326530353...              111 |
 +| 0x653837363036323...              222 |
 ++------------------------------+----------+
 +
 +</code>
 +
 +\\
 +
 +==== Accedir als vots d'un usuari ====
 +
 +Podem accedir a les opcions votades per un usuari només si disposem de la seva contrasenya, que ens desencriptarà la sal que ens permet relacionar id_invitacio_enc (encriptada) de la taula de vots amb la id de la taula d'invitacions.
 +
 +Així, l'usuari podria veure què ha votat i canviar el seu vot (però no ho podria fer un //sysadmin//).
 +
 +<code mysql>
 +SET block_encryption_mode = 'aes-256-ecb';
 +
 +-- exemple de query per cercar les votacions
 +set @id_usuari = 2;
 +set @pass_usuari = "manolopass";
 +
 +-- l'usuari obté la seva sal amb la password
 +set @sal = (select cast(aes_decrypt(enc_salt,@pass_usuari) as char)
 +    from usuaris where id=@id_usuari);
 +
 +-- cerquem totes les votacions de l'usuari
 +select i.id_usuari , i.id_enquesta, v.id_opcio
 +from vots v, invitacions i
 +where i.id_usuari = @id_usuari
 +  and v.id_invitacio_enc = SHA2(CONCAT(CONVERT(i.id,char),@sal),512);
 +</code>
 +
 +Amb el què obtindrem, en cas de que l'usuari sigui el id=1:
 +
 +<code>
 ++-----------+-------------+----------+
 +| id_usuari | id_enquesta | id_opcio |
 ++-----------+-------------+----------+
 +|         2 |          22 |      222 |
 ++-----------+-------------+----------+
 +</code>
  
mysql_aes.1706830743.txt.gz · Darrera modificació: 2024/02/01 23:39 per enric_mieza_sanchez