Soluciones de Seguridad de Datos en C++ y Python

Enmascarado

Oculta parte de los datos sensibles para mostrar solo la información necesaria.

Clase Enmascarado

#ifndef ENMASCARADO_H
#define ENMASCARADO_H
                
#include <string>
using namespace std;
                
class Enmascarado {
public:
    string enmascararTarjeta(string dato, char mascara);
    string enmascararNombre(string dato, char mascara);
    string enmascararCorreo(string dato, char mascara);
    void enmascararArchivo(const string& inputFileName, const string& outputFileName, char mascara);
                };
                
#endif
                

Ejemplos de Uso

Enmascarar Tarjeta

string Enmascarado::enmascararTarjeta(string dato, char mascara) {
    string enmascarado = "";
    for (int i = 0; i < dato.length(); i++) { // Recorre el string
        if (i < 12) { // Si son los primeros 12 carácteres de la tarjeta
            enmascarado += mascara; // Agrega la mascara
        } else { // De lo contrario, no agrega la mascara
            enmascarado += dato[i];
        }
    }
    return enmascarado;
}

Resultado

La tarjeta "1234567890123456" enmascarada con el carácter '*' se convierte en "************3456".

Enmascarar Nombre

string Enmascarado::enmascararNombre(string dato, char mascara) {
    string enmascarado = "";
    for (int i = 0; i < dato.length(); i++) { // Recorre el string
        if (i == 0 || dato[i] == ' ' || dato[i - 1] == ' ') { 
            // Si es el primer carácter o es un espacio
            enmascarado += dato[i]; // Agrega el carácter
            } else { 
            // De lo contrario, agrega la mascara
            enmascarado += mascara;
            }
        }
    return enmascarado;
}
                

Resultado

El nombre "Juan Perez" enmascarado con el carácter '*' se convierte en "Juan P****".

Enmascarar Correo


string Enmascarado::enmascararCorreo(string dato, char mascara) {
string enmascarado = "";
for (int i = 0; i < dato.length(); i++) { // Recorrer el string
        if (i == 0) {
            enmascarado += dato[i]; // Si es el primer carácter, agrégalo
        } else if (dato[i] == '@') { 
            // Si es @, agrega todos los caracteres restantes
            while (i < dato.length()) {
                enmascarado += dato[i];
                i++;
        }
        break;
        } else {
            enmascarado += mascara; // De lo contrario, agrega la máscara
        }
    }
        return enmascarado;
}

Resultado

El correo "juanperez@gmail.com" enmascarado con el carácter '*' se convierte en "j********@gmail.com".

Enmascarar Archivo


void Enmascarado::enmascararArchivo(const string &inputFileName, const string &outputFileName, char mascara) {
    ifstream inputFile(inputFileName);
    ofstream outputFile(outputFileName);

    if (!inputFile.is_open()) {
        cerr << "Error abriendo el archivo de entrada: " << inputFileName << endl;
        return;
    }
    if (!outputFile.is_open()) {
        cerr << "Error abriendo el archivo de salida: " << outputFileName << endl;
        return;
    }
                
    string linea;
    Utils util;
    while (getline(inputFile, linea)) {
        // Determinar el tipo de dato y enmascarar
        string enmascarado;
        if (util.esNumeroTarjeta(linea)) {
            enmascarado = enmascararTarjeta(linea, mascara);
        } else if (util.esCorreo(linea)) {
            enmascarado = enmascararCorreo(linea, mascara);
        } else if (util.esNombre(linea)) {
            enmascarado = enmascararNombre(linea, mascara);
        } else {
            enmascarado = linea; // Si no se reconoce, dejar la línea tal cual
        }
        outputFile << enmascarado << endl; // Escribir la línea enmascarada en el archivo de salida
    }
    inputFile.close();
    outputFile.close();
    cout << "El contenido enmascarado se ha guardado en " << outputFileName << endl;
}

Resultado

archivo.txt:
Datos de persona
Juan Perez
juanperez@gmaillcom
1234567890123456
Transferencia
archivo_enmascarado.txt:
D**** d* p******
J*** P****
j********@gmail.com
************3456
T************