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.
//build.gradle
dependencies {
implementation 'com.github.eltonsandre.utils:mask-utils:1.0.1'
}
//pom.xml
<dependency>
<groupId>com.github.eltonsandre.utils</groupId>
<artifactId>mask-utils</artifactId>
<version>1.0.1</version>
</dependency>
-
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.
@MaskCollectonData - Anotação para marcar atributo como coleção para interar e ofuscar os campos e objetos anotados.
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;
}