creazione classe per gestione qr code
This commit is contained in:
parent
7e093539a8
commit
92995d5658
105
src/puntocassa/utils/QrCryptoService.java
Normal file
105
src/puntocassa/utils/QrCryptoService.java
Normal file
@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||
*/
|
||||
package puntocassa.utils;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author assis
|
||||
*/
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.spec.GCMParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.SecureRandom;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.Base64;
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class QrCryptoService {
|
||||
|
||||
// Chiave AES 256-bit (32 byte) - hardcoded per test
|
||||
private static final byte[] AES_KEY = "0123456789ABCDEF0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
|
||||
|
||||
// Crea il JSON cifrato da inserire nel QR
|
||||
public static String createEncryptedQr(String uid, OffsetDateTime issuedAt, OffsetDateTime expiresAt) throws Exception {
|
||||
// Crea il payload JSON con i dati utente
|
||||
String payloadJson = new JSONObject()
|
||||
.put("uid", uid)
|
||||
.put("issued_at", issuedAt.toString())
|
||||
.put("expires_at", expiresAt.toString())
|
||||
.toString();
|
||||
|
||||
// Genera un Initialization Vector (IV) da 96 bit
|
||||
byte[] iv = new byte[12];
|
||||
new SecureRandom().nextBytes(iv);
|
||||
|
||||
// Cifra il payload con AES-GCM
|
||||
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
|
||||
SecretKeySpec keySpec = new SecretKeySpec(AES_KEY, "AES");
|
||||
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
|
||||
cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
|
||||
byte[] encrypted = cipher.doFinal(payloadJson.getBytes(StandardCharsets.UTF_8));
|
||||
|
||||
// Codifica IV e dati cifrati in Base64
|
||||
String ivBase64 = Base64.getEncoder().encodeToString(iv);
|
||||
String encryptedBase64 = Base64.getEncoder().encodeToString(encrypted);
|
||||
|
||||
// Costruisce il JSON finale con iv e data
|
||||
JSONObject qrJson = new JSONObject()
|
||||
.put("iv", ivBase64)
|
||||
.put("data", encryptedBase64);
|
||||
|
||||
return qrJson.toString(2); // con indentazione
|
||||
}
|
||||
|
||||
// Decifra il JSON e verifica se è ancora valido
|
||||
public static String decryptAndValidate(String qrJson) throws Exception {
|
||||
JSONObject obj = new JSONObject(qrJson);
|
||||
byte[] iv = Base64.getDecoder().decode(obj.getString("iv"));
|
||||
byte[] encryptedData = Base64.getDecoder().decode(obj.getString("data"));
|
||||
|
||||
// Decrittazione con AES-GCM
|
||||
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
|
||||
SecretKeySpec keySpec = new SecretKeySpec(AES_KEY, "AES");
|
||||
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
|
||||
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec);
|
||||
byte[] decryptedBytes = cipher.doFinal(encryptedData);
|
||||
|
||||
// Parsing del payload decifrato
|
||||
JSONObject payload = new JSONObject(new String(decryptedBytes, StandardCharsets.UTF_8));
|
||||
String uid = payload.getString("uid");
|
||||
OffsetDateTime issuedAt = OffsetDateTime.parse(payload.getString("issued_at"));
|
||||
OffsetDateTime expiresAt = OffsetDateTime.parse(payload.getString("expires_at"));
|
||||
boolean isExpired = OffsetDateTime.now(expiresAt.getOffset()).isAfter(expiresAt);
|
||||
|
||||
return String.format(
|
||||
"Dati decifrati:\n" +
|
||||
"- UID: %s\n" +
|
||||
"- Emesso: %s\n" +
|
||||
"- Scadenza: %s\n" +
|
||||
"- Stato: %s\n",
|
||||
uid,
|
||||
issuedAt,
|
||||
expiresAt,
|
||||
isExpired ? "SCADUTO" : "VALIDO"
|
||||
);
|
||||
}
|
||||
|
||||
// Test completo della generazione e verifica
|
||||
public static void main(String[] args) throws Exception {
|
||||
//data valida
|
||||
OffsetDateTime issuedAt = OffsetDateTime.now().withNano(0);
|
||||
//data scaduta
|
||||
//OffsetDateTime issuedAt = OffsetDateTime.now().minusMinutes(5).withNano(0);
|
||||
OffsetDateTime expiresAt = issuedAt.plusSeconds(60);
|
||||
String qrJson = createEncryptedQr("TSTTST91A48A271O", issuedAt, expiresAt);
|
||||
|
||||
System.out.println("QR JSON simulato:");
|
||||
System.out.println(qrJson);
|
||||
|
||||
System.out.println("\nVerifica decifratura:");
|
||||
System.out.println(decryptAndValidate(qrJson));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user