bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


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:25]
enric_mieza_sanchez [Exemple bàsic]
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.
 +
 +{{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>
-drop database if exists vota; 
 create database vota; create database vota;
 use vota; use vota;
Línia 82: Línia 99:
  
 -- votació: insertem la id_invitacio_enc i la id_opcio -- votació: insertem la id_invitacio_enc i la id_opcio
--- s'encripta la id_invitacio (10,20) amb la sal de cada usuari +-- s'encripta la id_invitacio amb la sal de cada usuari 
--- "10" + "pepasalt"+-- per ex: id_invitacio+sal => "10"+"pepasalt"
 insert into vots values (SHA2(CONCAT(CONVERT(10,char),"pepasalt"),512),111); insert into vots values (SHA2(CONCAT(CONVERT(10,char),"pepasalt"),512),111);
 insert into vots values (SHA2(CONCAT(CONVERT(20,char),"manolosalt"),512),222); insert into vots values (SHA2(CONCAT(CONVERT(20,char),"manolosalt"),512),222);
Línia 89: 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.1706829947.txt.gz · Darrera modificació: 2024/02/01 23:25 per enric_mieza_sanchez