tengo un problema, tengo que aplicar enmascarar/ocultar parte de la dirección de correo electrónico en C#. ejemplo
jhon@abc.com==> jh**n@abc.com bigjhon@abc.com==> bi****n@abc.com brotherhood@abc.com==>br*******od@abc.comtengo este código pero está dando una excepción para algunos correos electrónicos. "El índice esta fuera de los límites de la matriz."
for (int i = 0; i < eml.Length; i++) { int j = i == (eml.Length - 1) ? 0 : 1; cc = eml[i].ToString(); if (i <= 1) { dispeml += cc; } else if (eml[i + (j + k)].ToString() == "@") { dispeml += cc; k = 0; fl = 1; } else if (eml[i + j].ToString() == "@") { dispeml += cc; fl = 1; } else if (fl == 1) { dispeml += cc; } else { dispeml += "*"; } }Aquí hay un enfoque para resolver esto con Regex
string input = "jhon@abc.com"; string pattern = @"(?<=[\w]{1})[\w-\._\+%]*(?=[\w]{1}@)"; string result = Regex.Replace(input, pattern, m => new string('*', m.Length)); //j**n@abc.comExplicación :
(?<=[\w]{1}) el nombre debe comenzar con 1 carácter de palabra
[\w-\._\+%]* la pieza de repuesto puede contener 0-n caracteres de palabra, incluido -_.+%
(?=[\w]{1}@) el nombre debe terminar con un carácter de palabra seguido de una @
Dependiendo de la cantidad de caracteres que desee que permanezcan sin cambios, puede cambiar {1} a {2} o algo más al principio o al final.
Si siempre desea enmascarar algo entre el primer carácter y el último carácter antes de @ con un número fijo de caracteres enmascarados, puede usar lo siguiente
var email="abcdef@ghij.com"; var maskedEmail = string.Format("{0}****{1}", email[0], email.Substring(email.IndexOf('@')-1));Puede modificar la línea anterior para su requerimiento.
La línea de arriba te dará el resultado "a****f@ghij.com"
Tenga en cuenta que enmascarar el correo electrónico siempre con un número fijo de caracteres hará que sea difícil adivinar el correo electrónico y es un poco más seguro.
ej: ab@c.com
después de la máscara: a****b@c.com
No puedo ver dónde se inicializa su variable k en su fragmento de código. Si tuviera que hacer una puñalada salvaje en cuanto a por qué está obteniendo una excepción de índice fuera de los límites, esa sería mi puñalada.
Aunque diría que podrías lograr algo muy similar a lo que estás haciendo usando Regex. Lo hice así:
public string ObfuscateEmail(string email) { var displayCase = email; var partToBeObfuscated = Regex.Match(displayCase, @"[^@]*").Value; if (partToBeObfuscated.Length - 3 > 0) { var obfuscation = ""; for (var i = 0; i < partToBeObfuscated.Length - 3; i++) obfuscation += "*"; displayCase = String.Format("{0}{1}{2}{3}", displayCase[0], displayCase[1], obfuscation, displayCase.Substring(partToBeObfuscated.Length - 1)); } else if (partToBeObfuscated.Length - 3 == 0) { displayCase = String.Format("{0}*{1}", displayCase[0], displayCase.Substring(2)); } return displayCase; }Aquí hay un violín de todos sus casos de prueba proporcionados que pasan bastante cerca de lo que estaba describiendo https://dotnetfiddle.net/fU2RUo
[EDITAR] Mi código no intenta ofuscar los correos electrónicos cuyas direcciones antes de la @ tienen menos de 3 caracteres, si este es un requisito, deberá modificar el código, pero no pensé que fuera un caso muy realista. para construir un caso para.