Säkra dina konton

Några tips för att säkra dina konton.

1. Använd aldrig samma lösenord på flera ställen
2. Använd lösenordshanterare
3. Använd tvåfaktorsautentisering
4. Använd fysiska säkerhetsnycklar
5. Använd unika mejladresser för olika konton

1. Använd aldrig samma lösenord på flera ställen

Den absolut viktigaste regeln att komma ihåg är att aldrig använda samma lösenord på flera ställen. Om ditt lösenord läcker ut så kan en angripare potentiellt komma åt alla platser där du använt det. Använd därför ett unikt lösenord på varje ställe så minskar risken att andra konton drabbas om lösenordet för ett konto läckt ut. Men blir det inte jättejobbigt att hålla reda på alla olika lösenord? Ja, det blir det och därför ska du använda dig av en lösenordshanterare.

2. Använd lösenordshanterare

En lösenordshanterare kan liknas vid ett kassaskåp där du förvarar alla dina inloggningsuppgifter för olika konton. En lösenordshanterare kan även hjälpa dig att skapa lösenord som är säkrare. Lösenordshanterare finns ofta som både app till telefonen och som tillägg till webbläsare.

När du surfar till en inloggningssida så kan lösenordshanteraren automatiskt fylla i inloggningsuppgifterna åt dig. Koden till lösenordshanteraren är det enda du behöver komma ihåg men se till att välja ett långt och säkert lösenord till den eftersom alla dina andra lösenord finns i den.

Om möjligt så bör du även se till att ha tvåfaktorsautentisering för din lösenordshanterare.

Det finns många lösenordshanterare att välja mellan men några bra alternativ är Bitwarden, 1Password eller Protonpass.

3. Använd tvåfaktorsautentisering

Att använda unika lösenord för olika konton och använda en lösenordshanterare är en bra start. För att öka säkerheten ännu mer så bör du aktivera tvåfaktorsautentisering (oftast förkortat 2FA) där så är möjligt.

Tvåfaktorsautentisering innebär att du förutom ditt användarnamn och lösenord måste ange ytterligare en hemlighet för att logga in. Oftast är denna hemlighet ett tidsbaserat engångslösenord som skapas av en autentiserings-app som t.ex. Google Authenticator eller Authy. Dessa appar genererar en kod som gäller under 30 sekunder och därefter genereras en ny kod.

Med tvåfaktorautentisering har du ett extra skydd om någon skulle få reda på ditt användarnamn och lösenord. De kommer i alla fall inte att kunna logga in utan koden från din autentiserings-app.

Det finns andra typer av tvåfaktorsautentiseringslösningar som skickar koder via SMS eller via mejl. Det är en mer osäker metod men bättre än inget men om möjligt så bör du använda en autentiserings-app.

4. Använd fysiska säkerhetsnycklar

Ytterligare en form av tvåfaktorsautentisering är att använda sig av fysiska säkerhetsnycklar. En säkerhetsnyckel kopplas in i dator eller telefon via usb eller kontaktlöst genom att blippa den.

En fysisk säkerhetnyckel är det absolut säkraste alternativet eftersom det är en enhet som bara du har tillgång till. Det är dock viktigt att komma ihåg att du alltid bör ha minst två säkerhetsnycklar. En primär och en som backup. Annars riskerar du att bli utelåst om du tappar bort din säkerhetsnyckel eller om den går sönder.

Det går att skapa lösenordsfria konton på en del ställen. Det betyder att du ersätter ditt användarnamn och lösenord med en säkerhetsnyckel i stället.

Det finns många olika typer av säkerhetsnycklar men ett bra alternativ är nycklar från Yubikey.

5. Använd unika mejladresser för olika konton

Om du följer rekommendationerna i punkterna 1 – 3 så har du förbättrat din säkerhet rejält och minimerat konsekvenserna om dina inloggningsuppgifter skulle läcka från något konto. Det finns dock en sak till som du kan göra för att öka säkerheten ytterligare ett snäpp. Precis som att du inte ska använda samma lösenord på flera ställen så kan det vara bra att inte använda samma mejladress. Det finns tjänster som låter dig skapa så kallade epost-alias och vidarebefordrar mejl till din riktiga mejladress.

Genom att skapa ett alias för respektive tjänst så gör du det ännu svårare för en angripare. Om både mejladressen och lösenordet är unikt för varje tjänst så har en angripare mindre chans att ta sig in i på dina övriga konton.

Ytterligare en fördel med epost-alias är att det blir lättare att se om någon tjänst läckt eller delat med sig av din epost-adress till andra. Om du skapat ett alias specifikt för en tjänst och börjar få meddelanden från andra avsändare till ditt alias så kan du vara säker på var läckaget har uppstått. Du kan då enkelt avveckla den alias-adressen och skapa en ny om du vill.

Exempel på en epost-aliastjänst är simplelogin.io. Om du använder AppleID så kan du använda funktionen ”Hide my email”.

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.

Rider, ett alternativt IDE för .NET-utveckling

JetBrains, som är kända för att skapa utmärkta utvecklingsverktyg som IntelliJ, PyCharm och ReSharper för att nämna några, har släppt ett IDE för .NET-utveckling som heter Rider.

En kombination av IntelliJ och ReSharper

Rider är en kombination av IntelliJ IDE och ReSharper. Om du har använt andra integrerade utvecklingsmiljöer från JetBrains kommer Rider att kännas bekant. ReSharper är ett verktyg för realtidskodsanalys som hittar kodproblem medan du skriver kod. Det är ett proaktivt sätt att förhindra teknisk skuld.

Rider är plattformsoberoende och kan köras på Windows, Mac eller Linux. Det är mer lättviktigt än Visual Studio som kan at ganska mycket utrymme. Rider ger dig detaljerad kontroll över vilka delar du vill installera jämfört med Visual Studio.

Rider stöder de flesta versionshanteringssystemen och du kan välja vilka du vill använda. Förutom C #, stödjer Rider också Visual Basic och F #.

Det finns dock vissa barnsjukdommor i Rider. Den klarar inte alltid att automatiskt inkludera beroenden för bibliotek som leder till irriterande kompileringsfel. Att köra enhetstester går långsamt ibland och ibland startar Rider inte testkörningar som förväntat. Det finns också några konstiga beteenden med verktygsfönster som gömmer sig när de aktiveras.

Sammanfattning

Dessa problem kommer sannolikt att åtgärdas i framtida versioner av Rider. Sammantaget är Rider ett trevligt IDE om du vill ha en lättviktig och mindre resurskrävande IDE med ReSharper-support.

Ladda ned Rider

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