Skip to content

Latest commit

 

History

History
258 lines (183 loc) · 5.62 KB

README.md

File metadata and controls

258 lines (183 loc) · 5.62 KB

mask-utils

Utils para gerar ofuscação e mascaramento em dados e campos de objetos.

A ideia do projeto é mascarar e/ou ofuscar dados sensiveis, como credenciais, dados PCI DSS , PII e outros que possam fazer sentido.

A ofuscação acontece via anotação do campo e baseada em replace utilizando regex. Funciona somente para tipos String.

Gradle

//build.gradle
dependencies {
    implementation 'com.github.eltonsandre.utils:mask-utils:1.0.1'
}

Maven

//pom.xml
<dependency>
    <groupId>com.github.eltonsandre.utils</groupId>
    <artifactId>mask-utils</artifactId>
    <version>1.0.1</version>
</dependency>

Anotações

@MaskField: Mascara o valor do campo de tipo String.

  • remove: Remove o valor do campo.

  • regex: Expreção regular em que o campo será mascarado.

  • replacement: valor ou regex em que o campo será mascarado.

  • namesGroup: nome do grupo para qual grupo o campo será mascarado.

@MaskGroups - Anotação para marcar atributo com grupos de ofuscação.

@MaskObjectData - Anotação para marcar atributo como tipo complexo acessar atributos e ofuscar.

@MaskCollectonData - Anotação para marcar atributo como coleção para interar e ofuscar os campos e objetos anotados.


Exemplos de uso:

o exempo mostra mascarameto de um dado PII do campo para o grupo 'dado.pii':

public class Cliente {
 ...
    @MaskField(regex = "(^[^@]{3}).*", replacement = "$1.***.***-**", namesGroup = {"dado.pii"})
    private String cpf;
 ...
}
public class Cliente {

    public Cliente recuperaDadosCliente(final String id) {
        //codigo ...
        final Cliente clienteOfuscado = (Cliente) MaskUtils.mask(cliente, "dado.pii");
        //codigo ...
        return clienteOfuscado;
    }
}


Mascaramento por grupo: no exemplo poderá ser mascarado pelo default, isto é sem grupo ou passando o grupo, no caso dado.pii

public class Cliente {
...
    @MaskGroups({
            @MaskField(regex = "(^[^@]{4}).*@[^.]*(\..*)", replacement = "$1******@****$2"),
            @MaskField(regex = "(^[^@]{4}).*@[^.]*(\..*)", replacement = "$1******@******",
                    namesGroup = {"dado.pci"})
    })
    private String email;
...
}


class ExemploParaGrupo {

    public Cliente mascarar(final Cliente cliente, final boolean semGrupo) {
        cliente.setEmail("[email protected]");
        if (semGrupo) {
            /*default sem  grupo*/
            return MaskUtils.mask(cliente);
            // resultado: email=test******@****.com
        }
        /*Passando grupo*/
        return MaskUtils.mask(cliente, "dado.pii");
        // resultado: email=test******@******
    }
}


Ofuscando dados de cartões (PCI DSS)

@Data
public class CartaoCredito {

    private String nome;

    @MaskField(regex = "^([0-9]{4})(.*)([0-9]{4})", replacement = "$1 **** **** $3",
            namesGroup = {"dado.pci"})
    private String numero;

    @MaskField(namesGroup = {"dado.pci"})
    private String cvv;

    @MaskField(namesGroup = {"dado.pci"})
    private String anoValidade;

    @MaskField(namesGroup = {"dado.pci"})
    private String mesValidade;
}
public class ExemploCard {

    public Cartao mask() {
        Cartao cartao = Cartao.builder()
                .nome("John Connor")
                .cvv("123")
                .numero("5498 0305 8674 0032")
                .anoValidade("2030")
                .mesValidade("12")
                .build();

        return MaskUtils.mask(cartao, "dado.pci");
    }
Resultado:
 Cartao(
    nome=John Connor,
    numero=5498 **** **** 0032,
    cvv=***,
    anoValidade=****,
    mesValidade=**
 )


Ofuscação de Credencias (senha)

@Data
public class Usuario {

    @MaskField
    private String username;

    @MaskGroups({
            @MaskField(regex = "(^[^@]{4}).*@[^.]*(\..*)", replacement = "$1******@****$2"),
            @MaskField(regex = "(^[^@]{4}).*@[^.]*(\..*)", replacement = "$1******@******",
                    namesGroup = {"dado.pii"})
    })
    private String email;


    @MaskField(regex = "^.*", replacement = "[SECRETO]", namesGroup = {"dado.sensivel"})
    private String password;

}


Exemplo geral

public class Cliente {

    private String nome;

    @MaskField(regex = "(^[^@]{3}).*", replacement = "$1.***.***-**", namesGroup = {"dado.pii"})
    private String cpf;

    @MaskGroups({
            @MaskField(regex = "(^[^@]{4}).*@[^.]*(\..*)", replacement = "$1******@****$2"),
            @MaskField(regex = "(^[^@]{4}).*@[^.]*(\..*)", replacement = "$1******@******",
                    namesGroup = {"dado.pci"})
    })
    private String email;

    @MaskField(regex = "(^[^@]{4}).*", replacement = "**/**/$1", namesGroup = {"dado.pii"})
    private String dataNascimento;

    @MaskCollectonData
    private List<Telefone> telefones;

    @MaskObjectData
    private Endereco endereco;

}
@Data
public class Telefone {

    @MaskField
    private String ddi;

    @MaskField
    private String ddd;

    @MaskGroups({
            @MaskField(remove = true),
            @MaskField(regex = "(^[^@]{3}).*", replacement = "$1******@******",
                    namesGroup = {"dado.pii"})
    })
    private String numero;

}

Pull requests, novas ideias de features, colaboração e/ou issues serão muito bem-vindas.