如何在 C# 中屏蔽/隐藏电子邮件地址

Posted

技术标签:

【中文标题】如何在 C# 中屏蔽/隐藏电子邮件地址【英文标题】:how to do masking/hiding email address in c# 【发布时间】:2015-08-04 10:14:28 【问题描述】:

我有一个问题,我必须在 c# 中应用屏蔽/隐藏电子邮件地址的一部分。例子

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

我有这个代码,但它对某些电子邮件给出了例外。 “索引超出了数组的范围。”

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

【问题讨论】:

“为某些电子邮件提供例外”:我想我们可以猜到它们是什么。但最好在代码中包含哪些电子邮件失败、哪些异常以及哪些点失败的详细信息。 实际上该代码已在网站上运行,我没有这些电子邮件地址详细信息,但我只收到此错误。 你为什么不启动你的调试器,看看这段代码发生了什么?您处于发现故障的最佳位置。只需在此代码的开头放置一个断点并运行调试器即可。 我做了,但很好,这就是我把它放在这里的原因。可能是我错过了一些东西,所以其他人可以帮助我 您是否有示例测试电子邮件地址可以显示哪些失败? 【参考方案1】:

这是一种使用正则表达式解决此问题的方法

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

说明

(?&lt;=[\w]1) 名称必须以 1 个单词字符开头

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

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

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

【讨论】:

很好的解决方案。感谢您的正则表达式! :) 如何让这也影响电子邮件地址的域? @Djorge 这有点棘手,因为从技术上讲,域是@foo@foo.bar.com@192.168.1.1,除了琐碎的情况@foo.com 我最终将|(?&lt;=@[\w]1)[\w-_\+%]*(?=\.) 添加到您的正则表达式的末尾以获得我想要的,但不处理@foo @Djorge 如果您删除添加中的 at 符号,您还可以匹配多个域部分。整个表达式将是 (? 【参考方案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

【讨论】:

【参考方案3】:

我看不到你的 k 变量在你的代码 sn-p 中的初始化位置。如果我不得不猛烈抨击为什么你会得到一个索引超出范围的异常,那将是我的刺。

虽然我会说您可以实现与使用 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("0123",  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;

这里是你所有测试用例的一个小提琴,只要通过非常接近你描述的https://dotnetfiddle.net/fU2RUo

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

【讨论】:

【参考方案4】:

我想屏蔽像 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****34",
        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

【讨论】:

【参考方案5】:

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

输入: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;
    

【讨论】:

【参考方案6】:
  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];
    

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

以上是关于如何在 C# 中屏蔽/隐藏电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 电子邮件通知中隐藏本地取货的送货地址

如何在 C# 中使用 AD 组名称查找 Active Directory 组电子邮件地址

ASP .Net C# 代码向多个用户发送邮件,这些用户的邮件 ID 应隐藏在组名中

使用 C# 客户端 API 从 GmailService 获取电子邮件地址

如何在html表单中隐藏文本字段

如何使用 JQuery 加密电子邮件地址