如何在 C# 中做 masking/hiding 电子邮件地址

how to do masking/hiding email address in c#

我有一个问题,我必须在 c# 中应用电子邮件地址的 masking/hiding 部分。示例

jhon@abc.com==> jh**n@abc.com
bigjhon@abc.com==> bi****n@abc.com
brotherhood@abc.com==>br*******od@abc.com

我有这个代码,但它对某些电子邮件给出了例外。 "Index was outside the bounds of the array."

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 += "*";
 }
}

我在你的代码片段中看不到你的 k 变量是在哪里初始化的。如果我不得不对你为什么得到一个索引越界异常进行大胆的尝试,那将是我的尝试。

尽管我会说您可以实现与您使用 Regex 所做的非常相似的事情。我是这样做的:

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;
}

这里是 fiddle 所有测试用例,提供的测试结果与您描述的非常接近 https://dotnetfiddle.net/fU2RUo

[编辑] 我的代码不会尝试混淆 @ 之前的地址长度少于 3 个字符的电子邮件,如果这是一个要求,您需要修改代码,但我不认为这是一个必须建立案例的非常现实的案例。

这是使用 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.com

解释:

(?<=[\w]{1}) 名称必须以 1 个单词字符开头

[\w-\._\+%]* 替换部分可以包含 0-n 个单词字符,包括 -_.+%

(?=[\w]{1}@) 名称必须以一个单词字符结尾,后跟 @

根据您希望保持不变的字符数量,您可以在开头或结尾将 {1} 更改为 {2} 或其他内容。

如果你总是想用固定数量的屏蔽字符屏蔽@之前第一个字符和最后一个字符之间的任何内容,你可以使用下面的

var email="abcdef@ghij.com";
var maskedEmail = string.Format("{0}****{1}", email[0], 
email.Substring(email.IndexOf('@')-1));

您可以根据需要更改上面的行。

上面一行会给你结果"a****f@ghij.com"

请注意,始终使用固定数量的字符来屏蔽电子邮件会使电子邮件更难被猜到,并且稍微更安全一些。

例如:ab@c.com

掩码后:a****b@c.com

我编写此方法是因为它更容易根据我的特定屏蔽要求进行自定义。

  • 输入:myemail@address.com
  • 输出:m****il@*******.com

我希望这对某人有所帮助。如果是这样,请将答案标记为有用。

public static string MaskEmail(this string email)
    {            
        var emailsplit = email.Split('@');
        var newsplit = emailsplit[1].Split('.');
        char[] array1 = emailsplit[0].ToCharArray();
        char[] array2 = newsplit[0].ToCharArray();
        var output = "";

        for (int i = 0; i < array1.Length; i++)
        {
            if (array1.Length > 4)
            {
                if (i == 0 || i == array1.Length - 1 || i == array1.Length - 2)
                {
                    output += array1[i];
                }
                else
                {
                    output += "*";
                }
            }
            else
            {
                if (i == 0)
                {
                    output += array1[i];
                }
                else
                {
                    output += "*";
                }
            }              
        }
        output += "@";
        for (int i = 0; i < array2.Length; i++) output += "*";
        for (int i = 1; i < newsplit.Length; i++) output += "." + newsplit[i];

        return output;
    }

我想屏蔽这样的电子邮件 A****B@C****D.com。这也适用于具有多个点或没有域扩展名的电子邮件。

public string MaskEmail(string email)
{
    if (string.IsNullOrEmpty(email) || !email.Contains("@"))
        return email;

    string[] emailArr = email.Split('@');
    string domainExt = Path.GetExtension(email);

    string maskedEmail = string.Format("{0}****{1}@{2}****{3}{4}",
        emailArr[0][0],
        emailArr[0].Substring(emailArr[0].Length - 1),
        emailArr[1][0],
        emailArr[1].Substring(emailArr[1].Length - domainExt.Length - 1, 1),
        domainExt
        );

    return maskedEmail;
}

结果

info@stakofervlow.com          >>  i****o@s****w.com
me@google.nl                   >>  m****e@g****e.nl
webmaster@stack.over.flow.org  >>  w****r@s****w.org
test@noextension               >>  t****t@n****n
x@y.net                        >>  x****x@y****y.net
  public static string EmailStarString(string email)
    {          
        string[] parts = email.Split('@');
        string star = string.Empty;
        string firstCharEmailName = parts[0].First().ToString();
        string lastCharEmailName = parts[0].Last().ToString();
        for (int i = 0; i < parts[0].Length - 2; i++)
        {
            star += "*";
        }
        return firstCharEmailName + star + lastCharEmailName + "@" + parts[1];
    }

我会采取另一种方法,知道@是一个电子邮件地址,如果@和字母之前有字母并且@符号之后有@*然后取去掉 space 之间包含 @ 和点“.”的文本部分,现在我们可以安全地过滤那些短为电子邮件的部分

var parts = someText.Split(' ').ToArray();                                
for (var i=0;i<parts.Length;i++)
{
    if (parts[i].Length>5 && parts[i].Any(a => a.Equals('@')) && parts[i].Any(a => a.Equals('.')))
    {
        parts[i] = "EMAIL@REMOVED.COM";
    }
}

someText = string.Join(' ', parts); 

您可以替换白色的整个块-space,或者花点时间替换一些字母或单词。不像正则表达式巫术那么花哨,但对我有用。顺便说一句,您还可以通过将其包含在您的“任何”逻辑中来捕获诸如 email(a)mydomain[dot]com 之类的内容