Skrytí e-mailových adres před roboty s využitím kryptografie v .NET

7. října 2004

V dnešní době spamu je potřeba co nejvíce chránit e-mailové adresy před roboty, kteří procházejí web a sbírají adresy, aby je mohly zahltit reklamními maily. Abychom robota převezli, musíme zajistit, aby adresu, kterou máme uloženou v databázi, nerozpoznal a šel dál. K tomu nám pomůže právě kryptografie.

V článku Cryptography v .NET – Symmetric a Asymmetric encryption jsem nastínil základní aspekty kryptografie na platformě .NET. Rozlišili jsme si symetrické a a asymetrické šifry a vysvětlili, v čem spočívá rozdíl. V tomto článku si uvedeme příklad použití kryptografie z praxe. Zde uvedený postup není doménou jen nějakých vládních tajných organizací. Podobný postup při uchovávání e-mailů by si měl osvojit téměř každý programátor. Spam by pak dostal slušný zásah.

Pokud už nutně potřebujeme uchovat e-mailovou adresu uživatele našeho webu, měli bychom buď zaměnit znak @ za nějaké jiné vyjádření, nebo adresu zašifrovat. Potřebujeme-li pak e-mail zobrazit na stránce, bylo by naše dosavadní úsilí naprosto zbytečné, kdybychom ho zobrazili v čistém textu. Když však e-mail zobrazíme v podobě dynamicky generovaného obrázku, robot objekt opět nerozpozná a my máme vyhráno.

Nyní si ale ukažme, jak toho docílit. Aplikace se bude skládat ze dvou souborů, default.aspx a genimg.aspx. Druhý zmíněný má na starosti pouze vygenerování obrázku z textu a vypadá zhruba takto:

<%
  if (Session[„text“] != null)
  {
    string text = (string)Session[„text“];
    Bitmap newBitmap =
      new Bitmap(400, 20, PixelFormat.Format24bppRgb);
    Graphics g =
      Graphics.FromImage(newBitmap);
    SolidBrush gridBrush =
      new SolidBrush(Color.FromArgb(0,0,0));
    Font gridFont =
      new Font(„Garamond“, 17, FontStyle.Regular, GraphicsUnit.Pixel);
    g.FillRectangle(new SolidBrush(Color.FromArgb(255,255,255)), new Rectangle(0,0,400,20));
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    g.DrawString(text, gridFont, gridBrush,-1, -1);
    Response.ClearContent();
    // připravit hlavičku obrázku pro odeslání přes HTTP
    Response.ContentType = „image/png“; // formát obrázku
    MemoryStream tempStream = new MemoryStream();
    // připravit data obrázku v patřičném formátu
    newBitmap.Save(tempStream,ImageFormat.Png);
    // vypustit data do prohlížeče
    Response.BinaryWrite(tempStream.ToArray());
    Response.End();
  }
%>

Uvedený kód nepotřebuje vysvětlení. Více se o této problematice dozvíte ve výše zmíněném článku. Podotknu jen, že pro účely demonstrace jsem stringovou reprezentaci dešifrované e-mailové adresy uložil v objektu Session. V reálné aplikaci by se to zřejmě řešilo jiným způsobem.

Nyní přejdeme ke kódu, který řeší šifrování a následné dešifrování e-mailu:

<%@ Page Language=“C#“ %>
<%@ import Namespace=“System.IO“ %>
<%@ import Namespace=“System.Text“ %>
<%@ import Namespace=“System.Security.Cryptography“ %>
<script runat=“server“>
  string original;
  string roundtrip;
  string repre;
  byte[] encryptedData;
  byte[] decryptedData;
  byte[] dataToEncrypt;
  void CryptoRound()
  {
    ASCIIEncoding textConverter = new ASCIIEncoding();
    dataToEncrypt = textConverter.GetBytes(original);
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
    encryptedData = RSA.Encrypt(dataToEncrypt, false);
    decryptedData = RSA.Decrypt(encryptedData, false);
    roundtrip = textConverter.GetString(decryptedData);
    repre = textConverter.GetString(encryptedData);
  }
  void btnSubmit_Click(object sender, EventArgs e)
  {
    original = tbInput.Text;
    CryptoRound();
    lblC.Text = repre;
    Session[„text“] = roundtrip;
  }
</script>
<html>
<head>
</head>
<body>
  <form runat=“server“>
    <asp:TextBox id=“tbInput“ runat=“server“></asp:TextBox>
    <asp:Button id=“btnSubmit“ onclick=“btnSubmit_Click“ runat=“server“ text=“Odeslat!“></asp:Button>
    <br />
    <asp:Label id=“lblC“ runat=“server“></asp:Label>
  </form>
  <img src=“genimg.aspx“ />
</body>
</html>

Pro zjednodušení příkladu jsem celý proces šifrování a dešifrování uložil do jedné metody CryptoRound(). V ukázce používám několik proměnných:

  • original – email zadaný do textového pole
  • repre – šifrovaná reprezentace emailu
  • roundtrip – text získaný dešifrováním, měl by být stejný jako „original“ (ukládám do objektu Session pro použití v genimg.aspx)
  • bytové reprezentace jednotlivých stringů
  • Po klepnutí na tlačítko se text v TextBoxu zašifruje pomocí algoritmu RSA a následně dešifruje a zobrazí jako obrázek přes stránku genimg.aspx (<img src="genimg.aspx" />). Celý mechanismus si můžete otestovat on-line, abyste si o jeho funkci utvořili lepší představu.

    Starší komentáře ke článku

    Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek g3a.info
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *