Kategoriarkiv: Okategoriserat

Skydda din integritet med e-postalias

Integritet är en grundläggande rättighet i den digitala tidsåldern, och din e-postadress är en nyckelkomponent som kan vara sårbar för angrepp. Vi lever i en värld där vår e-postadress inte bara används för kommunikation utan också för att identifiera oss på sociala medier, e-handelsbutiker och andra digitala tjänster. Denna information är värdefull för företag och annonsörer, som vill profilera oss och rikta personanpassad reklam mot oss. Men vad kan du göra för att skydda din integritet och undvika oönskade intrång i din digitala närvaro? En lösning är att använda e-postalias, en strategi som ger dig en extra nivå av integritet och säkerhet online.

Varför är e-postadresser känsliga?

Eftersom vi ofta använder samma e-postadress för konton på olika webbtjänster så kan det också vara en säkerhetsrisk om vår e-postadress blir känd för en illasinnad aktör. Om de lyckas komma över lösenordet för vårt e-postkonto så kan de försöka logga in på olika tjänster med vår e-postadress och försöka återställa lösenordet för våra konton. Helt plötsligt har vi då fått våra konton kapade.

Denna riska kan minskas genom att aktivera tvåfaktorsautentisering och använda appar som Google Authenticator, Authy, Bitwarden, Protonpass med flera. Observera att en del webbtjänster skickar koder för tvåfaktorsautentisering via mejl eller SMS, vilket är olämpligt eftersom dessa är lätta att komma åt för en illasinnad aktör.

Använda e-postalias

För att få ytterligare ett skyddslager kan vi använda oss av unika e-postadresser (så kallade e-postalias) för olika tjänster. Detta innebär att vi kan skapa en unik e-postadress som vi registrerar oss med hos en tjänst. Alla mejl som skickas till den adressen vidarebefordras till vår riktiga e-postadress utan att företaget för tjänsten vet om vår riktiga adress. Detta innebär att det blir svårare för en angripare att kapa våra konton eftersom varje konto har en egen e-postadress.

Bild som visar hur e-postalias kan användas för att skydda sin riktiga e-postadress från att exponeras.

Exempel på tjänster som erbjuder e-postalias

Apples iCloud har en tjänst som heter ”Hide my email”. Det möjliggör för dig som användare att skapa unika e-postadresser som du kan använda för att registrera dig på olika tjänster som sociala medier, webb-butiker med mera. Alla mail vidarebefordras till din vanliga iCloud-adress. Om du svarar på ett mejl som skickats till en sådan adress så kommer inte din riktiga mejladress att avslöjad utan det kommer se ut som om att du svarar från den e-postaliaset.

Simplelogin är tjänst som ägs av företaget Proton som specialiserat sig på säker e-post med tjänsten Proton mail. Även här kan du skapa unika e-postadresser men du kan namnge dem lite bättre än i iClouds ”Hide my email” (vilket skapar slumpmässiga namn för dina alias).

Fördelar med e-postalias

Fördelen med att använda e-postalias är att vi kan skapa e-postadresser för specifika ändamål. Genom att använda olika e-postalias för olika tjänster så blir det svårare för en angripare att ta sig vidare från en tjänsts konto till ett annat eftersom de förutom lösenord måste veta vilken e-postadress som vi använder på respektive tjänst.

Om någon tjänst blir angripen och läcker vår e-postadress så är det enkelt att identifiera vilken tjänst som har läckt om vi har ett unikt alias. Då kan vi enkelt också inaktivera adressen och skapa en ny. Ibland kan det också vara bra att kunna ta bort alias om vi hamnat på nyhetsbrev eller mejllistor som vi inte enkelt kan avregistrera oss från.

Nackdelar med e-postalias

E-postalias är i allmänhet svåra att komma ihåg då de är helt eller delvis slumpartat namngivna. Om man har en egen domän som man kopplar till alias-tjänsten, exempelvis simplelogin, så kan man namnge alias själv men det kräver att man prenumererar på tjänsten vilket kostar pengar. Om man inte vill betala eller använda en egen e-postdomän så kommer adresserna att vara slumpmässiga.

Ett annat problem är att hålla reda på vilket alias man använt för respektive konto som sociala medier, e-handelsbutik, nyhetsbrev m.m. Många av oss använder tyvärr samma e-postadress och lösenord på alla tjänster vilket gör det lätt för oss att komma ihåg men också kan få katastrofala följder om någon angriper oss. De kan då helt ta över vårt digitala liv.

En stark rekommendation är att använda sig av en lösenordshanterare som exempelvis Bitwarden, Protonpass, 1Password m.fl. En lösenordshanterare är egentligen ett register där vi kan lagra de tjänster och webbplaster vi har konton på och det användarnamn, e-postadress och lösenord vi använder just där. Vi låser upp lösenordshanteraren med ett lösenord som är det enda lösenord vi behöver komma ihåg. Lösenordshanteraren kan sedan hjälpa oss att automatiskt fylla i inloggningsuppgifterna i den tjänst vi vill använda.

Sammanfattning

Genom att använda e-postalias kan vi skydda vår digitala integritet. Vi kan enkelt identifiera om någon tjänst har läckt vår e-postadress. Genom att ha unika e-postadresser på varje tjänst vi använder så minskar vi attackytan för illasinnade aktörer som vill angripa oss. Vi kan också enkelt ta bort alias som vi inte använder eller är intresserade av längre.

Fluent Assertions gör dina tester enklare att förstå


Idag är det en självklarhet att skriva automatiserade tester vid utveckling. Många tillämpar även TDD (Test Driven Development). Testerna ger en säkerhet när man arbetar med koden eftersom de talar om när något gått sönder. Välskrivna tester kan även fungera som dokumentation. Nya utvecklare kan skapa sig en bild av vad systemet gör genom att kolla på testerna. Genom att använda Fluent Assertions så blir valideringen av testerna mycket lättläst och enkel att följa i jämförelse med de mer traditionella metoderna som erbjuds i många testramverk.

Uppbyggnad av ett test

Normalt delar man in ett test i tre olika delar:

  • Arrange – skapar de förutsättningar som testet kräver i form av resurser och tjänster
  • Act – utför det som ska testas
  • Assert – verifierar utfallet av testet

Så vad gör Fluent Assertions?

Fluent Assertions är ett .NET-bibliotek som riktar in sig på den sista delen som gäller ”Assert”. Vanligtvis använder man testramverkets Assert-metoder för att verifiera resultatet av testen. En nackdel med dessa metoder är att testerna blir väldigt tekniska till sin natur och det kan vara svårt att se exakt vad man testar. Med Fluent Assertions så blir koden för att verifiera resultaten mycket enklare att förstå. Fluent Assertions är egentligen ett bibliotek med ”extension methods”. Det gör att man kan kedja ihop flera olika anrop och på så sätt få ett mycket mer uttrycksfullt sätt att skriva valideringskoden.

Test av en kalkylator

Som exempel så testar vi följande klass som är en mycket enkel kalkylator.


using System;
using System.Collections.Generic;

namespace CalculatorLib
{
  public class Calculator
  {
    private Stack _history = new Stack();

    public int Memory
    {
      get;
      set;
    }

    public IEnumerable History
    {
      get { return _history; }
    }

    public Calculator()
    {
    }

    public int Add(int num1, int num2)
    {
      var result = num1 + num2;
      _history.Push(result);
      return result;
    }

    public int Subtract(int num1, int num2)
    {
      var result = num1 - num2;
      _history.Push(result);
      return result;
    }

    public int Multiply(int num1, int num2)
    {
      var result = num1 * num2;
      _history.Push(result);
      return result;
    }

    public double Divide(int num1, int num2)
    {
      if (num2 == 0)
        throw new ArgumentException("Zero is not allowed", nameof(num2));

      return Convert.ToDouble(num1) / Convert.ToDouble(num2);
    }
  }
}

Tester skrivna med nUnits assert-metoder

Såhär skulle tester kunna se ut om de skrivs på vanligt sätt med nUnits assert-metoder.


using CalculatorLib;
using NUnit.Framework;
using System;
using System.Collections.Generic;

namespace CalculatorLibraryTest
{
  [TestFixture]
  public class ClassicCalculatorLibTests
  {
    [Test]
    public void TestAddition()
    {
      // Arrange
      var calculator = new Calculator();

      // Act 
      var result = calculator.Add(2, 4);

      // Assert
      Assert.AreEqual(6, result, "incorrect sum of 2 + 4");
    }

    [Test]
    public void TestSubtraction()
    {
      // Arrange
      var calculator = new Calculator();

      // Act 
      var result = calculator.Subtract(10, 3);

      // Assert
      Assert.AreEqual(7, result, "incorrect difference of 10 - 3");
    }

    [Test]
    public void TestMultiplication()
    {
      // Arrange
      var calculator = new Calculator();

      // Act 
      var result = calculator.Multiply(5, 3);

      // Assert
      Assert.AreEqual(15, result, "incorrect product of 5 * 3");
    }

    [Test]
    public void TestDivision()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var result = calculator.Divide(15, 3);

      // Assert
      Assert.AreEqual(5d, result, "incorrect quote of 15 / 3");
    }

    [Test]
    public void TestDivisionByZero()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      Action act = () => calculator.Divide(15, 0);

      // Assert
      ArgumentException ex = Assert.Throws(new TestDelegate(act));
      Assert.That(ex.Message, Is.StringStarting("Zero is not allowed"));
      Assert.That(ex.ParamName, Is.EqualTo("num2"));
    }

    [Test]
    public void TestMemory()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var sum = calculator.Add(2, 9);
      calculator.Memory = sum;
      var result = calculator.Memory;

      // Assert
      Assert.AreEqual(11, result, "incorrect value in memory");
    }

    [Test]
    public void TestResultHistory()
    {
      // Arrange
      var calculator = new Calculator();
      var sum = calculator.Add(1, 3);
      var difference = calculator.Subtract(5, 2);
      var product = calculator.Multiply(6, 3);
      var expected = new Stack();
      expected.Push(sum);
      expected.Push(difference);
      expected.Push(product);

      // Act
      var history = calculator.History;

      // Assert
      CollectionAssert.IsNotEmpty(history);
      CollectionAssert.AreEqual(expected, history);
    }
  }
}

I detta fall använder vi metoden Assert samt CollectionsAssert för att validera utfallet av testet. Även om det går att förstå vad koden gör så kräver det en del tankeverksamhet för att förstå vad som testas och framförallt vad det förväntade resultatet ska vara.

Tester skrivna med Fluent Assertions

Så här kan motsvarande tester skrivas med Fluent Assertions.


using NUnit.Framework;
using FluentAssertions;
using CalculatorLib;

using System;
namespace CalculatorLibTest
{
  [TestFixture()]
  public class CalculatorTest
  {
    [Test()]
    public void TestAddition()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var result = calculator.Add(2, 4);

      // Assert
      result.Should().Be(6,"because it's the sum of 2 and 4");
    }

    [Test]
    public void TestSubtraction()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var result = calculator.Subtract(10, 3);

      // Assert
      result.Should().Be(7, "because it's the difference between 10 and 3");
    }

    [Test]
    public void TestMultiplication()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var result = calculator.Multiply(5, 3);

      // Assert
      result.Should().Be(15, "because it's the product of 5 and 3");
    }	

    [Test]
    public void TestDivision()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var result = calculator.Divide(15, 3);

      // Assert
      result.Should().Be(5.0d, "because it's the quote of 15 and 3");
    }

    [Test]
    public void TestDivisionByZero()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      Action act = () => calculator.Divide(15, 0);

      // Assert
      act.ShouldThrow("because division by zero is not allowed")
        .Where(e => e.Message.StartsWith("Zero is not allowed"))
        .And.ParamName.Should().BeEquivalentTo("num2");
    }

    [Test]
    public void TestMemory()
    {
      // Arrange
      var calculator = new Calculator();

      // Act
      var sum = calculator.Add(2, 9);
      calculator.Memory = sum;
      var result = calculator.Memory;

      // Assert
      result.Should().Be(11, "because the sum of 2 and 9 should be stored in memory");
    }

    [Test]
    public void TestResultHistory()
    {
      // Arrange
      var calculator = new Calculator();
      var sum = calculator.Add(1, 3);
      var difference = calculator.Subtract(5, 2);
      var product = calculator.Multiply(6, 3);

      // Act
      var history = calculator.History;

      // Assert
      history.Should().NotBeEmpty()
        .And.HaveCount(3).And
        .ContainInOrder(product,difference,sum);
    }
  }
}

Fluent Assertions låter oss tala om vad utfallet borde vara (därav metoden Should()). Vi kan sedan länka på ytterligare villkor som vi förväntar oss ska vara uppfyllda. Det är ganska enkelt att förstå vad det förväntade utfallet ska vara genom att bara läsa koden. Fluent Assertions gör att koden blir lätt att förstå även för någon som inte kan programmering.

Vad kan Fluent Assertions göra mer?

Fluent Assertions kan användas för att validera struktur i projekt t.ex. att projekt refererar varandra på rätt sätt t.ex. att presentationslager endast refererar affärslogikslagret och att det i sin tur refererar datalagret. På så sätt kan man bygga in tester för arkitektur. Det finns även tillägg till Fluent Assertions som kan testa ”dependency injection” som t.ex. ninject.

Läs mer på Fluent Assertions

Uppdatera till macOS Sierra

Det senaste operativsystemet för Apples Mac-datorer heter macOS Sierra. Tidigare kallades operativsystemet OS X men nu överger Apple det namnet och knyter på så sätt operativsystem närmare Mac-datorerna.

Det finns många nyheter i macOS Sierra. Den mest påtagliga förändringen är att röstassistenten Siri som tidigare endast funnits i iOS nu anpassats till datorn. Man kan styra datorn via Siri genom att trycka på ikonen för Siri och tala om för den vad man vill (t.ex. ”Starta Spotify”, ”Visa bilder från juni” m.m.). Applikationen meddelanden har också blivit uppdaterad för att matcha utvecklingen i iOS. Picture in picture gör att man kan titta på film under tiden man gör andra saker genom att den spelas upp i ett separat fönster. Det finns nu också stöd för att ha flikar likt de som finns i webbläsaren Safari i andra applikationer.

Under ytan har det också hänt en del saker. Filsystemet är omgjort och Apple har även knutit det närmare till sin tjänst iCloud för att möjliggöra att spara utrymme på hårddisken genom att flytta sällan använda filer till iCloud.

Måste du uppdatera till macOS Sierra?

För de flesta så är det ingen brådska med att uppdatera till macOS Sierra. Om du har applikationer som du inte klarar dig utan någon längre period kan det vara klokt att avvakta så de hinner anpassas till macOS Sierra.

Om utrymmet på hårddisken är ett problem kan det vara bra att uppdatera till macOS Sierra eftersom det möjliggör för effektivare lagring genom att flytta saker som sällan används till iCloud.

Förbereda för uppdatering

Nedladdningen för macOS Sierra är cirka 5 GB stor, så du bör se till att ha tillräckligt med diskutrymme. Som alltid så bör du ta en backup av datorn innan du uppdaterar. Lämpligen gör du det med Time Machine till en extern enhet. Det kan också vara bra att rensa bort applikationer som du inte längre använder eftersom en del program ännu inte är kompatibla. Se också till att du har dina användaruppgifter för Apple ID tillgängliga.

Uppdatera till macOS Sierra

För att uppdatera till macOS Sierra går du in i App Store och väljer uppdateringar och väljer macOS Sierra. När nedladdningen är klar så visas en dialogruta som låter dig påbörja uppdateringen. Klicka dig vidare genom dialogerna och godkänn det nya licensavtalet. När installationen påbörjas startar datorn om och installationsförloppet kommer att visas. Datorn startar om ett antal gånger vilket är helt normalt. Om det verkar som att installationen har fastnat så ha tålamod och vänta, för den brukar fortsätta även om det kan ta tid.

Efter installation

Första gången du loggar in efter uppdateringen så ombeds du att ange ditt Apple ID. Därefter får du göra en del inställningar. Du kommer bland annat att bli tillfrågad om du vill spara dokument i iCloud så att de blir tillgängliga på andra enheter som iPad och iPhone. Efter du gjort alla inställningar så är det en god idé att gå in i App Store och uppdatera övriga applikationer.

När du ser att allt fungerar så bör du ta en ny backup. Tänk på att denna backup kommer att ta lite mer tid eftersom det är mycket som har ändrats. Om du gör backup till en nätverksdisk med Time Machine bör du se till att den är uppdaterad till så att den kan hantera det nya formatet som används i macOS Sierra.

En gratis bok om Continuous Delivery med Windows och .NET

Continuous Delivery är inget nytt begrepp men det kan vara svårt att veta hur man uppnår det. Vilka verktyg ska man använda och vilket arbetssätt ska man ha? Boken Continuous Delivery – Reliable Software Releases through Build, Test, and Deployment Automation (2010) är en mycket bra källa till hur Continuous Delivery fungerar men det kan vara svårt att veta hur man ska gå tillväga rent praktiskt i en Windowsbaserad miljö.

Boken Continuous Delivery with Windows and .NET beskriver på ett mycket konkret sätt hur man kan realisera Continuous Delivery i Windows och .NET-baserade miljöer. Boken är gratis att ladda ned om man registrerar sin mejladress.