<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media = "http://search.yahoo.com/mrss/" version="2.0">
  <channel>
    <title>Posts on Michée Lengronne</title>
    <link>https://michee.io/en-us/posts/</link>
    <image>
      <url>https://michee.io/logo.png</url>
      <title>Posts on Michée Lengronne</title>
      <link>https://michee.io/en-us/posts/</link>
    </image>
    <description>Expertise in Platform, Big Data, DevOps, IT security (DevSecOps) and Opensource</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 08 Dec 2026 16:00:00 +0000</lastBuildDate><atom:link href="https://michee.io/en-us/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Agile Method: General Overview</title>
      <link>https://michee.io/en-us/posts/agile-method-general-overview/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/agile-method-general-overview/</guid>
      <description>The Agile method is a team and project management method.</description>
      <content:encoded><![CDATA[<p>The Agile method is a team management method for development teams (but it can be adapted to other fields such as marketing) that focuses on the team’s adaptability and responsiveness to customer requests.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>The method we use is a variation of the Agile method called <strong>Scrum</strong>.
This method takes its name from the team’s 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">daily meetings</a>, which are compared to a rugby scrum.</p>
<h2 id="how-does-it-work">How does it work?</h2>
<p>In practice, the project is broken down into a set of tasks
(called 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a>)
and these stories are spread over recurring time periods (called &ldquo;
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprints</a>&rdquo;).</p>
<p>The idea is to involve project clients at regular intervals by working iteratively.</p>
<p>A 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a> passes,
the client sees the completed work and decides whether to make changes or continue the project,
another 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a> is then formed. And so on.</p>
<p>An Agile team usually has fewer than 7 people. Beyond that, the team loses efficiency.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-method-general-overview/images/agile-method-general-overview-schema.png" class="figure-img img-fluid rounded" alt="The Agile method is a method of team and project management">
  <figcaption class="figure-caption"><p>Agile Method, General Overview (Diagram)</p>
    <small>The Agile method is a method of team and project management</small>
  </figcaption>
</figure>

<p>In this series of articles,
you will see how to formalize 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a>
to meet the specific needs of the project and the client, and how to structure your 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprints</a> to keep them effective.</p>
<p>The Agile method is often associated with DevOps techniques (and DevSecOps, MarketOps&hellip;) which we will cover in a future series.</p>
<h3 id="where-do-we-start">Where do we start?</h3>
<p>Well, let’s start at the beginning of a project, the <strong>
<a href="https://michee.io/en-us/posts/discovery-framing/">Discovery &amp; Framing</a></strong> phase.</p>
<p>Then, I invite you to read the articles on 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a>,

<a href="https://michee.io/en-us/posts/agile-method-the-ceremony/">the Ceremony</a>,

<a href="https://michee.io/en-us/posts/backlog-and-scrum-board/">the Backlog</a>,

<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Scrum and Sprint</a> to get an overview of this method.</p>
<p>After that, feel free to explore. The hyperlinks are there for that.</p>]]></content:encoded>
    </item>
    <item>
      <title>Agile Method: The Ceremony</title>
      <link>https://michee.io/en-us/posts/agile-method-the-ceremony/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/agile-method-the-ceremony/</guid>
      <description>The ceremony brings together all the participants of an agile project and allows for redefining the objectives.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>The ceremony is the meeting that brings together the agile team (the development team),
the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em> (the &ldquo;manager&rdquo; of the team),
and the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> (the client representative), and occasionally the clients.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>It usually takes place between <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">sprints</a></em>, at regular intervals.</p>
<p>This event is divided into several phases. Some teams choose to separate these phases to lighten the meetings.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-method-the-ceremony/images/the-ceremony-in-agile-method.png" class="figure-img img-fluid rounded" alt="Some teams choose to separate these phases to lighten the meetings">
  <figcaption class="figure-caption"><p>The ceremony in agile method</p>
    <small>Some teams choose to separate these phases to lighten the meetings</small>
  </figcaption>
</figure>

<h2 id="phase-1-at-the-start-of-the-project-sprint-planning-meeting">Phase 1, at the start of the project (Sprint Planning Meeting)</h2>
<p>Ceremony Master: The <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> assisted by the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em></p>
<p>Duration: less than 2 hours.</p>
<p>This phase allows detailing most of the stories in the form of 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Stories, NFR, or Spike</a>
and distributing them across the planned <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">sprints</a></em>.</p>
<p>It also allows estimating the broad outlines of the project.
It focuses on team cohesion and getting the team familiar with the clients and the project.</p>
<p>The goal is to start the first <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em> (<em>Sprint</em> 1 or <em>Sprint</em> 0) under good conditions.</p>
<h2 id="phase-1-during-the-project-sprint-review">Phase 1, during the project (Sprint Review)</h2>
<p>Ceremony Master: The <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> assisted by the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em></p>
<p>Duration: less than 1 hour.</p>
<p>This phase allows reviewing the previous <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em>.
During this phase, the agile team presents the results of the <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em> to all project stakeholders.
Demonstrations may be made during this phase to clients, end users, or a representative panel&hellip;</p>
<p>Clients, through the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em>, should get an idea of the project’s current state.</p>
<p>During this step, all participants provide feedback to the agile team. This is where the project can be reoriented and phase 2 prepared.</p>
<h2 id="little-limawi-bonus-between-the-two-phases">Little Limawi bonus, between the two phases</h2>
<p>Ceremony Master: None, it’s a card game</p>
<p>This inter-phase consists of reviewing threat models using the &ldquo;<em>
<a href="https://michee.io/en-us/posts/elevation-of-privilege/">Elevation of Privilege</a></em>&rdquo; game.
This method is explained in a dedicated article.</p>
<h2 id="phase-2-project-focused-product-backlog-refinement">Phase 2, project-focused (Product Backlog Refinement)</h2>
<p>Ceremony Master: The <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> assisted by the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em></p>
<p>Duration: less than 1 hour, can be very quick.</p>
<p>This phase allows reorganizing the stories (
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Stories, NFR, Spike</a>)
for the next <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em>.
The agile team questions the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em>
about the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> to make them as clear as possible.
The team then estimates the workload of all these 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a>
(in terms of complexity points or time) using 
<a href="https://michee.io/en-us/posts/agile-poker/">Agile Poker</a>.
Once the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories are estimated</a>,
the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> prioritizes them according to the team’s velocity.
He/she places them in &ldquo;TODO&rdquo; and sends any excess back to the <em>
<a href="https://michee.io/en-us/posts/backlog-and-scrum-board/">Backlog</a></em> (marked as &ldquo;POSTPONED&rdquo;).</p>
<p>This phase can occur in small touches throughout the <em>Sprint</em>.
In this case, the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> can refine much better and faster according to the challenges faced by the team.
If this approach is preferred, the phase within the ceremony can be very short.</p>
<h2 id="phase-2-team-focused-sprint-retrospective">Phase 2, team-focused (Sprint Retrospective)</h2>
<p>Ceremony Master: The <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em></p>
<p>Duration: less than 1 hour.</p>
<p>This phase focuses on the team’s health.
It can be done in the form of games.
It helps strengthen team cohesion and continuous improvement.</p>
<p>The goal of this phase is to re-motivate the team, address social relationship difficulties among team members, and improve the work environment.</p>]]></content:encoded>
    </item>
    <item>
      <title>Agile Method: The Stories</title>
      <link>https://michee.io/en-us/posts/agile-method-the-stories/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/agile-method-the-stories/</guid>
      <description>In agile methodology, a story refers to a set of related tasks and actions.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>There are several types of stories, but they all share having a goal, being estimable (or breakable into estimable elements), and having a clear definition of &ldquo;DONE&rdquo; (a clear end).</p>
<p>These units allow a project to be broken down clearly so it can be carried out as efficiently as possible.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="here-is-a-non-exhaustive-overview-of-the-different-types-of-stories">Here is a (non-exhaustive) overview of the different types of stories</h2>
<ul>
<li>Task: Not really a story per se, but it is the atomic unit on which a story is built.
It should be as simple as possible.
For example, if the story is &ldquo;entering a house,&rdquo;
the task is &ldquo;place the hand on the door handle,&rdquo; the next task &ldquo;turn the handle,&rdquo; etc.</li>
<li><em>Story</em>: This is the most well-known type of story in agile methodology.
It is focused on interaction with the end user.
To avoid confusing &ldquo;histoire&rdquo; and &ldquo;story&rdquo; in English, the term &ldquo;User Story&rdquo; is preferred.
It allows the realization of a feature.</li>
<li>NFR: This type of story is the hardest to define.
NFR stands for &ldquo;Non-functional requirements.&rdquo;
These are all actions necessary for the smooth running of the project but do not affect the end user&rsquo;s interaction with the project.
For example, code refactoring, a license change, setting up a new development server, or a coffee machine for the team.</li>
<li>Spike: This story formalizes research steps. It has a different definition of DONE than others because research inherently involves uncertainty.</li>
<li>Epic: This definition varies depending on who uses it. Generally, it defines a story whose estimation exceeds the capacity of a Sprint.
It must therefore be broken down into smaller stories.</li>
<li>Initiative: Used by 
<a href="https://www.atlassian.com/agile/project-management/epics-stories-themes" target="_blank">JIRA</a>.
It groups together a set of Epics linked by a common goal.</li>
<li>Theme: This story groups Epics or Initiatives whose completion represents a major change for a large part of the organization (or company).</li>
<li>Saga: This term is rarely used (but I like it) and can be confused with Theme or Initiative.
It gives a sense of continuity akin to &ldquo;epic.&rdquo;
It can define the root of the project, the story tree. Therefore, I suggest calling the story tree &ldquo;<em>Yggdrasil</em>&rdquo; to remain consistent in terminology.</li>
</ul>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-method-the-stories/images/stories-in-agile-method.png" class="figure-img img-fluid rounded" alt="The story tree, Yggdrasil">
  <figcaption class="figure-caption"><p>Stories in Agile Methodology</p>
    <small>The story tree, Yggdrasil</small>
  </figcaption>
</figure>

<h2 id="story-start-and-end">Story Start and End</h2>
<p>Each story must have a clear definition of READY (or TODO) and, most often, DONE.</p>
<p>That is, the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> and the agile team must agree on the prerequisites for starting the story (READY).
For DONE, they must define the criteria that ensure a story is truly finished.
Note that stories like Epic, Theme, Initiative, or Saga do not have a DONE definition other than the DONE of all the stories they comprise.</p>
<h2 id="some-stories-in-detail">Some Stories in Detail</h2>
<h3 id="user-story">User Story</h3>
<p>The most well-known story in agile methodology.
This type of story creates functional value for the 
<a href="https://michee.io/en-us/posts/the-user-persona/">end user</a>.</p>
<p>Definition of READY: A story must have a clear start according to the INVEST acronym below:</p>
<ul>
<li><em>Independent</em>: Each story must be independent of any other task.</li>
<li><em>Negotiable</em>: Each story should be discussable to best describe the user journey it provides:
<ul>
<li><em>Given a state</em></li>
<li><em>When an action</em></li>
<li><em>Then a result</em></li>
</ul>
</li>
<li><em>Valuable</em>: Each story must deliver actual value to the product from the perspective of the 
<a href="https://michee.io/en-us/posts/the-user-persona/">end user</a>.</li>
<li><em>Estimable</em>: Each story must be estimable in terms of complexity points, leading to a time estimate.</li>
<li><em>Small</em>: Each story should be small enough to be completed by one or a few people in a <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em>.</li>
<li><em>Testable</em>: Each story should be testable within a continuous integration testing tool.</li>
</ul>
<p>Definition of DONE: A story must have a clear end defined in advance with specific objectives.</p>
<p>Example of DONE:</p>
<ul>
<li>Generated documentation</li>
<li>Functional tests passed</li>
<li>Security tests passed</li>
</ul>
<h3 id="nfr">NFR</h3>
<p>NFR is an agile story type that does not focus on the 
<a href="https://michee.io/en-us/posts/the-user-persona/">end user</a>.</p>
<p>NFR stands for &ldquo;Non-functional requirements.&rdquo;</p>
<p>It addresses tasks necessary for the smooth running of the project but invisible to the 
<a href="https://michee.io/en-us/posts/the-user-persona/">end user</a>.</p>
<p>Examples:</p>
<ul>
<li>Legal issues</li>
<li>Security issues</li>
<li>Organizational issues</li>
<li>Performance issues</li>
<li>Infrastructure issues</li>
</ul>
<p>An NFR is similar to a Story, except it is not focused on the 
<a href="https://michee.io/en-us/posts/the-user-persona/">end user</a>.</p>
<p>An NFR must be SMART:</p>
<ul>
<li><em>Specific</em>: understandable by everyone</li>
<li><em>Measurable</em>: with a clearly defined DONE (objective)</li>
<li><em>Achievable</em>: feasible</li>
<li><em>Relevant</em>: pertinent</li>
<li><em>Time-Boxed</em>: short-term and estimable in complexity points</li>
</ul>
<p>It must have a clear definition of READY and DONE.</p>
<h3 id="spike">Spike</h3>
<p>Used for research in agile methodology.</p>
<p>A <em>Spike</em> (the tip) aims to clarify steps, knowledge, and time needed to resolve Stories and NFRs.</p>
<p>It must be independent and testable, but by nature, it is not estimable.
Indeed, in research, the outcome is unknown, making estimation impossible.</p>
<p>To address this, it is time-boxed (with a defined time).</p>
<blockquote>
<p>Example: Researching a CouchDB replacement in 24 hours (3 days)</p></blockquote>
<p>A <em>Spike</em> must be SMART:</p>
<ul>
<li><em>Specific</em>: understandable by everyone</li>
<li><em>Measurable</em>: with a clearly defined DONE (objective)</li>
<li><em>Achievable</em>: feasible</li>
<li><em>Relevant</em>: pertinent</li>
<li><em>Time-Boxed</em>: short-term</li>
</ul>
<p>It must have a clear definition of READY and DONE.</p>
<p>The DONE in this case defines the goal and research direction. It helps determine whether the research is valid.</p>
<p>For example, if the goal is to find a new method for making a raspberry pie and the research results in methods for making cat kibble, it is not DONE.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-method-the-stories/images/estimable-stories-in-agile-method.png" class="figure-img img-fluid rounded" alt="Each story must have a clear definition of READY (or TODO) and, most often, DONE">
  <figcaption class="figure-caption"><p>Estimable Stories in Agile Methodology</p>
    <small>Each story must have a clear definition of READY (or TODO) and, most often, DONE</small>
  </figcaption>
</figure>

<h2 id="sources">Sources</h2>
<ul>
<li>
<a href="https://www.scrumexpert.com/knowledge/using-sagas-as-a-strategic-view-of-epics" target="_blank">Scrum Expert</a></li>
<li>
<a href="https://www.atlassian.com/agile/project-management/epics-stories-themes" target="_blank">Atlassian</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Agile poker</title>
      <link>https://michee.io/en-us/posts/agile-poker/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/agile-poker/</guid>
      <description>Agile poker is a playful way to assess the complexity of Stories in agile methodology.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>Agile Poker is presented in the form of a set of cards, with each person receiving a complete deck.
During the <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em> ceremony, the team uses the cards to evaluate the complexity of the stories (
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories, NFR, or Spike</a>) being considered.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="complexity-point">Complexity Point</h2>
<p>To estimate the difficulty of completing a 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a>, the first instinct might be to determine a duration.</p>
<p>This approach can create a stressful environment.
Indeed, a developer (or marketer, etc.) responsible for the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> might feel pressured by time and complete the story too quickly and poorly.</p>
<p>Of course, the review phase can address this issue by repeating parts of the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> over and over, but this is a waste of time, energy, and resources.</p>
<p>This is where the complexity point comes in.</p>
<p>This tool allows assigning a complexity value to the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a>.
The value can be relative to other 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> or absolute.</p>
<p>In software development, the agile complexity point can mirror the complexity of the code to be written. For example:</p>
<ul>
<li>one class = 1 point, 3 classes = 3 points</li>
<li>1 point per method</li>
<li>based on calculated complexity (e.g., in 
<a href="https://github.com/sebastianbergmann/phploc" target="_blank">PHP</a>)</li>
</ul>
<p>Each 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> is assigned complexity points via Agile Poker.</p>
<h2 id="velocity">Velocity</h2>
<p>The complexity point is not initially tied to duration.</p>
<p>Once an agile team becomes well-practiced (i.e., after several <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprints</a></em>), it is possible to determine the average number of complexity points the team can complete per <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em>.</p>
<p>This is velocity.</p>
<p>It is a batch approach, but trying to over-detail the average time per complexity point can create stress again.</p>
<p>Once an average velocity is estimated, the goal is to measure the team&rsquo;s performance and maintain that velocity.</p>
<p>It is not always wise to try to increase it, to avoid reverting to a stressful situation.</p>
<h2 id="poker-rules">Poker Rules</h2>
<p>For each 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a>, every team member selects a card from their deck and keeps it hidden.
The card represents their estimation of the [story]&rsquo;s complexity.</p>
<p>Once everyone has chosen, all cards are revealed simultaneously.</p>
<p>Those whose cards are farthest from the average explain their reasoning.
A consensus is then reached on the team&rsquo;s estimated complexity.</p>
<p>The available decks below are 7 in number (for a standard agile team) and are distinguishable by color.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-poker/images/agile-poker-rules.png" class="figure-img img-fluid rounded" alt="This card represents their estimation of the story’s complexity">
  <figcaption class="figure-caption"><p>Agile Poker Rules</p>
    <small>This card represents their estimation of the story’s complexity</small>
  </figcaption>
</figure>

<p>Each deck contains:</p>
<ul>
<li>a Fibonacci sequence: for precise estimates or workdays (for <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Spikes</a></em>) using the grid in the center (one column represents a full week);</li>
<li>T-shirt sizes: for less precise estimates;</li>
<li>a plus and minus: to approve or disapprove;</li>
<li>a question mark: when unsure;</li>
<li>a coffee: when it&rsquo;s time for a break;</li>
<li>infinity: when the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> is too large and needs to be broken down.</li>
</ul>
<div class="row">
<div class="col-lg-6 col-md-6">

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-poker/images/agile-poker-part-1.png" class="figure-img img-fluid rounded" alt="First Agile Poker card board">
  <figcaption class="figure-caption"><p>Agile Poker Board 1</p>
    <small>First Agile Poker card board</small>
  </figcaption>
</figure>

</div>

<div class="col-lg-6 col-md-6">

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/agile-poker/images/agile-poker-part-2.png" class="figure-img img-fluid rounded" alt="Second Agile Poker card board">
  <figcaption class="figure-caption"><p>Agile Poker Board 2</p>
    <small>Second Agile Poker card board</small>
  </figcaption>
</figure>

</div>

</div>

<h2 id="sources">Sources</h2>
<ul>
<li>
<a href="https://www.atlassian.com/agile/project-management/estimation" target="_blank">Atlassian</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Backlog and Scrum Board</title>
      <link>https://michee.io/en-us/posts/backlog-and-scrum-board/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/backlog-and-scrum-board/</guid>
      <description>The Backlog is the organized list of all the stories in a project.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>The <em>Backlog</em> gathers all the stories of a project. This list is usually digital but can also be displayed on <em>post-its</em>.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>This list is maintained by the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> with the help of the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em>.</p>
<p>Each 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a>, within the <em>Backlog</em>, has a label describing its type (
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">NFR, <em>Story</em>, <em>Spike</em>&hellip;</a>) and progress or scope labels.
All project stakeholders can add 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> to the <em>Backlog</em>, as it gathers all sources of project actions (<em>Bug Tracker</em>, <em>User Feedback</em>, continuous integration feedback, logs, error reports, discussions between stakeholders&hellip;).</p>
<p>At each ceremony, the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> extracts a certain number of 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> from the <em>Backlog</em> and assigns them a progress label.
These extracted 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> form a sub-<em>Backlog</em> called the <em>Sprint Backlog</em>.
The main <em>Backlog</em>, in this case, is called the <em>Product Backlog</em>. Note that <em>Backlogs</em> can be hierarchized as needed to optimize clarity and maintain efficiency.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/backlog-and-scrum-board/images/product-backlog-in-agile-method-scrum.png" class="figure-img img-fluid rounded" alt="This list is usually digital but can also be displayed on post-its">
  <figcaption class="figure-caption"><p>Product Backlog in Agile (Scrum)</p>
    <small>This list is usually digital but can also be displayed on post-its</small>
  </figcaption>
</figure>

<p>All stories in the <em>Sprint Backlog</em> must be estimated by the team using 
<a href="https://michee.io/en-us/posts/agile-poker/">Agile Poker</a>.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/backlog-and-scrum-board/images/sprint-backlog-in-agile-method-scrum.png" class="figure-img img-fluid rounded" alt="All stories in the Sprint Backlog must be estimated by the team using Agile Poker">
  <figcaption class="figure-caption"><p>Sprint Backlog in Agile (Scrum)</p>
    <small>All stories in the Sprint Backlog must be estimated by the team using Agile Poker</small>
  </figcaption>
</figure>

<p>The scope label can be defined by any project stakeholder following the project management strategy (team members or only the 
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/"><em>Scrum Master</em></a>, for example).
It also defines a sub-<em>Backlog</em> and allows multiple teams to work in parallel or directs 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> to the team members best suited to handle them.</p>
<h2 id="examples-of-labels">Examples of Labels</h2>
<p>Progress labels I use:</p>
<ul>
<li>DISCUSSION: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> has not been analyzed yet. It’s a new input, a new idea…</li>
<li>TODO: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> has been estimated and extracted from the <em>Backlog</em> by the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> for the current <em>Sprint Backlog</em>.
It has not yet been started by the team.</li>
<li>DOING: After TODO, once the team has started working on the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a>.</li>
<li>REVIEW: After DOING, once the team believes the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> is completed.
A team member who did not participate in this 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> or an external reviewer evaluates whether the work matches the story.
There is often a back-and-forth between DOING and REVIEW to refine the match between the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> and its implementation.</li>
<li>DONE: After REVIEW, once the reviewer has given the green light. The 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> is completed.
The definition of DONE is important and may vary depending on the type of 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> and the initial definition given during Sprint 0 or <em>
<a href="https://michee.io/en-us/posts/discovery-framing/">Discovery &amp; Framing</a></em>.
Typically, the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em> moves the story to DONE.</li>
<li>POSTPONED: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> was misestimated or a problem occurred during the <em>Sprint</em>.
It is postponed to a following <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em>.</li>
</ul>
<p>Scope labels:</p>
<ul>
<li>SECURITY: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> involves security aspects. It is handled by specialized security members.</li>
<li>PERFORMANCE: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> involves performance aspects. It is handled by specialized performance members.</li>
<li>DOC: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> involves documentation. It is handled by specialized documentation members.</li>
<li>TEST: This 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> involves testing. It is handled by specialized testing members.</li>
</ul>
<h2 id="scrum-board">Scrum Board</h2>
<p>The 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> from the <em>Sprint Backlog</em> can be displayed on a <em>Scrum Board</em>.</p>
<p>It is a column-based board, with each column representing a progress label.
The columns are arranged left to right according to the logical order of progress labels.</p>
<p>The idea is to move stories from left (TODO) to right (DONE).
An effective Agile team has all 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> in DONE by the end of the <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprint</a></em>.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/backlog-and-scrum-board/images/scrum-board-in-agile-method-scrum.png" class="figure-img img-fluid rounded" alt="Columns are arranged left to right according to the logical order of progress labels">
  <figcaption class="figure-caption"><p>Scrum Board in Agile (Scrum)</p>
    <small>Columns are arranged left to right according to the logical order of progress labels</small>
  </figcaption>
</figure>]]></content:encoded>
    </item>
    <item>
      <title>Discovery &amp; Framing</title>
      <link>https://michee.io/en-us/posts/discovery-framing/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/discovery-framing/</guid>
      <description>The Discovery &amp; Framing is the initial phase of an agile project and is used to rough it out.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>“<em>Discovery and Framing</em>” are two associated terms (discovery and framing) that describe an initial phase preceding the 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/"><em>sprints</em></a>.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>This phase is used to rough out a project and formalize it so it can be conducted using the agile method. It generally spans one week.</p>
<p>It is structured in two parts: discovery and framing (hence the name).</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/discovery-framing/images/discovery-framing-in-agile-method.png" class="figure-img img-fluid rounded" alt="It is structured in two parts: discovery and framing (hence the name)">
  <figcaption class="figure-caption"><p>Discovery &amp; Framing in Agile Method</p>
    <small>It is structured in two parts: discovery and framing (hence the name)</small>
  </figcaption>
</figure>

<h2 id="discovery">Discovery</h2>
<p>It starts on Monday and ideally ends on Wednesday.</p>
<p>Each day, hypotheses about the project are detailed and clients are interviewed extensively. A meeting is held every morning to gather results and start again (similar to 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/"><em>scrum</em></a>).</p>
<p>Do not try to estimate time; this is a research phase.
If this phase extends too far beyond Wednesday, it may be necessary to schedule another week.</p>
<h2 id="framing-formalization">Framing (Formalization)</h2>
<p>From Wednesday onwards, you can start creating workshops within the teams.
These workshops aim to define the main identifiers of the project:</p>
<ul>
<li>
<p>The “<em>buyers personas</em>” and 
<a href="https://michee.io/en-us/posts/the-user-persona"><em>final users personas</em></a>: this technique is often used in marketing to target markets.
In this context, it should be approached more broadly and technically. How will end users interact with the system? What are their cultures and backgrounds to anticipate the system&rsquo;s usability?</p>
</li>
<li>
<p>Determine the minimum viable objective to achieve.
That is, the set of features absolutely necessary for the first version of the system.
This is the “<em>Minimum Viable Product</em>” (MVP).</p>
</li>
<li>
<p>From this data, create a 
<a href="https://michee.io/en-us/posts/the-lean-canvas/"><em>Lean Canvas</em></a> that will serve as the overall project sheet.</p>
</li>
<li>
<p>Determine the necessary development environment and tools to develop, test, and deploy this first version.</p>
</li>
<li>
<p>Begin detailing the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/"><em>epics</em>, sagas, <em>themes</em>, and initiatives</a> of the project, but not yet the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/"><em>stories</em>, NFR, and <em>Spike</em></a>.
The goal is to have a long-term vision of the project.</p>
</li>
</ul>
<h2 id="wrap-up-and-next-steps">Wrap-up and Next Steps</h2>
<p>This week concludes with a retrospective meeting (recalling the ceremony) to review progress.
Of course, this meeting should not exceed 2 hours to remain effective.</p>
<p>This <em>Discovery &amp; Framing</em> phase can be repeated (iterated) over several weeks until all project participants are satisfied with the main identifiers.</p>
<p>Once this phase is complete, the 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/"><em>Sprints</em></a> begin.
Depending on the project, a Sprint 0 can be scheduled at this point, serving as a warm-up 
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/"><em>Sprint</em></a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Elevation of Privilege</title>
      <link>https://michee.io/en-us/posts/elevation-of-privilege/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/elevation-of-privilege/</guid>
      <description>Elevation of Privilege is a card game that allows modeling threats to a system.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<h2 id="threat-modeling">Threat Modeling</h2>
<p>A threat model is a tool that helps identify a system&rsquo;s vulnerabilities in advance and determine ways to address them.</p>
<p>In agile methodology, it is continuously updated. It must follow the existing product and quickly adapt to new developments.</p>
<p>How to achieve this?</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="diagrams-and-schematics">Diagrams and Schematics</h2>
<p>First, it is necessary to document your project. It should have visual representations of its components and information flows.</p>
<p>One way to represent this data is using UML. The problem is that this language is complex to write and update manually.</p>
<p>It is therefore preferable to automate documentation and diagrams as much as possible (whether in UML or another format) to produce them easily with each project update.</p>
<p>If diagrams are done manually, simple sketches are enough. They just need to be understandable by all team members.</p>
<p>Once these diagrams are done, they can be analyzed to identify vulnerabilities—playfully, using the game &ldquo;<code>Elevation of Privilege</code>&rdquo;.</p>
<h2 id="game-rules">Game Rules</h2>
<p>For this, plan a phase of the 
<a href="https://michee.io/en-us/posts/agile-method-the-ceremony/"><em>sprint</em> ceremony</a> dedicated to it.</p>
<p>The team sits around a table. The diagram of the project section to be analyzed is spread out on the table for everyone to see.</p>
<p>The &ldquo;<em>Elevation of Privilege</em>&rdquo; card game is available below.</p>
<p>Deal all cards to the players. The game starts with the &ldquo;<em>3 of tampering</em>&rdquo;. Play proceeds clockwise.</p>
<p>It is very similar to the rules of Tarot.</p>
<p>Each player continues in the same suit if they have a card in that suit. Otherwise, they play a card from another suit.</p>
<p>Each trick (one round) is won by the player with the highest card in the lead suit,
unless an &ldquo;<em>Elevation of Privilege</em>&rdquo; card is played (in which case the highest of these cards wins).</p>
<p>To play a card, the player must announce it and try to find its corresponding threat on the diagram. The system may be resistant to this threat.
In this case, the threat cannot be found on the diagram.</p>
<p>The player must clearly state the threat. For it to be valid, it must lead to the creation of a story (
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">opening NFR, <em>User Story</em>&hellip;</a>) in the project.</p>
<p>At the end of the trick (when all players have played a card from their hand), all players who successfully identified their threat on the diagram score a point.
If the trick winner also identified their threat, they score an additional point.</p>
<p>The trick winner starts the next trick and chooses the lead suit. Take a few minutes between tricks to review threats.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/elevation-of-privilege/images/elevation-of-privilege-rules.png" class="figure-img img-fluid rounded" alt="It is very similar to the rules of Tarot">
  <figcaption class="figure-caption"><p>Elevation of Privilege Rules</p>
    <small>It is very similar to the rules of Tarot</small>
  </figcaption>
</figure>

<p>&ldquo;<em>Elevation of Privilege</em>&rdquo; cards beat all other cards.
They can only be played when the player has no cards in the lead suit (or if the lead suit itself is &ldquo;<em>Elevation of Privilege</em>&rdquo;).</p>
<p>Aces are cards that allow finding unanticipated threats in the lead suit. The player must explain the threat itself.</p>
<p>When all cards have been played (all tricks completed), the player with the most points wins.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/elevation-of-privilege/images/elevation-of-privilege-rules-partie-2.png" class="figure-img img-fluid rounded" alt="When all cards have been played (all tricks completed), the player with the most points wins">
  <figcaption class="figure-caption"><p>Elevation of Privilege Rules, Part 2</p>
    <small>When all cards have been played (all tricks completed), the player with the most points wins</small>
  </figcaption>
</figure>

<p>Annotate your diagram according to the threats identified.</p>
<p>You can pass a player&rsquo;s hand to another between tricks. This allows specialized players to play cards that previous players did not understand.</p>
<p>Other players, besides the one announcing their card, can challenge it by finding the announced threat in other locations than those identified by the player. They gain an additional point.</p>
<p>Download &ldquo;
<a href="https://michee.io/en-us/posts/elevation-of-privilege/documents/elevation-of-privilege.pdf"><em>Elevation of Privilege</em></a>&rdquo; and its extension &ldquo;
<a href="https://michee.io/en-us/posts/elevation-of-privilege/documents/elevation-of-privacy.pdf"><em>Elevation of Privacy</em></a>&rdquo;,
with the 
<a href="https://michee.io/en-us/posts/elevation-of-privilege/documents/eop-rules.pdf">EoP rules</a>.</p>
<h2 id="sources">Sources</h2>
<ul>
<li>
<a href="https://github.com/adamshostack/eop" target="_blank">EoP</a>, 
<a href="https://creativecommons.org/licenses/by/3.0/us/" target="_blank">Creative Commons Attribution 3 License</a></li>
<li>
<a href="https://blog.logmeininc.com/privacy-by-design-can-be-entertaining/" target="_blank">EoP (Privacy Extension)</a>, 
<a href="https://creativecommons.org/" target="_blank">Creative Commons License</a></li>
<li>
<a href="https://github.com/F-Secure/elevation-of-privacy" target="_blank">EoPrivacy</a>, 
<a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">Creative Commons Attribution 4 License</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Roles in an Agile Team</title>
      <link>https://michee.io/en-us/posts/roles-in-an-agile-team/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/roles-in-an-agile-team/</guid>
      <description>There are two important roles in the Agile method: the Product Owner and the Scrum Master.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<h2 id="the-product-owner">The Product Owner</h2>
<p>The <em>Product Owner</em> is the representative of the clients and their needs. They are responsible for the proper progress of product development and the outcome of the project.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>They do not participate in development and are not part of 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">the Agile team</a> because they must remain neutral with respect to the team spirit that forms.</p>
<p>They are responsible for prioritizing tasks during 
<a href="https://michee.io/en-us/posts/agile-method-the-ceremony/">ceremonies</a> in order to maintain objectives.
They are the main maintainer of the <em>
<a href="https://michee.io/en-us/posts/backlog-and-scrum-board/">Backlog</a></em> and the <em>
<a href="https://michee.io/en-us/posts/the-lean-canvas/">Lean Canvas</a></em>.</p>
<p>They are often assisted by the <em>Scrum Master</em>.</p>
<p>They have the ultimate decision-making power and are the only one who can move a 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">story</a> to DONE (with the possible exception of specific bots for repetitive 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">NFRs</a> such as updates).</p>
<p>They are the interface between the team and other project stakeholders, and of course, the clients.</p>
<p><em>Product Owners</em> can be organized hierarchically, with a <em>Product Manager</em> overseeing all the Agile teams of a project and the <em>
<a href="https://michee.io/en-us/posts/backlog-and-scrum-board/">global Backlog</a></em>.
In this case, the <em>Product Owner</em> of a team manages only the stories of the <em>
<a href="https://michee.io/en-us/posts/backlog-and-scrum-board/">Backlog</a></em> with the labels assigned to that team.</p>
<h2 id="the-scrum-master">The Scrum Master</h2>
<p>The <em>Scrum Master</em> is responsible for the well-being of the team.
They ensure that the team consistently follows the Agile “<em>Scrum</em>” method and its best practices.</p>
<p>At first, they lead the team’s daily “<em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Scrum</a></em>” meetings.</p>
<p>They serve the team, making sure it feels good and remains effective.
They work to remove obstacles the team encounters.</p>
<p>They ensure that the team becomes more autonomous.
They are the one who introduces new practices when necessary, in agreement with the <em>Product Owner</em>.</p>
<p>They are by no means a kind of team leader.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/roles-in-an-agile-team/images/product-owner-scrum-master.png" class="figure-img img-fluid rounded" alt="There are two important roles in the Agile method: the Product Owner and the Scrum Master">
  <figcaption class="figure-caption"><p>Product Owner &amp; Scrum Master</p>
    <small>There are two important roles in the Agile method: the Product Owner and the Scrum Master</small>
  </figcaption>
</figure>

<h2 id="types-of-agile-teams">Types of Agile Teams</h2>
<p>An Agile team is made up of at most 7 people. Beyond that, the team’s efficiency quickly decreases.</p>
<p>The environment of these teams will be explained in more detail in a future article. But here’s a preview.</p>
<h3 id="marketops">MarketOps</h3>
<p>The operational marketing team has the ability to determine short-term marketing strategies and implement them quickly.</p>
<h3 id="devsecops">DevSecOps</h3>
<p>Inherited from <em>DevOps</em>. This team develops, deploys (operations), and secures its developments.</p>
<p>It may sometimes be split into two teams, with one team dedicated to testing in order to reduce human biases caused by teamwork.</p>
<h3 id="blue-team--red-team">Blue Team / Red Team</h3>
<p>For projects with greater resources, two teams can be dedicated to project security (IT or otherwise).</p>
<p>The <em>Red Team</em> represents aggression and attack. Its role is to think like a potential attacker and find every flaw in the project to compromise it.</p>
<p>The <em>Blue Team</em> represents defense. Its role is to defend the project against attacks and set up the necessary tools to achieve this.</p>
<p>This approach makes it possible to prevent rather than cure.</p>
<p>The <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprints</a></em> of these teams can be organized around objectives:</p>
<ul>
<li>The CTF (<em>Capture the Flag</em>) consists of retrieving information within the system for the <em>Red Team</em> and preventing it for the <em>Blue Team</em>;</li>
<li>The destruction arena consists of destroying portions of the system for the <em>Red Team</em> and preventing it for the <em>Blue Team</em>;</li>
<li>“<em>You shall not pass!</em>” consists of closing system access for the <em>Red Team</em> and keeping them open for the <em>Blue Team</em> (useful for IT DDOS attacks);</li>
</ul>
<h2 id="sources">Sources</h2>
<ul>
<li>
<a href="https://www.scaledagileframework.com/product-owner/" target="_blank">Scaled Agile Framework</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>The lean canvas</title>
      <link>https://michee.io/en-us/posts/the-lean-canvas/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-lean-canvas/</guid>
      <description>The Lean Canvas provides an overall and concise view of an agile project.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>The <em>Lean Canvas</em> allows you to quickly describe a project without overlooking important elements.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>It is used by startups to launch their projects but can also be applied in agile methodology to maintain project coherence among multiple stakeholders.</p>
<p>Indeed, a good <em>Lean Canvas</em> allows the agile team or teams to prioritize or rewrite stories,
in agreement with the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em>, so as not to deviate from short- or long-term objectives desired by clients.</p>
<h2 id="overview-of-a-lean-canvas">Overview of a Lean Canvas</h2>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/the-lean-canvas/images/the-lean-canvas-schema.png" class="figure-img img-fluid rounded" alt="The Lean Canvas allows you to quickly describe a project without overlooking important elements">
  <figcaption class="figure-caption"><p>Lean Canvas (Diagram)</p>
    <small>The Lean Canvas allows you to quickly describe a project without overlooking important elements</small>
  </figcaption>
</figure>

<ul>
<li>The &ldquo;Problem&rdquo; box allows defining the project&rsquo;s objective.
It helps keep the direction when designing <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em>.</li>
<li>The &ldquo;Solution&rdquo; box allows defining the minimum viable objective to achieve before production.
Development <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em> should be prioritized accordingly.</li>
<li>The &ldquo;Key Metrics&rdquo; box allows defining the priority 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">NFRs</a>.</li>
<li>The &ldquo;Unique Value Proposition&rdquo; box allows defining development <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em>
and priority 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">NFRs</a> from the start of production.</li>
<li>The &ldquo;Unfair Advantage&rdquo; box allows defining priority 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Spikes</a> from the start of production.</li>
<li>The &ldquo;Channels&rdquo; box allows defining marketing <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em> to prioritize.</li>
<li>The &ldquo;Customer Segment&rdquo; box allows defining <em>
<a href="https://michee.io/en-us/posts/the-user-persona/">user personas</a></em> (including <em>buyers personas</em> if the project involves marketing).</li>
<li>The &ldquo;Cost Structure&rdquo; and &ldquo;Revenue Streams&rdquo; boxes can be the subject of 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">NFRs</a>.
Their analysis helps prioritize certain <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a></em>
(the stories that cost the most in the <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">sprints</a></em> where revenue streams perform best, and vice versa).</li>
</ul>
<p>From a story perspective, the <em>Lean Canvas</em> is the visual representation of the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Saga</a>.</p>
<p>Download our 
<a href="https://michee.io/en-us/posts/the-lean-canvas/documents/lean-canvas.odg">Lean Canvas template</a> (odg format, LibreOffice and OpenOffice).</p>
<h2 id="sources">Sources</h2>
<ul>
<li>
<a href="https://showcase.dropbox.com/s/ASH-MAURYA-waF9igFnnu9LZarB9u5e1" target="_blank">The Inventor of Lean Canvas</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>The Sprint and the Scrum</title>
      <link>https://michee.io/en-us/posts/the-sprint-and-the-scrum/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-sprint-and-the-scrum/</guid>
      <description>How is agile development organized over time? With the Sprint and Scrum.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>The unit of time in the agile <em>Scrum</em> method is the <em>Sprint</em>. It is a repeating period that can vary depending on the team, from 2 weeks to 1 month.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>It is during this period that the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> are completed.</p>
<p>It is framed by a 
<a href="https://michee.io/en-us/posts/agile-method-the-ceremony/">kick-off ceremony</a> that prepares the work and a closing ceremony that reviews the work done.</p>
<p>Each workday morning during this period, a daily meeting (or <em>Scrum</em>) takes place to keep the <em>Sprint</em> goals on track.</p>
<p>The goals of a <em>Sprint</em> are simple: move all the 
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">stories</a> planned for it from TODO to DONE.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/the-sprint-and-the-scrum/images/the-sprint-and-the-scrum-schema.png" class="figure-img img-fluid rounded" alt="The goals of a Sprint are simple: move all planned stories from TODO to DONE">
  <figcaption class="figure-caption"><p>The Sprint and Scrum (Diagram)</p>
    <small>The goals of a Sprint are simple: move all planned stories from TODO to DONE</small>
  </figcaption>
</figure>

<h2 id="special-case-sprint-0">Special Case: Sprint 0</h2>
<p><em>Sprint</em> 0 is the very first <em>Sprint</em>, coming immediately after the <em>
<a href="https://michee.io/en-us/posts/discovery-framing/">Discovery &amp; Framing</a></em> phase.
This <em>Sprint</em> mainly serves as a warm-up phase for the team.</p>
<p>The team gets familiar with the work environment, the flow of daily meetings, all project stakeholders, etc.</p>
<p>Contrary to what some sources suggest, I do not recommend describing the product and its target in this <em>Sprint</em>; the <em>
<a href="https://michee.io/en-us/posts/discovery-framing/">Discovery &amp; Framing</a></em> phase is more suitable for that.</p>
<p>This <em>Sprint</em> should resemble a normal <em>Sprint</em> as much as possible, while keeping in mind that the team is still discovering the subject.</p>
<p>Since this <em>Sprint</em> is not effective for actual project development, it is counted separately.</p>
<h2 id="the-scrum-daily-stand-up">The Scrum (Daily Stand-up)</h2>
<p>The <em>Scrum</em> (French: “mêlée”) is the daily meeting held every morning. It gives its name to this agile method.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/the-sprint-and-the-scrum/images/the-scrum-schema.png" class="figure-img img-fluid rounded" alt="This meeting should be held standing (also called Stand-up meeting)">
  <figcaption class="figure-caption"><p>The Scrum (Diagram)</p>
    <small>This meeting should be held standing (also called Stand-up meeting)</small>
  </figcaption>
</figure>

<p>This meeting should be held standing (also called a <em>Stand-up meeting</em>).
It concerns only the development team and is facilitated (but not <em>led</em>) by the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em>.</p>
<p>Each team member should have the opportunity to speak.
They share what they did yesterday and what they plan to do today.
If obstacles arise, the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em> can decide either to resolve them immediately (if quick to fix) or schedule a discussion for another time.</p>
<p>The meeting should not exceed 15 minutes. It should occur at the same time and place every day (usually with a <em>Scrum Board</em> visible).</p>
<p>This meeting is also a social gathering for the team members.
Gradually, the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em> should step back to let the team take ownership of the meeting, reinforcing team spirit.</p>
<p>The idea is for team members to have a moment to help each other and maintain a global view of the project.
It is not a <em>reporting session</em> (that can be automated and addressed one-on-one with the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a></em> if needed).</p>
<p>The three questions this meeting answers are:</p>
<ul>
<li>What was done yesterday?</li>
<li>What do you plan to do today?</li>
<li>What obstacles did you encounter?</li>
</ul>
<h2 id="the-scrum-of-scrums">The Scrum of Scrums</h2>
<p>If a project requires multiple agile teams,
a scrum of representatives from each team (not the *
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Scrum Master</a>*s) can be held.
This scrum of representatives takes place after the team-level scrum.</p>]]></content:encoded>
    </item>
    <item>
      <title>The User persona</title>
      <link>https://michee.io/en-us/posts/the-user-persona/</link>
      <pubDate>Mon, 08 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-user-persona/</guid>
      <description>The User Persona is a method that helps describe the user as accurately as possible in agile methodology.</description>
      <content:encoded><![CDATA[<p>Agile Method: 
<a href="https://michee.io/en-us/posts/agile-method-general-overview/">General Overview</a></p>
<p>Sometimes it is difficult to know who will actually use the project’s outcome.
This is where the <em>user persona</em> comes in.
They are the concrete representation of the project&rsquo;s target users.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="the-persona-sheet">The Persona Sheet</h2>
<p>A <em>user persona</em> resembles a role-playing game character sheet (for those familiar with RPGs).
This sheet provides an at-a-glance view of all the characteristics of a person.</p>
<p>Through this sheet, we aim to understand their interests, history, culture&hellip;
We create a fully imagined physical person.</p>
<p>Workshops in <em>
<a href="https://michee.io/en-us/posts/discovery-framing/">Discovery &amp; Framing</a></em> dedicated to the <em>user persona</em> bring this person to life,
giving them substance. Feel free to use role-playing for this.</p>
<p>However, it is crucial not to include the person’s potential relationship with the project outcome,
as this could distort their characteristics.</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/the-user-persona/images/the-user-persona-schema.png" class="figure-img img-fluid rounded" alt="A user persona resembles a role-playing game character sheet (for those familiar with RPGs)">
  <figcaption class="figure-caption"><p>The User Persona (Diagram)</p>
    <small>A user persona resembles a role-playing game character sheet (for those familiar with RPGs)</small>
  </figcaption>
</figure>

<h2 id="in-agile-marketing">In Agile Marketing</h2>
<p>There is no need to introduce this concept in marketing because it is well known. This sheet helps define acquisition channels and ways to reach the target.</p>
<p>It is to this persona that the <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Stories</a></em>
(or <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em>) are addressed.
It is this target that performs the actions described within these <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">Stories</a></em>.</p>
<p>However, do not hesitate to modify or refine it during <em>
<a href="https://michee.io/en-us/posts/the-sprint-and-the-scrum/">Sprints</a></em>.</p>
<p>It may even need to be completely replaced if the project target changes.</p>
<h2 id="in-agile-development">In Agile Development</h2>
<p>This sheet is useful for guiding usability and prioritizing the features requested by the client.</p>
<p>In alignment with the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em>,
developers have a reference for discussion to best describe the <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em>.</p>
<p>Here too, this persona performs the actions described in the <em>
<a href="https://michee.io/en-us/posts/agile-method-the-stories/">User Stories</a></em>.</p>
<p>It is therefore useful to have multiple <em>user personas</em> depending on the project user roles.
One <em>user persona</em> may represent an administrator, another a regular user.</p>
<p>In pure development projects (where the client handles marketing),
<em>user personas</em> are defined in <em>
<a href="https://michee.io/en-us/posts/discovery-framing/">Discovery &amp; Framing</a></em> and validated by the client.</p>
<p>In projects including marketing, <em>user personas</em> can be modified by the marketing teams with validation from the development teams.
In this case, the <em>Buyer persona</em> must also be included (the person who purchases the project outcome but does not necessarily use it).</p>
<p>It is even possible for a marketing team representative to become the <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em>
(or a deputy <em>
<a href="https://michee.io/en-us/posts/roles-in-an-agile-team/">Product Owner</a></em>) for the development team, since they are assumed to have the best understanding of the <em>user personas</em>.</p>
<p>Download our 
<a href="https://michee.io/en-us/posts/the-user-persona/documents/user-persona.odg">User Persona Template</a> (odg format, LibreOffice and OpenOffice).</p>
<h2 id="sources">Sources</h2>
<ul>
<li>
<a href="https://insights.ricoh.co.uk/simplifying-technology/it-end-user-personas" target="_blank">Ricoh</a></li>
<li>
<a href="https://www.justinmind.com/blog/user-persona-templates/" target="_blank">Just in Mind</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>The one-time pad</title>
      <link>https://michee.io/en-us/posts/the-one-time-pad/</link>
      <pubDate>Wed, 03 Dec 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-one-time-pad/</guid>
      <description>This encryption is theoretically impossible to break. However, it is essentially theoretical because it remains very complex to implement.</description>
      <content:encoded><![CDATA[<h2 id="a-bit-of-history">A bit of history</h2>
<p>The one-time pad is an encryption method invented by Gilbert Vernam, an American engineer at AT&amp;T Bell Labs, in 1917.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>It is based on a much older encryption technique called the &ldquo;
<a href="https://michee.io/en-us/posts/the-vigenere-cipher/">Vigenère cipher</a>&rdquo;.</p>
<p>The one-time pad was further perfected by the American general Joseph Mauborgne, who introduced the randomness of the encryption key.</p>
<p>It consists of encrypting a message with a key by adding the key to the message, element by element.
The key must be used only once (hence the &ldquo;one-time&rdquo; or disposable).
To decrypt, you subtract the key from the message.</p>
<p>Okay, history is nice but in practice, how does it work?</p>
<h2 id="how-it-works">How it works</h2>
<p>To understand the one-time pad, you first need to master (or at least understand) 
<a href="https://michee.io/en-us/posts/the-congruence-the-modulo/">congruence</a> (or modulo arithmetic).</p>
<h3 id="the-basics">The basics</h3>
<p>We&rsquo;ll start by using non-random texts for the keys. Note, this is just to start slowly because here security is zero.</p>
<p>We&rsquo;ll take a Bigflo&amp;Oli (french rappers) text as the message to encrypt and a Georges Brassens (french singer) text as the key.</p>
<p>The message is from &ldquo;Alors alors&rdquo;:</p>
<p>&ldquo;Alors alors, On devait faire le tour de la Terre&rdquo;</p>
<p>The key is from &ldquo;Bancs publics&rdquo;:</p>
<p>&ldquo;Les gens qui voient de travers pensent que les bancs verts&rdquo;</p>
<p>Got modulo in mind? Good, let&rsquo;s start by assigning a number to each letter of our alphabet:</p>
<pre><code>A=0, B=1, C=2, D=3, E=4, F=5, G=6, H=7, I=8, J=9, K=10, L=11, M=12, N=13, O=14, P=15, Q=16, R=17, S=18, T=19, U=20, V=21, W=22, X=23, Y=24, Z=25
</code></pre>
<p>So, for our 26-letter alphabet, we have numbers from 0 to 25.</p>
<h3 id="encryption">Encryption</h3>
<p>To encrypt, it&rsquo;s simple, we add letters face to face.
&ldquo;Add letters, are you crazy?&rdquo; you might say, but that&rsquo;s why we&rsquo;ve given them numerical equivalents, follow along.
Since we haven&rsquo;t assigned values to commas, we&rsquo;ll remove them.</p>
<p>Let&rsquo;s go:</p>
<pre><code>&quot;Alors alors On devait faire le tour de la Terre&quot;

+

&quot;Les gens qui voient de travers pensent que les bancs verts&quot;
</code></pre>
<p>The &ldquo;A&rdquo; of &ldquo;Alors&rdquo; + the &ldquo;L&rdquo; of &ldquo;Les&rdquo; = A + L = 0 + 11 = 11 = L</p>
<p>Then &ldquo;l&rdquo; + &ldquo;e&rdquo; = l + e = 11 + 4 = 15 = p</p>
<p>So, little by little:</p>
<pre><code>&quot;Alors alors On devait faire le tour de la Terre&quot;

+ + +

&quot;Les gens qui voient de travers pensent que les bancs verts&quot;

= = =

0 11 14

+ + +

11 4 18

= = =

11 15 32

= = =

L p ?
</code></pre>
<p>Indeed, for adding &ldquo;o&rdquo; and &ldquo;s&rdquo;, we get 14 + 18 = 32 and here is the problem, we don&rsquo;t have a letter with value 32.</p>
<p>But remember, congruence (modulo, all that).</p>
<p>Since we have only 26 letters, we&rsquo;ll use modulo 26 to stay in range.</p>
<p>Modulo 26 of 32 is:</p>
<p>$$
32 \pmod{26} \equiv 32 -26 \pmod{26} \equiv 6 \pmod{26}
$$</p>
<p>And 6 corresponds to letter G.</p>
<p>So, we can finish our calculation:</p>
<pre><code>&quot;Alors alors On devait faire le tour de la Terre&quot;

+ + + ...

&quot;Les gens qui voient de travers pensent que les bancs verts&quot;

= = =

0 11 14

+ + +

11 4 18

= = =

11 15 32 mod(26)≡ 6 mod(26)

= = =

L p g …
</code></pre>
<p>In the end:</p>
<pre><code>&quot;Alors alors On devait faire le tour de la Terre&quot;

+

&quot;Les gens qui voient de travers pensent que les bancs verts&quot;

=

&quot;Lpgxw ndela Jb liitlx yrimi cw ishj hr eq Nicvw&quot;
</code></pre>
<p>We have our encrypted message.</p>
<h3 id="decryption">Decryption</h3>
<p>To decrypt, we do the opposite: subtract the key from the encrypted message.</p>
<p>We have encrypted message &ldquo;Lpgxw ndela Jb liitlx yrimi cw ishj hr eq Nicvw&rdquo; and the key &ldquo;Les gens qui voient de travers pensent que les bancs verts&rdquo;.</p>
<p>So:</p>
<pre><code>&quot;Lpgxw ndela Jb liitlx yrimi cw ishj hr eq Nicvw&quot;

- - -

&quot;Les gens qui voient de travers pensent que les bancs verts&quot;

= = =

11 15 6

- - -

11 4 18

= = =

0 11 -12

= = =

A l ?
</code></pre>
<p>Again, same problem as encryption, we have -12 with no corresponding letter.</p>
<p>We apply modulo 26:</p>
<p>$$
-12 \pmod{26} \equiv -12 + 26 \pmod{26} \equiv 14 \pmod{26} \equiv o
$$</p>
<p>We continue the calculation and recover:</p>
<pre><code>&quot;Lpgxw ndela Jb liitlx yrimi cw ishj hr eq Nicvw&quot;

- - - ...

&quot;Les gens qui voient de travers pensent que les bancs verts&quot;

=

&quot;Alors alors On devait faire le tour de la Terre&quot;
</code></pre>
<h3 id="mauborgne-in-da-house">Mauborgne in da house</h3>
<p>Okay, that&rsquo;s nice but not very secure. To improve security, let&rsquo;s listen to General Mauborgne and use a random key (or at least a more random one).</p>
<p>After putting a pseudo-random generator (yes, I know, an incomprehensible term, we&rsquo;ll come back to it in a future article) on my computer,
rolling my head on the keyboard, and letting the cat walk on it for entropy (yes, another incomprehensible term), I got this key:</p>
<pre><code>&quot;snchfzrhqjlnveivpyonrkudrpqtpxptfwrildof&quot;
</code></pre>
<p>We&rsquo;ll encrypt the following message, again by Bigflo&amp;Oli, from &ldquo;Dommage&rdquo;:</p>
<p>&ldquo;Il croisait cette même fille, avec son doux parfum&rdquo;</p>
<h3 id="encryption-1">Encryption</h3>
<p>Here we go again:</p>
<pre><code>&quot;Il croisait cette même fille, avec son doux parfum&quot;

+ +

&quot;snchfzrhqjlnveivpyonrkudrpqtpxptfwrildof&quot;

= =

8 11

+ +

18 13

≡ =

0 mod(26) 24

=

a y …
</code></pre>
<p>We get the encrypted message:</p>
<pre><code>&quot;Il croisait cette même fille, avec son doux parfum&quot;

+

&quot;snchfzrhqjlnveivpyonrkudrpqtpxptfwrildof&quot;

=

&quot;ayeythjhycnroxmhtksszvfhrkuvhlcwtqoxlutze&quot;
</code></pre>
<h3 id="decryption-1">Decryption</h3>
<p>I think by now you get it. One quick example.</p>
<p>Still with modulo(26), decrypt this message:</p>
<pre><code>&quot;irszlg k wiu ladw&quot;
</code></pre>
<p>with the key:</p>
<pre><code>&quot;xjgzpyisqbjmplcxhwfpijqrstghighnhylshqza&quot;
</code></pre>
<p>And tweet or post the result.</p>
<h3 id="the-che-level">The Che level</h3>
<p>So far we&rsquo;ve been cute, now we tackle the hard stuff.</p>
<p>Che Guevara and Fidel Castro communicated with a cryptographic technique based on the one-time pad.
However, there was an extra complexity.</p>
<p>They didn&rsquo;t use a sequence of numbers like we did, but assigned arbitrary numbers to letters of the alphabet.</p>
<p>Here is their substitution:</p>
<pre><code>A=6, B=38, C=32, D=4, E=8, F=30, G=36, H=34, I=39, J=31, K=78, L=72, M=70, N=76, O=9, P=79, Q=71, R=58, S=2, T=0, U=52, V=50, W=56, X=54, Y=1, Z=59
</code></pre>
<p>You might ask &ldquo;how do you do congruence with this?&rdquo;, hold on, it’s coming.</p>
<p>Actually, they transmitted numbers, not letters, and the key was itself composed of numbers. They used the most known modulo (the one we unknowingly use), modulo 10.</p>
<p>So, how did they do it? Let’s take an example.</p>
<h3 id="encryption-2">Encryption</h3>
<p>We want to encrypt the message:</p>
<p>&ldquo;J’aime pas les framboises&rdquo; (&ldquo;I don’t like raspberries&rdquo; in french, just an example, I do like raspberries)</p>
<p>We replace the letters with their numbers:</p>
<p>&ldquo;J A I M E P A S L E S F R A M B O I S E S&rdquo; becomes &ldquo;31 6 39 70 8 79 6 2 72 8 2 30 58 6 70 38 9 39 2 8 2&rdquo;</p>
<p>We encrypt this message with the key:</p>
<pre><code>&quot;4317892093088287991744997181628757157172&quot;
</code></pre>
<p>We add the numbers face to face and apply modulo 10. To ease things, they first grouped digits in packets of 5.</p>
<p>So, the message:</p>
<pre><code>&quot;31 6 39 70 8 79 6 2 72 8 2 30 58 6 70 38 9 39 2 8 2&quot;
</code></pre>
<p>becomes:</p>
<pre><code>&quot;31639 70879 62728 23058 67038 93928 2&quot;
</code></pre>
<p>We add with modulo 10:</p>
<pre><code>&quot;31639 70879 62728 23058 67038 93928 2&quot;

+

&quot;43178 92093 08828 79917 44997 18162 87571 57172&quot;

=

747 (7+3 ≡ 10 mod(10) ≡ 0) …

=

74707 62862 60546 92965 01925 01080 0
</code></pre>
<p>The encrypted message is therefore:</p>
<pre><code>&quot;74707 62862 60546 92965 01925 01080 0&quot;
</code></pre>
<h3 id="decryption-2">Decryption</h3>
<p>We subtract the key from the message using modulo 10:</p>
<pre><code>&quot;74707 62862 60546 92965 01925 01080 0&quot;

-

&quot;43178 92093 08828 79917 44997 18162 87571 57172&quot;

=

&quot;31639 70879 62728 23058 67038 93928 2&quot;
</code></pre>
<p>Then, we convert the numbers into their respective letters.
And now you’re thinking, “But how can they tell the difference between the letter with value 2 and the letter with value 23?
How can they know if it’s a one-digit or two-digit number?”</p>
<p>Very simple, the digits used for one-digit numbers are never used to start a two-digit number.</p>
<p>In fact, if you encounter 3, 7, or 5, you know it’s a two-digit number and so you must group the following digit with it.</p>
<p>In our case, we start with a 3, so we know it’s a two-digit number, we join the 1 to the 3.</p>
<pre><code>&quot;31 639 70879 62728 23058 67038  93928 2&quot;
</code></pre>
<p>Next, the 6 is not in (3,7,5), so it’s a one-digit number:</p>
<pre><code>&quot;31 6 39 70879 62728 23058 67038  93928 2&quot;
</code></pre>
<p>And so on:</p>
<pre><code>&quot;31 6 39 70 8 79 6 2 72 8 2 30 58 6 70 38 9 39 2 8 2&quot;
</code></pre>
<p>Finally, we replace the numbers with their corresponding letters:</p>
<pre><code>&quot;J A I M E P A S L E S F R A M B O I S E S&quot;
</code></pre>
<p>There you go!</p>
<h2 id="the-perfection-of-the-cipher">The Perfection of the Cipher</h2>
<p>Claude Shannon (more name-dropping, but this one is the flagship of cryptographers) mathematically proved
that the one-time pad is considered cryptographically secure, or unconditionally secure, during World War II.
That is to say, the system cannot be cracked even if the adversary has unlimited resources or unlimited time, as long as they do not know the secret key.</p>
<p>Claude Shannon proved that the one-time pad is “perfectly secret,” meaning that if you have a ciphertext encrypted with the one-time pad,
there is absolutely no way to guess anything about the original plaintext.</p>
<p>This means it is also resistant to brute-force attacks.
If you try every key in the universe, you will get every possible message in the universe, so you have no way to know which one is correct.</p>
<p>I won’t redo the mathematical proofs here. This article is meant for broad, easy-to-understand dissemination.</p>
<p>But to achieve this perfection, there are some challenges.</p>
<h2 id="the-difficulties">The Difficulties</h2>
<p>The difficulties to overcome to achieve a perfect one-time pad are as follows:</p>
<h3 id="key-size-and-quantity">Key Size and Quantity</h3>
<p>For every exchange, you need a new key. For every exchange, that is, each person you communicate with and each message you send to them.</p>
<p>So, if you exchange 2 messages with 2 people, that makes 4 keys. 3 messages with 3 people, 9 keys&hellip;</p>
<p>Moreover, the key must be longer than the message.</p>
<p>Because if it is shorter and repeated to complete the encryption,
you increase the probability of certain letters appearing and you can see patterns emerge giving clues about the message.
This problem is similar to the need for randomness in creating keys.</p>
<p>This poses problems for securely storing keys, as the cipher collapses if the key is recovered by the adversary.</p>
<h3 id="the-randomness-of-the-keys">The Randomness of the Keys</h3>
<p>In French, the letter &ldquo;e&rdquo; is the most commonly used letter, then &ldquo;a&rdquo;, then &ldquo;s&rdquo;…</p>
<p>And patterns like “le”, “les” are frequent. The key, when repeated, increases the chances of encrypting the same patterns in the same way.</p>
<p>The attacker can spot these patterns and deduce when the key is repeated.</p>
<p>Gradually, they can reconstruct the key or even manage without it.</p>
<p>An example:</p>
<p>Imagine the key “Wesh”, the attacker doesn’t know it but has found its length is 4 by analyzing the frequencies of recurring patterns.</p>
<p>They can cut the ciphertext into groups of 4 letters: “Uedl lsll ysfk wqfl myaz kvlp newu zsmj a” and subtract the groups from each other:</p>
<pre><code>Uedl - lsll = X? + “Wesh” - (Y? + “Wesh”) = X? - Y? + “Wesh” - “Wesh”

= X? - Y?
</code></pre>
<p>The key disappears and we have two texts which are no longer random subtracted from each other.
We analyze the letter frequency and form hypotheses.
The letters resulting from the subtraction, the most frequent ones, are more likely to correspond to an “e” in one of their base letters, etc.</p>
<p>Step by step, by multiplying hypotheses, possibilities reduce and one can find the key or decrypt messages without it.</p>
<p>In conclusion, if you do a frequency analysis running your computer for three days, you will get the following message:</p>
<p>“Y&rsquo;a le pote condamné qui sortira en douce,” always Bigflo &amp; Oli, excerpt from “Comme d’hab”</p>
<p>This seems obscure, incomprehensible. Don’t worry, a future article will clarify all this with examples.</p>
<p>So, to ensure every letter has the same probability of appearing, you need randomly generated keys.
But that is very hard to do. We can make pseudo-randomness but as its name indicates it’s not truly random,
the probabilities of letter appearances are not exactly equal.</p>
<h3 id="key-transmission">Key Transmission</h3>
<p>Key transmission is not a problem for very small keys (an article will soon explain how).</p>
<p>But it becomes very complicated once keys must exceed a certain size
(the current minimum size is 4096 bits or, in some crazy cases, 8192 bits, that is 1024 bytes, 1 KB for IT folks).</p>
<p>So, often, keys are exchanged physically beforehand.
This is not practical and becomes very complicated when sending many messages to many interlocutors.</p>
<h3 id="uniqueness-of-use">Uniqueness of Use</h3>
<p>We return to the same problem as with key size and randomness.</p>
<p>If you reuse a key, you lose the randomness and the ciphertext becomes again vulnerable to frequency analysis.</p>
<p>The problem is even more serious because uniqueness of use implies destroying the key after use
and there is no easy way to ensure that your correspondents do not keep the keys
in a corner at risk of being stolen later (in 5 years, 10 years…) or reuse them for other messages on their side.</p>
<h3 id="message-poisoning">Message Poisoning</h3>
<p>The last possible problem is key poisoning but this can be easily fixed (at least temporarily) in IT.</p>
<p>Since the one-time pad is immune to brute force (all keys in the universe produce all messages in the universe),
an attacker can mess with the ciphertext to give it a different meaning.</p>
<p>They can also modify the key without necessarily knowing it and thus alter the plaintext.</p>
<p>Example:</p>
<p>Let’s take our famous message again:</p>
<pre><code>“J’aime pas les framboises”
</code></pre>
<p>which we encrypt with the key:</p>
<pre><code>“nzhtjplgpggsefirksxohsbyhkazsb”
</code></pre>
<p>using modulo 26 (thus without the apostrophe), we get:</p>
<pre><code>“N zrry rrg yef eytvqzohky”
</code></pre>
<p>The attacker only knows this secret message but can modify the encryption key. They replace the key by:</p>
<pre><code>“ezjfuqjcltbmtcvihgdtgefirksxohsbyhkazsb”
</code></pre>
<p>And that gives the following plaintext:</p>
<pre><code>“Jaimebienlesfraisiers” (&quot;I like strawberry bushes&quot; in french)
</code></pre>
<p>So, not at all the original message.</p>
<p>To prevent this, in IT, you can sign and hash the message and keys
so a user can verify that the message they receive was indeed created by the correct key and that the key they use is still the correct one.</p>
<p>We will come back to how signing and hashing work in future articles.</p>
<p>I think we have already well exceeded 2000 words. Let’s stop here.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Vigenère cipher</title>
      <link>https://michee.io/en-us/posts/the-vigenere-cipher/</link>
      <pubDate>Wed, 26 Nov 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-vigenere-cipher/</guid>
      <description>The Vigenère cipher is an evolution of the Caesar cipher that introduces the concept of a key.</description>
      <content:encoded><![CDATA[<h2 id="a-bit-of-history">A Bit of History</h2>
<p>Contrary to what its name suggests, the Vigenère cipher seems to have been invented by Giovan Battista Bellaso, an Italian cryptographer from the 16th century.</p>
<p>Nevertheless, it is the Vigenère cipher that endured, not Bellaso’s.</p>
<p>Blaise de Vigenère introduced his cipher 20 years after Bellaso, with some improvements.</p>
<p>This encryption method began to be called the Vigenère cipher from the 19th century onwards, without regard to Bellaso. Moreover, Bellaso was quickly forgotten in favor of Porta.</p>
<p>Lots of names. Ah, history!</p>
<p>Of course, this cipher is not secure and was broken as early as the 19th century.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="the-key-instead-of-the-shift">The Key Instead of the Shift</h2>
<p>The Vigenère cipher introduced a major innovation compared to the 
<a href="https://michee.io/en-us/posts/the-caesar-cipher/">Caesar cipher</a>: the concept of a key.</p>
<p>This difference classifies this cipher as polyalphabetic rather than monoalphabetic.
It is no longer &ldquo;one plaintext letter gives one and only one ciphertext letter,&rdquo; but a plaintext letter
can produce two different ciphertext letters, and a ciphertext letter can come from two different plaintext letters.</p>
<p>Therefore, multiple substitution alphabets are used (different letter shifts within the same message), unlike the Caesar cipher. Hence the term &ldquo;polyalphabetic.&rdquo;</p>
<p>The substitution rules (how you switch from one alphabet to another) are given by the letters of the key and a substitution table.</p>
<p>Don’t quite get it? We will illustrate this with examples in the following chapters, no worries.</p>
<p>Also, another article will cover the classification of ciphers.</p>
<h2 id="the-cipher-itself">The Cipher Itself</h2>
<p>Let’s get to the heart of the matter. There are two ways to represent the classic Vigenère cipher (with variants being another story).</p>
<h3 id="table-representation">Table Representation</h3>
<p>For the table representation, we need a table (yes, really), or rather a substitution matrix. Here it is:</p>

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/the-vigenere-cipher/images/vigenere-table.png" class="figure-img img-fluid rounded" alt="Columns show the plaintext message, rows show the key">
  <figcaption class="figure-caption"><p>Vigenère Table</p>
    <small>Columns show the plaintext message, rows show the key</small>
  </figcaption>
</figure>

<p>It may look dense but it’s not so complicated.
If you look at the rows, you see the Latin alphabet shifted by one letter per row.
Similarly for the columns.</p>
<p>The cipher works by taking the letter at the intersection of the plaintext letter (columns) and the key letter (rows).
That intersection letter is the ciphertext letter.</p>
<p>Example:</p>
<h4 id="encryption">Encryption</h4>
<p>Take the message: &ldquo;J&rsquo;ai plaqué mon chêne&rdquo; (excerpt from &ldquo;Auprès de mon arbre&rdquo; by Georges Brassens)</p>
<p>And the key: &ldquo;Una mattina&rdquo; (excerpt from &ldquo;Bella Ciao&rdquo;)</p>
<p>Look at the intersection of each letter:</p>
<p>Column &ldquo;J&rdquo; and row &ldquo;U&rdquo; give &ldquo;D&rdquo;,
column &ldquo;a&rdquo; (ignoring the apostrophe for now) and row &ldquo;n&rdquo; give &ldquo;n&rdquo;,
column &ldquo;i&rdquo; and row &ldquo;a&rdquo; give &ldquo;i&rdquo;,
etc.</p>
<p>If the message is longer than the key, repeat the key. Consider &ldquo;ê&rdquo; and &ldquo;é&rdquo; as &ldquo;e&rdquo;.</p>
<p>We get:
&ldquo;D ni bltjcr mia ctegx&rdquo;</p>
<h4 id="decryption">Decryption</h4>
<p>For decryption, for each row corresponding to the key letter, find where the ciphertext letter is located and take the letter at the top of that column, which is the plaintext letter.</p>
<p>So, taking the key: &ldquo;Una mattina&rdquo;
And the ciphertext: &ldquo;D ni bltjcr mia ctegx&rdquo;</p>
<p>In row &ldquo;U&rdquo;, letter &ldquo;D&rdquo; is at the 10th position, so column &ldquo;J&rdquo;,
in row &ldquo;n&rdquo;, letter &ldquo;n&rdquo; is at the 1st position, column &ldquo;a&rdquo;,
etc.</p>
<p>We recover:
&ldquo;J ai plaque mon chene&rdquo;</p>
<h3 id="congruence-representation">Congruence Representation</h3>
<p>The second representation is mathematical: congruence. If you don’t know this word, check 
<a href="https://michee.io/en-us/posts/the-congruence-the-modulo/">this article</a>.</p>
<p>To use congruence, substitute letters with numbers using the rule:</p>
<pre><code>A=0, B=1, C=2, D=3, E=4, F=5, G=6, H=7, I=8, J=9, K=10, L=11, M=12, N=13, O=14, P=15, Q=16, R=17, S=18, T=19, U=20, V=21, W=22, X=23, Y=24, Z=25
</code></pre>
<p>To encrypt, add the key to the message. To decrypt, subtract the key from the message.</p>
<p>Example:</p>
<h4 id="encryption-1">Encryption</h4>
<p>Take the message: &ldquo;J’ai plaqué mon chêne&rdquo;
And the key: &ldquo;Una mattina&rdquo;</p>
<p>Align the message and key (removing apostrophes and accents) and repeat the key to cover the message:</p>
<pre><code>&quot;J ai plaque mon chene&quot;
+
&quot;Una mattina Una matti&quot;
=
9
+
20
=
29
</code></pre>
<p>There’s no letter with value 29 (max is 25), so we use congruence modulo 26 (numbers 0 to 25).</p>
<p>Thus,</p>
<p>$$
29 \equiv 29-26 \pmod{26} \equiv 3 \pmod{26} = D
$$</p>
<p>We continue calculating:</p>
<pre><code>&quot;J ai plaque mon chene&quot;
+
&quot;Una mattina Una matti&quot;
=
9
+
20
=
29
≡
3 mod(26)
=
D
</code></pre>
<p>And so on. We get the ciphertext: &ldquo;D ni bltjcr mia ctegx&rdquo;</p>
<h4 id="decryption-1">Decryption</h4>
<p>To decrypt, subtract the key from the ciphertext, again using congruence.</p>
<pre><code>&quot;D ni bltjcr mia ctegx&quot;
-
&quot;Una mattina Una matti&quot;
=
3
-
20
=
-17
≡
-17+26 mod(26)
≡
9 mod(26)
=
J
</code></pre>
<p>Step by step, we return to:
&ldquo;J ai plaque mon chene&rdquo;</p>
<h2 id="variants">Variants</h2>
<p>The Vigenère cipher has known many variations. Here are a few:</p>
<h3 id="the-bellaso-precursor">The Bellaso Precursor</h3>
<p>Before Vigenère, there was Bellaso.
But the poor man was overshadowed by another Italian, better known in his time, Giovanni Della Porta, and later by Vigenère.
So sometimes it’s called the Porta/Bellaso cipher.</p>
<p>This cipher uses the following table:</p>
<table>
  <thead>
      <tr>
          <th>Key</th>
          <th>Substitution</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>AB</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>N O P Q R S T U V W X Y Z</td>
      </tr>
      <tr>
          <td>CD</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>Z N O P Q R S T U V W X Y</td>
      </tr>
      <tr>
          <td>EF</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>Y Z N O P Q R S T U V W X</td>
      </tr>
      <tr>
          <td>GH</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>X Y Z N O P Q R S T U V W</td>
      </tr>
      <tr>
          <td>IJ</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>W X Y Z N O P Q R S T U V</td>
      </tr>
      <tr>
          <td>KL</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>V W X Y Z N O P Q R S T U</td>
      </tr>
      <tr>
          <td>MN</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>U V W X Y Z N O P Q R S T</td>
      </tr>
      <tr>
          <td>OP</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>T U V W X Y Z N O P Q R S</td>
      </tr>
      <tr>
          <td>QR</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>S T U V W X Y Z N O P Q R</td>
      </tr>
      <tr>
          <td>ST</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>R S T U V W X Y Z N O P Q</td>
      </tr>
      <tr>
          <td>UV</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>Q R S T U V W X Y Z N O P</td>
      </tr>
      <tr>
          <td>WX</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>P Q R S T U V W X Y Z N O</td>
      </tr>
      <tr>
          <td>YZ</td>
          <td>A B C D E F G H I J K L M</td>
      </tr>
      <tr>
          <td></td>
          <td>O P Q R S T U V W X Y Z N</td>
      </tr>
  </tbody>
</table>
<p>The left column contains the key letter, and the right column contains the substitution.</p>
<p>A quick example to show how it works:</p>
<h4 id="encryption-2">Encryption</h4>
<p>Take the message: &ldquo;Trois Anneaux pour les Rois Elfes&rdquo; (excerpt from Tolkien’s &ldquo;The Lord of the Rings&rdquo; in french)</p>
<p>With the key: &ldquo;La République Galactique&rdquo; (excerpt from Lucas’s &ldquo;Star Wars&rdquo; in french)</p>
<p>The first key letter is &ldquo;L&rdquo;.</p>
<p>Look for this letter in the first column; &ldquo;L&rdquo; is in the sixth row with &ldquo;K&rdquo;.</p>
<p>The first letter of the message is &ldquo;T&rdquo;. Find &ldquo;T&rdquo; in the second column on the sixth row.</p>
<p>You see that &ldquo;T&rdquo; is below &ldquo;L&rdquo; (in the two lines present in each second column row), so the ciphertext letter is &ldquo;L&rdquo;.</p>
<p>Next, the second key letter is &ldquo;a&rdquo; (to make sure you’re following).</p>
<p>It is in the first row of the first column. The second plaintext letter is &ldquo;r&rdquo;.</p>
<p>In the second column of the first row, &ldquo;r&rdquo; is below &ldquo;e&rdquo;, so the ciphertext letter is &ldquo;e&rdquo;.</p>
<p>Then:</p>
<ul>
<li>&ldquo;R&rdquo;: 9th row: &ldquo;o&rdquo; becomes &ldquo;j&rdquo;,</li>
<li>&ldquo;e&rdquo;: 3rd row: &ldquo;i&rdquo; becomes &ldquo;t&rdquo; (&ldquo;i&rdquo; is above &ldquo;t&rdquo;),</li>
<li>etc.</li>
</ul>
<p>The ciphertext is:
&ldquo;Lejtm qafnsem fbme xvb ijyh zyxpm&rdquo;</p>
<h4 id="decryption-2">Decryption</h4>
<p>Use the key to find the row and match. So:</p>
<p>With the key: &ldquo;La République Galactique&rdquo;
And ciphertext: &ldquo;Lejtm qafnsem fbme xvb ijyh zyxpm&rdquo;</p>
<ul>
<li>&ldquo;L&rdquo;: 6th row: &ldquo;L&rdquo; becomes &ldquo;T&rdquo;,</li>
<li>&ldquo;a&rdquo;: 1st row: &ldquo;e&rdquo; becomes &ldquo;r&rdquo;,</li>
<li>etc.</li>
</ul>
<p>You recover the message: &ldquo;Trois Anneaux pour les Rois Elfes&rdquo;</p>
<h3 id="beaufort">Beaufort</h3>
<p>We’ll quickly cover this and the next variant. The only difference from Vigenère is that instead of adding the key to the message to encrypt, you subtract the message from the key.</p>
<p>So to decrypt, subtract the ciphertext from the key:</p>
<p>Key – Message = Ciphertext ⇒ Message = Key – Ciphertext</p>
<p>Of course, this is in the congruence representation.</p>
<h3 id="german-variant-of-beaufort">German Variant of Beaufort</h3>
<p>For this variant, it’s the opposite. Subtract the key from the message to encrypt.</p>
<p>To decrypt, add the ciphertext to the key:</p>
<p>Message – Key = Ciphertext ⇒ Message = Key + Ciphertext</p>
<h3 id="disordered-alphabet">Disordered Alphabet</h3>
<p>You can shuffle the letters of the alphabet. If both correspondents have the same table, the system works.</p>
<p>Of course, each letter must appear only once per column and row.</p>
<p>Also, all letters must appear in every column and row.</p>
<p>For example, consider these values:</p>
<pre><code>C=0, E=1, A=2, Z=3, B=4, D=5, F=6, G=7, H=8, I=9, J=10, K=11, L=12, M=13, N=14, O=15, P=16, Q=17, R=18, S=19, U=20, T=21, V=22, W=23, X=24, Y=25
</code></pre>
<h3 id="expanded-or-different-alphabet">Expanded or Different Alphabet</h3>
<p>We worked with a 26-letter Latin alphabet but nothing stops you from expanding it to include extra symbols or using a different alphabet.</p>
<p>For example:</p>
<pre><code>A=0, B=1, C=2, D=3, E=4, F=5, G=6, H=7, I=8, J=9, K=10, L=11, M=12, N=13, O=14, P=15, Q=16, R=17, S=18, T=19, U=20, V=21, W=22, X=23, Y=24, Z=25,!=26,?=27
</code></pre>
<p>In this case, we have modulo 28 instead of 26.</p>
<h3 id="bellaso-variants">Bellaso Variants</h3>
<p>We used Bellaso’s original table but nothing prevents modifying it.</p>
<p>You could have three letters in the first column instead of two and reduce the number of rows accordingly.</p>
<p>Or have a different number of letters per row.</p>
<p>Or change the alphabet substitutions in the second column.</p>
<p>The only requirement is that your alphabet’s number of letters/symbols is even so each symbol has a match in the second column.</p>
<h2 id="weaknesses">Weaknesses</h2>
<h3 id="frequency-analysis-attack">Frequency Analysis Attack</h3>
<p>As mentioned in the historical preamble, this cipher and its variants were broken in the 19th century.</p>
<p>It suffers from the same weakness, though much more resilient, as the Caesar cipher.</p>
<p>Languages do not use letters with the same frequencies. For example, in French, the letter &ldquo;e&rdquo; is much more frequent than others.</p>
<p>An attacker can exploit these frequency differences to guess the message or the key.</p>
<p>But unlike Caesar’s cipher, there is a preliminary step.</p>
<p>The attacker must first try to guess the length of the key. This allows segmenting the ciphertext into equal-length segments.</p>
<p>To do this, they look for patterns in the ciphertext — groups of three letters or more that appear regularly.</p>
<p>Languages also have common patterns: for example, &ldquo;les&rdquo; appears frequently in French.</p>
<p>It’s more likely the same part of the key falls on the same plaintext pattern, encrypting it the same way, than by pure chance.</p>
<p>By spotting these patterns, the attacker estimates the key length and can segment the ciphertext.</p>
<p>Each plaintext letter in a segment is encrypted by the same key letter, allowing frequency analysis.</p>
<p>This might seem obscure or confusing. Don’t worry, a future article will clarify this with examples.</p>
<p>The Vigenère cipher is halfway between the Caesar cipher, from which it takes the substitution rule, and the one-time pad, which is the perfect algorithm, appearing only at the beginning of the 20th century.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Caesar cipher</title>
      <link>https://michee.io/en-us/posts/the-caesar-cipher/</link>
      <pubDate>Wed, 19 Nov 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-caesar-cipher/</guid>
      <description>One of the oldest encryptions in history. It is incorrectly attributed to Caesar and remains very poor.</description>
      <content:encoded><![CDATA[<h2 id="a-bit-of-history">A bit of history</h2>
<p>The Caesar cipher, despite its name, was apparently already used by the Spartans, so well before Julius Caesar.</p>
<p>It’s a variation of shift cipher, which is a substitution cipher. Complicated words for simple concepts, you’ll see.</p>
<p>Augustus used another variant of the Caesar cipher.</p>
<p>It’s very possible that it inspired the Vigenère cipher.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="the-big-picture-substitution">The big picture: substitution</h2>
<p>Let’s start with the broadest concept. Substitution ciphering consists of replacing one letter with another. Plain and simple.</p>
<p>This technique is the most widespread in history and it is different from permutation, which consists of changing the order of the letters in a text.</p>
<p>Modern algorithms use both methods at once because substitution alone is not very secure cryptographically (except in the very specific case of a one-time pad).</p>
<h2 id="the-medium-picture-the-shift">The medium picture: the shift</h2>
<p>Among substitution cipher methods, the simplest is the shift method.</p>
<p>It’s a monoalphabetic ciphering method (another complicated term for a simple concept).
That means that one letter is associated (during encryption/decryption) with exactly one other letter.
Two different letters cannot result in the same letter after encryption/decryption, and likewise, one letter cannot produce two different letters after encryption/decryption.</p>
<p>For mathematicians, this is a bijective relation.</p>
<p>The shift method therefore consists in shifting a letter within the alphabet.</p>
<h2 id="the-small-picture-the-caesar-cipher">The small picture: the Caesar cipher</h2>
<p>Nowadays, the term “Caesar cipher” refers to all these shift cipher methods, but more precisely to a shift by 3.</p>
<p>Let’s take the Latin alphabet, the one used by Caesar (even though it seems he preferred the Greek alphabet for his secret messages), and assign values to the letters:</p>
<pre><code>A=0, B=1, C=2, D=3, E=4, F=5, G=6, H=7, I=8, J=9, K=10, L=11, M=12, N=13, O=14, P=15, Q=16, R=17, S=18, T=19, U=20, V=21, W=22, X=23, Y=24, Z=25
</code></pre>
<p>We apply a shift of 3:</p>
<pre><code>A=0+3=3=D

B=1+3=4=E

…
</code></pre>
<p>However, you can see that if we do:</p>
<pre><code>X=23+3=26
</code></pre>
<p>we don’t know what letter 26 is, unless we use congruence. If this word is unfamiliar, read 
<a href="https://michee.io/en-us/posts/the-congruence-the-modulo/">this article</a>.</p>
<p>We’ll consider the Latin alphabet in <em>modulo</em> 26. So, if we redo the calculation:</p>
<pre><code>X=23+3=26 ≡ 26-26 *mod*(26) ≡ 0 *mod*(26) ≡ A
</code></pre>
<p>So, in the Caesar cipher, A becomes D, B becomes E, X becomes A, Y becomes B, Z becomes C…</p>
<p>We’ve shifted the letters by 3 positions.</p>
<p>An example:</p>
<p>Consider the message: “CAVE CANEM” (“Beware of the dog”, in Latin)</p>
<p>We apply the Caesar cipher:</p>
<pre><code>“C A V E C A N E M”

=

2 0 21 4 2 0 13 4 12

+3

=

5 3 24 7 5 3 16 7 15

=

“F D Y H F D Q H P”
</code></pre>
<p>Here’s your encrypted message. And to decrypt it, we do the opposite: subtract 3 from the letters of the encrypted message.</p>
<p>It’s simple, isn’t it? And you can see we’re at cryptography level 0.</p>
<p>But at the time, it seemed good enough.</p>
<h2 id="variants">Variants</h2>
<p>Of course, variants of this cipher have been developed throughout history.</p>
<h3 id="rot13">ROT13</h3>
<p>This variant consists of shifting by 13 letters instead of 3. “ROT” is short for rotation, because a shift with a <em>modulo</em> can be seen as a rotation.</p>
<p>This shift is special because it’s symmetric for a 26-letter alphabet (13 being half of 26).
That means that if you encrypt a message twice with this shift, you get the original message back.</p>
<p>Example:</p>
<p>First encryption:</p>
<pre><code>“C A V E C A N E M”

=

2 0 21 4 2 0 13 4 12

+13

=

15 13 34-26 17 15 13 26-26 17 25

=

15 13 8 17 15 13 0 17 25

=

“P N I R P N A R Z”
</code></pre>
<p>Second encryption:</p>
<pre><code>“P N I R P N A R Z”

=

15 13 8 17 15 13 0 17 25

+13

=

28-26 26-26 21 30-26 28-26 26-26 13 30-26 38-26

=

2 0 21 4 2 0 13 4 12

=

“C A V E C A N E M”
</code></pre>
<p>Tadaa, we recover “Cave Canem”.</p>
<h3 id="augustus">Augustus</h3>
<p>I said earlier that the Caesar cipher was useless. Wait until you see this one. Forget about <em>modulo</em>, that’s too complicated, and counting to 3 is also too complicated—just count to 1, that’s fine.</p>
<p>Augustus (Caesar’s nephew) used a shift cipher of 1. Yes, you read that right—1. Oh, and what about “z”? Remember, no congruence. So “z” becomes “aa”—yes, two “a”s.</p>
<p>Do I really need to give you an example?</p>
<h3 id="7up-k9">7up, K9</h3>
<p>Of course, there are also ciphers based on wordplay, invented for children’s games.</p>
<p>“7up” is a shift of 7.</p>
<p>“K9” is a reference to the robot dog from Dr Who (and also a very good mail app for Android…).
It’s a pun on the word “canine” of course. It’s a shift of 1 backward (25 forward).</p>
<h3 id="extending-the-alphabet">Extending the alphabet</h3>
<p>You can, of course, use an alphabet other than the Latin alphabet, or even take an arbitrary order of symbols. All that’s required is that the symbols be ordered.</p>
<p>Example:</p>
<p>Let’s take this fictional alphabet:</p>
<pre><code>“: ; ! , t 2 5”
</code></pre>
<p>If we apply an increment of 3, we get:</p>
<pre><code>“, t 2 5 : ; !”
</code></pre>
<h2 id="how-bad-this-is">How bad this is</h2>
<p>By now you understand just how bad this system is. Let’s look at two methods to break a cipher made with this technique.</p>
<h3 id="frequency-analysis">Frequency analysis</h3>
<p>Every language has letters that appear more frequently than others. For example, in French “e” is (by far) the most frequent letter.
So, an attacker just needs to analyze the frequency of symbols in the message.
If the encrypted message contains a lot of “g”s and the parties are French, the attacker can hypothesize a shift of 2 and easily recover the original text.</p>
<h3 id="brute-force-attack">Brute-force attack</h3>
<p>For a 26-letter alphabet, there are 26 possible combinations. It’s really not hard to test them all.</p>
<p>Testing all combinations is called a brute-force attack.
It’s the dumbest (the most brute) approach: you test every possibility.
But it’s also the attack that requires the most resources, since you’re testing everything.</p>]]></content:encoded>
    </item>
    <item>
      <title>The congruence (the modulo)</title>
      <link>https://michee.io/en-us/posts/the-congruence-the-modulo/</link>
      <pubDate>Wed, 12 Nov 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-congruence-the-modulo/</guid>
      <description>A bit of mathematics. How to do calculations without leaving a small set of numbers.</description>
      <content:encoded><![CDATA[<h2 id="where-does-it-come-from">Where does it come from?</h2>
<p>Congruence was formally studied for the first time at the end of the 18th century and the very beginning of the 19th century by Carl Friedrich Gauss, the “<em>master</em>” of mathematicians.</p>
<p>He gave his name to the bell curve known as the “Gaussian curve.”</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>Before that, people used congruence without being aware of its properties, just as we know how to add 2 carrots and 3 carrots without realizing it’s a sum in arithmetic.</p>
<p>That’s all very nice, but… what is it, exactly?</p>
<h2 id="the-principle">The principle</h2>
<p>Congruence is a mathematical structure. That is, a set of rules, that allows us to relate integers to one another within a finite set.</p>
<p>That is, if we consider a congruence of modulus (or <em>modulo</em>) n (we’ll see later what a modulus is), we have the following properties:</p>
<p>$$
a \equiv a \pmod{n}
$$
$$
\text{if } a \equiv b \pmod{n} \quad \text{then } b \equiv a \pmod{n}
$$
$$
\text{if } a \equiv b \pmod{n} \quad \text{and } b \equiv c \pmod{n} \quad \text{then } a \equiv c \pmod{n}
$$
$$
\text{if } a \equiv b \pmod{n} \quad \text{and } c \equiv d \pmod{n} \quad \text{then } a+c \equiv b+d \pmod{n} \quad \text{and } a \times c \equiv b \times c \pmod{n}
$$</p>
<p>And here you’re probably thinking: “I don’t get it. Why are there three bars in that equal sign? What does <em>mod</em> mean? So many questions!”</p>
<p>Don’t worry. We’ll go through examples and clearer illustrations.</p>
<h2 id="looping-around">Looping around</h2>
<p>Another way to think about congruence and modulo is as a loop or cycle.</p>
<h3 id="a-small-example-minutes">A small example: minutes</h3>
<p>Imagine you’re looking at a clock and paying attention only to the minute hand.</p>
<p>You want to add 45 minutes and 30 minutes, but you don’t care about the hour (just the minute hand). What do you get?</p>
<p>15 minutes, right?</p>
<p>Congratulations—you’ve just done a modulo 60 congruence calculation.</p>
<p>And you can add numbers much larger than 60 (or any other modulus).
You simply subtract 60 from the result as many times as you can.
The result must lie within the set (here, between 0 and 59).</p>
<p>How much is 59 + 258 minutes modulo 60?</p>
<p>Answer at the end of this blog post.</p>
<h3 id="a-second-small-example-hours">A second small example: hours</h3>
<p>Now, with hours. You look only at the hour hand (ignore the minutes).
You add 5 hours to 8 hours. What do you get? Careful, it’s a clock.</p>
<p>1 o’clock, right? (since a clock only shows 12 hours)</p>
<p>You’ve just done a modulo 12 congruence calculation.</p>
<p>So, why an equal sign with three lines?
Because in this second example, the result is not <em>equal</em> to 1 in the strict sense. We removed some extra hours.
So we write it with this sign called “congruent to.”</p>
<p>You can see that we can add huge numbers while keeping the result within a limited set of numbers (a finite set).
The size of the congruence limits the possible results.
Here, for example, the set contains 12 numbers, the 12 hours of a clock.</p>
<p>Of course, since it’s a cycle, it also works with subtracting hours and with negative integers.
You simply add the modulus afterward to bring the result back into the set (here, between 0 and 11).</p>
<p>So, how much is 2 – 18 hours modulo 12?</p>
<p>Answer at the end of this blog post.</p>
<h3 id="another-example-fingers">Another example: fingers</h3>
<p>If you consider the fingers of one hand, you have a congruence of 5 (usually), and with two hands, a congruence of 10.</p>
<p>Not convinced?</p>
<p>Take just one hand and count with your fingers: 3 + 4. How many fingers remain?</p>
<p>2, I think.</p>
<p>Now, take two hands and count 8 + 9. How many fingers remain?</p>
<p>7, right?</p>
<p>I’m deliberately using the term “remainder.” You’ll see why.</p>
<h2 id="and-the-remainder">And the remainder?</h2>
<p>You can also think of congruence as the remainder of a division (Euclidean division, for those who know the term).</p>
<p>The denominator of the division (the number below) is the modulus, and when you’ve finished dividing, what’s left is the remainder.</p>
<p>Note: it’s important to remember that this works with integers, so no decimals. You stop your division before the remainder becomes a decimal.</p>
<p>So, if we divide 3 by 2, what remainder do we get?</p>
<p>1, of course.</p>
<p>And if we divide 5 by 2, what remainder?</p>
<p>Also 1. Not bad.</p>
<p>So that means 1 ≡ 3 mod(2) and 1 ≡ 5 mod(2), right?</p>
<p>And therefore:</p>
<p>$$
1 \equiv 3 \pmod{2} \equiv 5 \pmod{2}
$$</p>
<p>Now, are the remainders of 33 ÷ 26 and 85 ÷ 26 congruent?</p>
<h2 id="answers">Answers</h2>
<h3 id="how-much-is-59--258-minutes-modulo-60">How much is 59 + 258 minutes modulo 60?</h3>
<p>$$
59+258 = 317 \equiv 317-60 \times 5 \pmod{60}
$$</p>
<p>(we have 5 times 60 that fits in 317)</p>
<p>$$
\equiv 317-300 \pmod{60} \equiv 17 \pmod{60}
$$</p>
<p>So:</p>
<p>$$
59+258 \equiv 17 \pmod{60}
$$</p>
<h3 id="how-much-is-2--18-hours-modulo-12">How much is 2 – 18 hours modulo 12?</h3>
<p>$$
2-18 = -16 \equiv -16+12 \pmod{12} \equiv -4 \pmod{12}
$$</p>
<p>(it’s still negative, so not between 0 and 11)</p>
<p>$$
\equiv -4+12 \pmod{12} \equiv 8 \pmod{12}
$$</p>
<p>So:
$$
2-18 \equiv 8 \pmod{12}
$$</p>
<h3 id="are-the-remainders-of-33--26-and-85--26-congruent">Are the remainders of 33 ÷ 26 and 85 ÷ 26 congruent?</h3>
<p>$$
33/26 = (26+7)/26
$$</p>
<p>so the remainder is 7.</p>
<p>$$
85/26 = (26+59)/26
$$</p>
<p>59 is greater than 26, so we continue:</p>
<p>$$
= (26+26+33)/26
$$</p>
<p>well look, 33, just like in the first division—so we continue:</p>
<p>$$
= (26+26+26+7)/26
$$</p>
<p>so the remainder is 7.</p>
<p>Therefore, yes, the remainders of 33 ÷ 26 and 85 ÷ 26 are congruent.</p>]]></content:encoded>
    </item>
    <item>
      <title>The authentication chain</title>
      <link>https://michee.io/en-us/posts/the-authentication-chain/</link>
      <pubDate>Wed, 05 Nov 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/the-authentication-chain/</guid>
      <description>Connecting to a service, a system, or a website is a process that’s a bit more complex than one might think.</description>
      <content:encoded><![CDATA[<p>This series of articles simply explains the processes and best practices for logging in.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="step-1-the-basics">Step 1, the basics</h2>
<p>We start at the beginning. The very first step is the password, the most common authentication method.</p>
<p>What makes a good password, how to best manage the multitude of passwords.</p>
<blockquote>
<p>
<a href="https://michee.io/en-us/posts/all-about-a-good-password/">All about a good password</a></p></blockquote>
<p>For developers, this article explains how to manage password authentication on your system.
Note, the recommendations in this article are valid for the first quarter of 2019.
If you read this article in 2038 (well hello to transdimensionals already,
or &ldquo;−··· −−− −· ·−−− −−− ··− ·−· ·−−·− ·−·· ·−−−−· ·· −· − · −· − ·· −−− −· −·· · ·−·· ·− −−· ·−· −−− ··· ··· · ···− −−− ·· −··−  &quot; in your language),
the recommendations will probably (surely) be outdated.</p>
<blockquote>
<p>
<a href="https://michee.io/en-us/posts/implementations-of-the-passphrase/">Passphrase implementations</a></p></blockquote>
<h2 id="step-2-strengthening">Step 2, strengthening</h2>
<p>Once the password is set (so no more &ldquo;1234567890&rdquo;), we move to the second step (which is aptly named).</p>
<p>Two-factor authentication is based on the principle &ldquo;Something you know, something you have.&rdquo;</p>
<blockquote>
<p>
<a href="https://michee.io/en-us/posts/all-about-two-factor-authentication/">All about two-factor authentication</a></p></blockquote>
<h2 id="step-3-distributing-authentication">Step 3, distributing authentication</h2>
<p>Once authenticated on one system, why do it again on others? It is error-prone and not very pleasant.</p>
<p>There is a solution that allows you to securely distribute your authentication.
With this solution, you authenticate to one service and other services, systems, websites you use can recognize your identity and authenticate you on demand without repeating the first two steps.</p>
<blockquote>
<p>
<a href="https://michee.io/en-us/posts/social-logins-how-do-they-work/">Social logins, how do they work?</a></p></blockquote>
<h2 id="step-4-access-control">Step 4, access control</h2>
<p>Once authenticated, you do not have access to all the resources provided by services either.
There are rules to select what you can access and what is denied.
Users of a service are organized according to groups or roles.
What on social networks is called tribe, clan, horde, community, committee, section, commission, (·−−· −−− ·−·· −·−− ·−−· ···· −−− −· ·· · ··· for the transdimensionals)&hellip;</p>
<blockquote>
<p>
<a href="https://michee.io/en-us/posts/what-is-a-commu-groups-and-roles/">What is a community? Groups and roles</a></p></blockquote>
<p>There you go. Of course, this is a base. There are many variants and special cases.</p>]]></content:encoded>
    </item>
    <item>
      <title>What is a commu ? Groups and roles</title>
      <link>https://michee.io/en-us/posts/what-is-a-commu-groups-and-roles/</link>
      <pubDate>Wed, 29 Oct 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/what-is-a-commu-groups-and-roles/</guid>
      <description>How can you properly manage what you can do on the service compared to what other users can (or cannot) do on the same service?</description>
      <content:encoded><![CDATA[<p>Once connected to a service, you’re not necessarily the only user at that moment.
How can you properly manage what you can do on the service versus what other users can (or cannot) do?</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>The service implements access control. Most commonly, it uses group-based or role-based access control.
For a social network, there is also relationship-based access control.</p>
<h2 id="group-based-access-control">Group-Based Access Control</h2>
<p>This is the tribe.</p>
<p>This type of access control is a grouping of users who have access to a certain set of resources.</p>
<p>This grouping defines permissions (rights) for using these resources. Each user in this group inherits those permissions.</p>
<h2 id="role-based-access-control">Role-Based Access Control</h2>
<p>This is the tribal chief or shaman…</p>
<p>This type of access control defines a set of permissions (rights) that are collectively assigned to a specific user.</p>
<p>Typically, there’s an Administrator role that has all permissions. Other roles are granted to users by this Administrator.
A user cannot assign a role to themselves.</p>
<p>Roles can also be hierarchical. A higher-level role includes all permissions of a lower-level role plus additional ones.</p>
<h2 id="difference-and-relationship-between-the-two">Difference and Relationship Between the Two</h2>
<p>When comparing these two types of access control, it can be tricky to distinguish them.
Depending on the system, the distinction may not even be explicitly made.</p>
<p>To clarify, here is the distinction:</p>
<ul>
<li>Groups are generally used to classify resources and users. They manage identity. For example: a user belongs to one or more groups.</li>
<li>Roles are generally used to manage permissions and rights. They manage activity. For example: a user can perform a certain action because they have a specific role.</li>
</ul>
<p>Groups and roles are linked because they complement each other:
A group defines the scope of a role. That is, the users and resources on which the role can act.
But a role can exist across multiple groups.</p>
<h3 id="example-facebook">Example: Facebook</h3>
<p>You might be a member of the &ldquo;<em>Raspberry Fans Group</em>&rdquo; and like the &ldquo;<em>Blackberry Fans Page</em>.&rdquo;
From an access control perspective, you belong to two groups.</p>
<p>Within the &ldquo;<em>Raspberry Fans Group</em>&rdquo; you’re a member, and within the &ldquo;<em>Blackberry Fans Page</em>&rdquo; you’re a moderator. These are your roles.</p>
<p>As you can see, your roles are bounded by groups. You are a moderator of the &ldquo;<em>Blackberry Fans Page</em>&rdquo; only, not elsewhere.
But there might be a moderator of the &ldquo;<em>Raspberry Fans Group</em>&rdquo; who has the same permissions there as you have on the page.
Thus, a role can be present in multiple groups.</p>
<p>Also, group membership provides default permissions.
As a regular member of the &ldquo;<em>Raspberry Fans Group</em>&rdquo;, you have access to that group’s posts. You wouldn’t have this access if you weren’t a member.</p>
<h3 id="example-a-computer">Example: A Computer</h3>
<p>The distinction between group and role is subtle (especially on UNIX).
But you can think of the computer itself as the group, and the user accounts on that computer have roles (usually one is the administrator—a role that exists on all computers).</p>
<h2 id="relationship-based-access-control">Relationship-Based Access Control</h2>
<p>This refers to your friends or contacts on social networks.</p>
<p>The existence of a relationship between you and a friend grants permissions to both of you over each other’s resources.</p>
<p>The relationship manages permissions.
These can be symmetric (the friend has the same rights as you) or asymmetric (the friend has fewer permissions—this is closer to a “fan” or hierarchical relationship).</p>
<h2 id="capability-based-access-control">Capability-Based Access Control</h2>
<p>This type of access control allows for fine-grained permission management.</p>
<p>Permissions are attached to a specific resource (object) rather than a group of resources (as in group- or role-based control).
The object-permission pair forms a capability.</p>
<p>If a user possesses the corresponding capability, they can access that object with the defined permissions.</p>
<p>This allows for much more precise permission management since it’s handled resource by resource.</p>
<p>This control type is used by 
<a href="https://michee.io/en-us/posts/social-logins-how-do-they-work">OAuth2</a> (the mechanism used for social login) to manage permissions.
For example, when you use Facebook social login on a website, Facebook tells you that the site wants to access your email, your friends list, or other data.</p>
<p>This is the capability you delegate (fully or partially) to the site over the Facebook resource (which in this case is your profile).</p>]]></content:encoded>
    </item>
    <item>
      <title>Social logins: how do they work?</title>
      <link>https://michee.io/en-us/posts/social-logins-how-do-they-work/</link>
      <pubDate>Wed, 22 Oct 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/social-logins-how-do-they-work/</guid>
      <description>Facebook, Google, and others allow you to authenticate on different websites through them. How does it work, and what are the risks?</description>
      <content:encoded><![CDATA[<h2 id="how-does-it-work">How does it work?</h2>
<p>The underlying protocol that everything relies on is OAuth2. So, let&rsquo;s start there.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h3 id="oauth2">OAuth2</h3>
<p>If there&rsquo;s a “2”, that means it&rsquo;s the second version.</p>
<p>The first version, OAuth, had multiple security vulnerabilities. <strong>Never use it.</strong></p>
<p>OAuth2 is the protocol that manages authorization. It allows a device to access resources—data stored on a server.</p>
<p>To do this, it uses <em>scopes</em>. These are parameters that request access to specific resources.</p>
<p>For example, the <em>scope</em> “profile” requests access to the user’s profile information.</p>
<p>The server returns a <em>claim</em>, which represents the requested data.</p>
<p>For the “profile” scope, the <em>claim</em> would be:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Alice the rabbit&quot;,
  &quot;firstname&quot;: &quot;Alice&quot;,
  &quot;lastname&quot;: &quot;the rabbit&quot;
}
</code></pre>
<p>This protocol can handle different methods of granting authorization, but for social login, only one concerns us.</p>
<h3 id="authorization-code-grant">Authorization Code Grant</h3>
<p>This authentication method allows a service to authorize a user’s login without requiring their password, by trusting an authorization server.</p>
<p>Here’s how it works:</p>
<ul>
<li>The user wants to log in to a service</li>
<li>The service redirects the user to the authorization server’s login page</li>
<li>The user logs into the authorization server if not already logged in (they enter their password at this step on the authorization server)</li>
<li>The authorization server displays a confirmation panel asking the user if they really want to connect to the service</li>
<li>The user confirms</li>
<li>The server then redirects the user back to the service with an authorization code</li>
<li>The service uses the received authorization code to request an access token from the authorization server</li>
<li>The authorization server approves the connection between the service and the user</li>
<li>The user is logged in to the service</li>
</ul>
<p>As you can see, the user never enters their password on the service. Password storage happens only on the authorization server.</p>
<h2 id="openid-connect">OpenID Connect</h2>
<p>This extension of OAuth2 is managed by the OpenID Foundation, which also maintains the original OpenID with its own mechanism.</p>
<p>This extension handles authentication (identity). It leverages the authorization server as an authentication server.</p>
<p>Building on the “Authorization Code Grant” flow,
it verifies the user’s identity with the server using information returned by it (a unique identifier, usually an email, though ideally a UUID).</p>
<p>Additionally, this extension offers several options:</p>
<ul>
<li>The UserInfo endpoint provided by the authentication server: allows dynamic retrieval of user profile information</li>
<li>The Session endpoint provided by the authentication server: enables session verification to synchronize sessions
(e.g., making sure the user’s session on the service ends when they log out of the server)</li>
<li>A logout flow that logs the user out of all services when they log out of the authentication server</li>
<li>An implicit login flow called “Single Sign-On” which allows users to log into a service seamlessly.
The service and the server appear unified as a single application.</li>
</ul>
<h3 id="advantages">Advantages</h3>
<p>This system links multiple services without requiring a password for each one, enhancing security.</p>
<p>It also enables data synchronization between services with a central information silo (a reference point for data storage).
This reduces data conflicts when properly implemented.</p>
<h3 id="risks">Risks</h3>
<p>Using this system requires full trust in the authorization provider.
The provider can access information within connected services because it can impersonate the user and obtain an authorization code on their behalf.</p>
<p>Identity and data synchronization isn’t always well executed.
You might end up with multiple accounts on the same service just because you changed your email on the authorization server.
The service relying on email won’t recognize the old account and will create a new one.</p>
<p>Logout is often not implemented.
Major social login providers use persistent sessions, and many services don’t implement proper logout checks.
As a result, services may remain logged in (the user stays connected) even after logging out of Facebook or Google.</p>
<p>If the authorization server is attacked, compromised, or weakened, all linked services become vulnerable.</p>
<h3 id="attacks">Attacks</h3>
<h4 id="clickjacking">Clickjacking</h4>
<p>A hacker could create a malicious service that loads the authorization server inside a transparent <em>iframe</em>.</p>
<p>To simplify, imagine your authentication server as a smartphone.</p>
<p>You tap the center button on your smartphone screen to accept the service.</p>
<p>With clickjacking, the hacker has placed a transparent sheet over your screen,
and when you click the button, you’re actually clicking on the sheet, unknowingly granting the malicious service access to your data.</p>
<p>For developers: Implement the <code>X-Frame-Options</code> header with strict settings (e.g., “SameOrigin”) and/or use JavaScript framebusting techniques.</p>
<h4 id="cross-site-request-forgery-csrf">Cross-Site Request Forgery (CSRF)</h4>
<p>A hacker can trick the user into clicking an authorization button that redirects,
not to the intended service, but to the hacker’s malicious service.
The malicious service captures the authorization code and then redirects the user to the correct service.</p>
<p>The user notices nothing, but the malicious service now has the authorization and access tokens.</p>
<p>For developers: Enforce fixed, pre-registered redirect URLs for services.</p>
<p>There are other CSRF variations; I’ll detail them in a future article.</p>
<h4 id="confused-deputy-problem">Confused Deputy Problem</h4>
<p>This issue occurs when services do not correctly verify the identity of the user utilizing the authorization server.</p>
<p>A malicious user can log in to the authorization server and trick the service into thinking they are another user
by manipulating the information used to identify the user.</p>
<p>If the service doesn’t use a reliable identifier for proper user identification,
it gets fooled and grants access to the wrong account.</p>
<p>Example:</p>
<p>A service uses an authorization server that provides both a UUID and a username.</p>
<p>The authorization server has two accounts:</p>
<ul>
<li>Alice with UUID: <code>46d07175-dbf2-46e2-80fc-c6493e481479</code></li>
<li>Oscar with UUID: <code>362b862b-51b3-41f4-82c7-82eb677a9aa4</code></li>
</ul>
<p>The authorization server provides UUIDs as unique identifiers, expecting the service to use them.</p>
<p>But instead, the service chooses to use the username as the unique identifier.</p>
<p>Oscar changes his username to “Alice” (allowed by the server since it uses UUID as the true unique ID).</p>
<p>Now, when Oscar logs into the service, he gains access to Alice’s account
(because the service mistakenly uses username as the unique identifier).</p>
<p>For developers: Always choose a truly unique identifier. UUIDs are designed for this purpose.
They don’t carry user information and allow users to freely change their details (even email) without affecting uniqueness.</p>]]></content:encoded>
    </item>
    <item>
      <title>All About Two-Factor Authentication</title>
      <link>https://michee.io/en-us/posts/all-about-two-factor-authentication/</link>
      <pubDate>Wed, 15 Oct 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/all-about-two-factor-authentication/</guid>
      <description>Two-factor authentication strengthens authentication by adding an extra step. But more specifically, what is it?</description>
      <content:encoded><![CDATA[<h2 id="the-principle">The Principle</h2>
<p>The idea behind two-factor authentication is to ensure that the user identifies themselves using two techniques that are very unlikely to be compromised at the same time.</p>
<p>The key phrase to remember is:</p>
<p>&ldquo;Something you know, something you have.&rdquo;</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<p>In practice, this often involves a password (“something you know”) and a physical device (e.g., a message on a smartphone, “something you have”).</p>
<p>Two-factor authentication is just one method within a broader concept: multi-factor authentication.</p>
<h2 id="multi-factor-authentication">Multi-Factor Authentication</h2>
<p>When you watch a spy movie with a secret base, you sometimes see the hero or villain scan their iris, type a code on a keyboard, place their hand on a pad, and even spit into a sensor before opening the door.
That’s multi-factor authentication.</p>
<p>You may encounter or implement an authentication chain, meaning several authentication steps are required, and if one fails, authentication stops.</p>
<p>In some real-world high-security scenarios, more than two steps are used.
But most of the time, two steps are enough.</p>
<h2 id="methods-and-their-pitfalls">Methods (and Their Pitfalls)</h2>
<h3 id="sms">SMS</h3>
<p>The most common two-factor authentication method is SMS.</p>
<p>This is the weakest method because it’s easily hackable.
With enough resources, a hacker can compromise SS7.</p>
<p>SS7 is the network layer that routes SMS messages. Designed in the 1970s, it’s long outdated and has been exploited in real attacks (
<a href="https://www.nextinpact.com/news/104214-ss7-apres-interceptions-sms-securite-reseaux-mobiles-en-question.htm" target="_blank">NextImpact article in french</a>).</p>
<p>It’s also inconvenient in areas with no mobile network coverage.</p>
<h3 id="push">PUSH</h3>
<p>Another method used by some services is push authentication.
This involves a notification sent to your smartphone asking for your approval.
The message is <em>pushed</em> by the service to your device.</p>
<p>This requires an internet connection on your phone, which can be a weakness because hackers can attempt to intercept these notifications.</p>
<h3 id="hotptotp">HOTP/TOTP</h3>
<p>The second most common method is HOTP/TOTP (HMAC-based One-Time Password / Time-based One-Time Password).</p>
<ul>
<li>HOTP (“One-time password based on HMAC”) generates a unique password using a cryptographic HMAC and a counter.</li>
<li>The user installs an app on their smartphone that generates a 6-character token on demand.
This token is generated using:
<ul>
<li>A seed stored both in the web service account and the app.</li>
<li>A counter that increments in sync between the service and the app.</li>
</ul>
</li>
</ul>
<p>When the user enters the token, the web service compares it with its own calculation.
If they match, authentication succeeds.
The service knows it’s from the user’s smartphone because only that device holds the seed.</p>
<p>The seed is usually transferred from the service to the user via a QR code.</p>
<ul>
<li>TOTP (“Time-based One-time Password”) extends HOTP by using the current time (typically 30-second intervals) instead of a counter.
TOTP is much more widely used than HOTP.</li>
</ul>
<p>We recommend using FreeOTP to generate tokens on smartphones or other devices:</p>
<ul>
<li>
<a href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp" target="_blank">Android</a> and 
<a href="https://f-droid.org/en/packages/org.fedorahosted.freeotp/" target="_blank">F-droid</a></li>
<li>
<a href="https://itunes.apple.com/us/app/freeotp-authenticator/id872559395?mt=8" target="_blank">iOS</a></li>
<li>
<a href="https://github.com/freeotp" target="_blank">Source Code</a></li>
</ul>
<p>These methods do not require internet or SMS connectivity, making them safer. Hackers can’t intercept messages because no messages are sent.</p>
<h3 id="hardware-devices">Hardware Devices</h3>
<p>The most secure method is to use a dedicated hardware device.
During setup, the device is linked to your account on the web service.
Thanks to cryptographic recognition (the device contains an asymmetric key),
the service recognizes it as “something you have” for authentication.</p>
<p>The downside: you have to carry an extra device—and not lose it!</p>
<p>Some banks also provide hardware tokens tied to your bank card, often using TOTP internally.</p>
<h3 id="recovery-codes">Recovery Codes</h3>
<p>While not strictly “something you have,” recovery codes are the best backup method if you lose your device or smartphone.
It’s a list of single-use tokens you can use instead of your primary factor.</p>
<p>Store this list in a very secure location and only use it as a last resort.</p>
<h2 id="attacks">Attacks</h2>
<p>These solutions aren’t perfect and can be targeted by attackers.</p>
<h3 id="social-engineering">Social Engineering</h3>
<p>In SMS-based two-factor authentication, attackers can use social engineering.
For example, 
<a href="https://www.youtube.com/watch?v=kHI90LbBwaQ" target="_blank">DeRay McKesson’s case</a>.</p>
<p>Hackers impersonate the phone owner with the carrier, request a SIM card swap,
and once their SIM is activated, they receive all of the victim’s SMS messages.</p>
<h3 id="proxy-attacks">Proxy Attacks</h3>
<p>Attackers can also intercept via proxies, either by:</p>
<ul>
<li>Creating a fake mobile network nearby to intercept SMS (
<a href="https://www.nextinpact.com/news/104214-ss7-apres-interceptions-sms-securite-reseaux-mobiles-en-question.htm" target="_blank">NextImpact article in french</a>), or</li>
<li>Setting up a phishing site that mimics the real one to capture credentials and tokens.
This is known as a homograph attack or typosquatting.</li>
</ul>
<p>Mitigation:
Use hardware authentication or always check the website domain name.</p>
<p>Example:
If you intend to visit &ldquo;douce-framboise.com&rdquo;, make sure it’s not &ldquo;douce-framb0ise.com&rdquo;.</p>
<h3 id="forgotten-authentication-paths">Forgotten Authentication Paths</h3>
<p>Sometimes web service maintainers forget that the main login page isn’t the only access point.</p>
<p>Examples:</p>
<ul>
<li>Password reset via an email link may bypass two-factor authentication.</li>
<li>Using external services via APIs (like Google or Facebook OAuth2 login) might also skip two-factor checks.</li>
</ul>
<p>Always ensure two-factor authentication is enforced for all access paths to your users’ data.</p>]]></content:encoded>
    </item>
    <item>
      <title>All About a Good Password</title>
      <link>https://michee.io/en-us/posts/all-about-a-good-password/</link>
      <pubDate>Wed, 01 Oct 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/all-about-a-good-password/</guid>
      <description>Many articles on the web try to explain how to create a good password. Unfortunately, they often contain many misconceptions.</description>
      <content:encoded><![CDATA[<p>We’ll try here to gather the correct information for properly managing passwords.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="the-password-to-rule-them-all">The password to rule them all</h2>
<p>First of all, how can you create a good password you can remember?</p>
<h3 id="replacing-characters-is-not-good">Replacing characters is not good</h3>
<p>Often, a bad but seemingly good idea pops up: replacing characters with others.</p>
<p>For example, using “p@ssw0rd” instead of “password”.</p>
<p>This idea comes from the English-speaking world and is based on the fact that most passwords were composed of ASCII characters,
meaning the 26 letters of the Latin alphabet plus some punctuation symbols.</p>
<p>This article was originally written in French and was therefore aimed at French speakers who are less affected by this issue because French contains characters
not included in the basic ASCII table. Accents, for example: “à, é, è, ù&hellip;” are included in the extended ASCII table
or even UTF-8 (a table that contains alphabets from all over the world: Arabic, Cyrillic, Chinese&hellip;).</p>
<p>This technique makes passwords much harder to remember.
Because they’re hard to memorize, we tend to make them shorter, which is also very bad.</p>
<h3 id="passphrases-are-good">Passphrases are good</h3>
<p>This technique is known thanks to the 
<a href="https://xkcd.com/936/" target="_blank">xkcd</a> comic strip, often referred to as “correct horse battery staple”.</p>
<p>To be effective, the combination of words must be as rare as possible. In the xkcd comic, this rarity is conveyed by randomness.</p>
<p>But let’s not forget that this is a password we need to remember. Our brains don’t handle randomness well.
That’s why, at the end of the comic, the author emphasizes creating a mental image of the passphrase.</p>
<p>Note: In French, word frequency and word combinations are lower than in English because French speakers are fewer
and the language contains articles, determiners, and possessives that further reduce combination probability.
Thus, randomness is less critical than in English.</p>
<p>We can therefore use grammatically correct phrases as passwords.</p>
<h3 id="an-example-to-illustrate">An example to illustrate:</h3>
<p>Which do you think is the better password:</p>
<p>“!He_r@spberr1es”</p>
<p>or</p>
<p>“The Queen of the Night’s Aria, The Magic Flute by Wolfgang Amadeus Mozart”</p>
<p>If you like Mozart, it’s definitely the second one.
It’s easy to remember, longer than the first, and the chance that two people have the same password is low.</p>
<h2 id="the-password-manager-to-bring-them-all">The password manager to bring them all</h2>
<p>Having a password you can remember is good.
But even better is being able to use passwords you cannot remember yourself.
This reduces the risk of accidentally revealing them in conversation.</p>
<p>Jimmy Kimmel has a segment on his show 
<a href="https://www.youtube.com/watch?v=opRMrEfAIiI" target="_blank">available on YouTube</a>.</p>
<p>To avoid this risk and create passwords you can’t remember, you need a password manager.</p>
<p>This is software or a web service that stores your passwords and displays them when requested.
You just copy-paste them or use plugins that auto-fill login forms.
They’re usually encrypted, and you access them with a master password. The only one you really need to remember.</p>
<p>With this system, since you don’t have to remember passwords, go big.
Use 50-character randomly generated passwords with lots of weird symbols.
Take advantage of UTF-8, checking compatibility with your software and services (not all support it,
and some don’t display Cyrillic correctly, for example).</p>
<h3 id="software-or-web-service">Software or web service</h3>
<p>The advantage of using software instead of a web service is reduced risk of attacks and leaks.</p>
<p>A web-based password manager attracts attackers
because a breach could expose thousands of accounts instead of just one.</p>
<p>There are also legal conflicts between the service’s jurisdiction and users’ rights,
for example, European GDPR vs. the U.S. Cloud Act.
We’ll discuss these legal aspects in future articles.</p>
<p>The advantage of a web service is a lower risk of password loss and a dedicated team monitoring and patching vulnerabilities.</p>
<h3 id="me">Me</h3>
<p>I use 
<a href="https://keepassxc.org/" target="_blank">KeepassXC</a>.</p>
<p>It’s open-source, meaning the code can be easily audited.</p>
<p>It runs locally on your devices instead of online, reducing centralized attack surfaces.</p>
<p>It encrypts passwords with the master password.</p>
<p>Legal conflicts between European GDPR and the U.S. Cloud Act are avoided
since passwords aren’t stored on U.S. servers.</p>
<p>However, it’s harder to share the password database across devices.
You also need to manage backups of your encrypted password database yourself.</p>
<p>KeepassXC is a variant of 
<a href="https://www.keepassx.org/" target="_blank">KeepassX</a>
(development appears to have stopped), itself a variant of 
<a href="https://keepass.info/" target="_blank">Keepass</a>,
which is Windows-only. In fact, Keepass will undergo a security audit by the European Commission.</p>
<h2 id="and-in-the-darkness-bind-them-attacks">And in the darkness bind them (attacks)</h2>
<h3 id="mass-attacks">Mass attacks</h3>
<p>Mass attacks aim to collect as many passwords as possible,
without caring whose accounts they belong to.</p>
<h3 id="dictionary-attacks">Dictionary attacks</h3>
<p>The most common are dictionary attacks.
They require little computing power but lots of storage (time-memory tradeoff).
They test the most common known passwords (from previous breaches) and move on if they fail.</p>
<p>A yearly list of the 
<a href="https://gizmodo.com/the-25-most-popular-passwords-of-2018-will-make-you-fee-1831052705" target="_blank">25 most popular passwords</a> is published
(here’s the 2018 list, with 2017 comparison):</p>
<ul>
<li>123456 (unchanged)</li>
<li>password (unchanged)</li>
<li>123456789 (+3 spots)</li>
<li>12345678 (-1)</li>
<li>12345 (unchanged)</li>
<li>111111 (new)</li>
<li>1234567 (+1)</li>
<li>sunshine (new)</li>
<li>qwerty (-5)</li>
<li>iloveyou (unchanged)</li>
<li>princess (new)</li>
<li>admin (-1)</li>
<li>welcome (-1)</li>
<li>666666 (new)</li>
<li>abc123 (unchanged)</li>
<li>football (-7)</li>
<li>123123 (unchanged)</li>
<li>monkey (-5)</li>
<li>654321 (new)</li>
<li>!@#$%^&amp;* (new)</li>
<li>charlie (new)</li>
<li>aa123456 (new)</li>
<li>donald (new)</li>
<li>password1 (new)</li>
<li>qwerty123 (new)</li>
</ul>
<p>The issue with this list, present in all “how to make a good password” articles,
is that it’s from the English-speaking world and doesn’t reflect the most common passwords in other languages (as french).
If you have sources for other languages passwords, I’d love to see them.</p>
<p>Of course, there are also lists with 100, 1,000, 10,000, 1 million, or more passwords circulating online.</p>
<h3 id="rainbow-tables">Rainbow tables</h3>
<p>The second type is the rainbow table attack.
It’s more computationally expensive but requires less storage.
It only works if the attacker has obtained a database of password hashes
(we’ll explain “hash” in a future article).</p>
<p>A rainbow table compares its stored hashes with those in the hacked database.
If they match, the password is the same.</p>
<p>Example:</p>
<p>The attacker has a rainbow table with these md5 hashes:</p>
<ul>
<li>password: 5f4dcc3b5aa765d61d8327deb882cf99</li>
<li>sdhfksdkfh: e2a1dbf388e7a7e87dc02943e3521036</li>
<li>raspberry: 54a9fc48a5b664772e2ca06d1e0772d9</li>
</ul>
<p>They hack a site’s hash table and get:</p>
<ul>
<li>Bob: 098f6bcd4621d373cade4e832627b4f6</li>
<li>Alice: 54a9fc48a5b664772e2ca06d1e0772d9</li>
<li>Lee: 190a16e29799b184d9900690ee04438a</li>
</ul>
<p>The second hash matches the third entry in their rainbow table,
so Alice’s password is “raspberry”.</p>
<p>Passphrases counter both these attacks.
If the passphrase isn’t in the dictionary or rainbow table, the attack fails.</p>
<p>In a future article, we’ll discuss strengthening hash tables for website developers.</p>
<p>In the hash article, we’ll also see how to reduce rainbow table storage needs.</p>
<h3 id="brute-force-grrrr">Brute force (grrrr)</h3>
<p>The last technique is brute force: trying every possible combination.
It’s the most computationally expensive but requires the least storage.</p>
<p>It’s the oldest method and why we started adding special characters to passwords.</p>
<p>But attackers have long used extended ASCII (with uppercase and accents)
or UTF-8 (all alphabets worldwide: Arabic, Cyrillic, Chinese&hellip;) to test everything.</p>
<p>To counter it, use longer passphrases and the full alphabet (not “aaaaaaaaaaaaaaaaaaaaaa”).</p>
<p>This increases entropy (we’ll explain entropy in another article).
French, with its accented letters, provides even higher entropy than English.</p>
<p>Example:</p>
<p>“!Es_fr@mbo1ses” has 72.1 bits of entropy, which is strong (good for most cases).</p>
<p>“The Queen of the Night’s Aria, The Magic Flute by Wolfgang Amadeus Mozart”
has 475.8 bits of entropy, making it ultra-strong (obviously good).</p>
<p>The higher the entropy, the longer brute-force takes.
The goal is to make attacks take years or centuries, not seconds.
And with a password manager, take full advantage of UTF-8 (checking compatibility).</p>
<h3 id="targeted-attack">Targeted attack</h3>
<p>A targeted attack aims to hack a specific user.</p>
<h4 id="keylogger">Keylogger</h4>
<p>This involves infecting the user’s device with a tool that records every keystroke.
When the user types their password, it’s captured.</p>
<p>This is outside this article’s scope and will be covered in future articles.</p>
<h4 id="social-engineering">Social engineering</h4>
<p>Through social engineering, a hacker may obtain your password
from friends, family, or even you.
Remember 
<a href="https://www.youtube.com/watch?v=UzvPP6_LRHc" target="_blank">Jimmy Kimmel</a>.</p>
<p>First, never share your password with anyone.
Many services (including email) allow account sharing without sharing passwords.</p>
<p>Second, a password manager helps here too.
If you don’t know your own password, a hacker can’t extract it this way.</p>
<p>For your master password, try a unique word combination or phrase no one knows.</p>
<h2 id="tools-to-find-them">Tools to find them</h2>
<p>Yes, for those catching the title reference, I had to swap titles for coherence.</p>
<p>Once you have passwords for online services or devices, you must monitor them and track their lifecycle.</p>
<p>Make sure deleted passwords are truly deleted.</p>
<h3 id="expiration">Expiration</h3>
<p>You can set an expiration date for passwords.
I don’t recommend this unless you’re sure because it often clashes with human behavior.</p>
<p>People quickly create slightly modified versions of old passwords
or stop changing them altogether.
Since password expiration handling isn’t standardized, this can create security flaws.</p>
<h3 id="breach-monitoring">Breach monitoring</h3>
<p>You should also ensure your password hasn’t been breached.
Use monitoring tools for this.</p>
<p>A great service is 
<a href="https://haveibeenpwned.com/" target="_blank">haveibeenpwned</a> by Troy Hunt.
You can monitor your emails, and if they appear in a breach, the service notifies you.</p>
<p>It even provides tools to integrate into your website or app.
However, I have serious GDPR concerns about it (to be discussed later).</p>
<p>Lastly, here’s a Twitter account showing
how hard it is for services to handle passwords correctly:</p>
<p>
<a href="https://twitter.com/PWTooStrong" target="_blank">https://twitter.com/PWTooStrong</a></p>
<p>Well, I’ve promised a lot of future articles. Great, more work for me. Pfff&hellip;</p>
<p>For developers, here are some tips on 
<a href="https://michee.io/en-us/posts/implementations-of-the-passphrase/">implementing passwords</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Implementations of the passphrase</title>
      <link>https://michee.io/en-us/posts/implementations-of-the-passphrase/</link>
      <pubDate>Wed, 01 Oct 2025 16:00:00 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/implementations-of-the-passphrase/</guid>
      <description>Do you manage a web service, a website, or software and want to implement password management for your user sessions?</description>
      <content:encoded><![CDATA[<p>First, read this article on 
<a href="https://michee.io/en-us/posts/all-about-a-good-password/">what makes a good password</a>, then continue reading this one.</p>
<p>Note: This post was translated from french with the help of AI. The original post was written with the knowledge of a younger me.</p>
<h2 id="password-rules">Password Rules</h2>
<p>If you’re tempted to set password rules like “between 8 and 20 characters” or “3 uppercase letters,” stop right there.</p>
<p>This approach is outdated, overly rigid for users, and leads them to create passwords that are hard for them to remember but very easy for bots to crack.</p>
<p>Don’t believe me? Check out the Twitter account 
<a href="https://twitter.com/PWTooStrong" target="_blank">passwordistoostrong</a>.</p>
<p>Example:</p>
<p>Imagine the rule:</p>
<p>“Between 8 and 20 characters, at least 3 uppercase letters, and a punctuation mark.”</p>
<p>This password would qualify: “AbCdEfgh!” even though it’s not actually strong.</p>
<p>Meanwhile, the user is left frustrated.</p>
<h2 id="entropy">Entropy</h2>
<p>Instead, use an entropy-based system.</p>
<p>The 
<a href="https://github.com/dropbox/zxcvbn" target="_blank">zxcvbn</a> library (named after the bottom row of keys on a U.S. keyboard) is a great implementation for calculating password strength based on entropy.
It’s available in a wide variety of programming languages.</p>
<p>The advantage is that there are no rigid rules for estimating password strength.
The library calculates the complexity of your password (considering the rarity of characters, their patterns, etc.) and assigns it a score.
You can then decide from which score threshold you consider the password sufficiently secure.</p>
<p>Of course, you must use the same scoring and thresholds on both the server and client sides.
If they differ, the server has the final say since the client side can be tampered with by an attacker (it’s not secure).</p>
<h2 id="avoid-compromised-passwords">Avoid Compromised Passwords</h2>
<p>Once you’ve set a threshold to block weak passwords, you still need to check if the entered password hasn’t already been compromised.</p>
<p>This is an optional additional safeguard because if your complexity threshold is high enough, the way the password is stored can already effectively defend against rainbow table attacks. Still, it’s a valuable bonus.</p>
<p>To do this, you can either load a JavaScript file on the client side or make an AJAX request to an API when the user creates their password.</p>
<p>If your AJAX request sends the plaintext password, that’s a problem. It increases your attack surface.</p>
<p>Loading a JavaScript file can be heavy, so it’s better to load it asynchronously. However, even asynchronously, the file size (and therefore the number of compromised passwords it can check) is limited.</p>
<p>Naturally, since the client side is not secure, you must repeat the verification on the server side.</p>
<p>Another technique is to use the 
<a href="https://haveibeenpwned.com/" target="_blank">Have I Been Pwned</a> service.
It offers a technically elegant solution but, as it’s an Australian service using U.S.-based infrastructure,
it raises serious concerns about GDPR compliance in Europe (we’ll cover this in a future article).</p>
<p>This service works using k-anonymity.</p>
<p>You hash the user’s password and send only the first k characters of the hash to the service.
The service returns all hashes in its database that share those k starting characters.
You then compare them to the user’s password hash; if any matches, the password has been compromised.</p>
<p>Example:</p>
<p>The password “framboise” has this SHA256 hash:</p>
<p>“F9E4141EE43A3B877758E2584A1F6A0E7A9C8D6E58BB859A1665D8C1F447003C”</p>
<p>The first 5 characters are “F9E41.”</p>
<p>You send those 5 characters to 
<a href="https://haveibeenpwned.com/" target="_blank">Have I Been Pwned</a>.</p>
<p>It returns:</p>
<ul>
<li>“F9E4141EE43A3B8777ERT8584A1F6A0E7A9C8D6E58BB859A1665D8C1F447003C”</li>
<li>“F9E4141EE962758777ERT8584A1F6A0E7A9C8D6E58BB859A1665D8C1F447003C”</li>
<li>“F9E4141EE43A3B877758E2584A1F6A0E7A9C8D6E58BB859A1665D8C1F447003C”</li>
</ul>
<p>You compare and see that the third hash matches the user’s hash.
Therefore, the password is compromised.</p>
<p>With this system, no password is ever transmitted over the network, and 
<a href="https://haveibeenpwned.com/" target="_blank">Have I Been Pwned</a> never knows which password you’re testing.
In the example, three results were returned, but the smaller the k value, the more results you get.</p>
<h2 id="then-store-passwords-properly">Then Store Passwords Properly</h2>
<p>After the user has chosen a good password and securely submitted it, you must store it properly.</p>
<p>A fundamental rule: <strong>never store passwords in plain text.</strong>
If an attacker gains access to your password storage, you’ve handed them access to every account on your service, and possibly other services (users unfortunately often reuse passwords).</p>
<p>So, what should you do?</p>
<ol>
<li>
<p>First, limit password length, but not too much.
Drupal, for example, limits password length to 512 bytes, meaning between 128 and 512 UTF-8 characters.
This step is necessary to prevent a DoS attack because hashing consumes resources (an attacker could input an extremely long password to exhaust system resources during hashing).</p>
</li>
<li>
<p>Generate a random salt. A specific length string.

   <figure class="figure text-center">
     <img src="https://michee.io/en-us/posts/implementations-of-the-passphrase/images/table-salt.jpg" class="figure-img img-fluid rounded" alt="Table salt also called pepper">
     <figcaption class="figure-caption"><p>Table salt</p>
       <small>Table salt also called pepper</small>
     </figcaption>
   </figure>

You can generate a salt per database (for all passwords) or per password.
It’s added to the password to ensure identical passwords have different hashes.
Salts prevent hash comparisons, table-wide or row-wide, even if users choose the same password or reuse it across services.</p>
<p>Example:</p>
<p><strong>Table-level salt:</strong></p>
<p>Alice uses “framboise” on both “nice-raspberries-squashed.com” and “mean-raspberries-squashed.com”.</p>
<p>“nice-raspberries-squashed.com” generates salt “458,” making Alice’s password “458framboise.”</p>
<p>“mean-raspberries-squashed.com” generates salt “gdf,” making Alice’s password “gdfframboise.”</p>
<p>If a hacker accesses both tables, the hashes won’t match (since the salted passwords differ), so they won’t know Alice reused the same password.</p>
<p><strong>Row-level salt:</strong></p>
<p>Alice and Bob both use “framboise” on “nice-raspberries-squashed.com.”</p>
<p>The site generates salt “458” for Alice’s password → “458framboise.”</p>
<p>It generates salt “sdd” for Bob’s password → “sddframboise.”</p>
<p>If an attacker accesses the table, they won’t know Alice and Bob used the same password because their hashes are different.</p>
</li>
<li>
<p>Hash the combined salt + password using a secure algorithm like SHA512.</p>
<p>For password “framboise” with salt “458”:</p>
<p>hash(sha256, ‘458framboise’) = ‘527D88733ED03CE5EF2D12AE4279950ABC29DC42817B14A58AB2150678A7CC72486CE637B8AD10333E80879F3D0CE685FA6CBB5DB8D7954382C2116616F8F6CF’</p>
</li>
<li>
<p>You now have a reasonably secure stored password. Also store the salt.
To strengthen the hash further, you can iterate hashing with the previous hash and the password:</p>
<p>hash(sha256, ‘527D88733ED03CE5EF2D12AE4279950ABC29DC42817B14A58AB2150678A7CC72486CE637B8AD10333E80879F3D0CE685FA6CBB5DB8D7954382C2116616F8F6CF framboise’) = ‘E3A252D3C455D638C82D8430DDC85E9B5B13F6508D690D97E2C5A1CC8AEE4A26D4C723E4EE4F524B4926C0357B2651132DF67446721BB4D3BCDD017C4A0E0E1B’</p>
<p>The goal is to make the resulting hash different from any known hashes attackers might have, making password recovery harder.</p>
<p>When a user tries to log in again, your system repeats the process (using the stored salt) and compares the new hash to the stored one. If they match, the password is correct.</p>
</li>
</ol>
<h2 id="common-mistakes-to-avoid">Common Mistakes to Avoid</h2>
<p>Sometimes we make silly mistakes! Here are some to avoid:</p>
<ul>
<li>
<p>When changing the complexity threshold for accepted passwords, <strong>don’t</strong> apply it to old password fields.
Otherwise, users won’t be able to enter their old password to change it. Only apply the threshold to new password fields.</p>
</li>
<li>
<p>If you change your password storage method or complexity rules and need user action, <strong>notify them by email.</strong>
Don’t send password reset links with long expiration—users may click them months later, giving attackers time to exploit them.</p>
</li>
<li>
<p><strong>Never</strong> send a user’s password via email.
Emails are like postcards: anyone can read them.
And if you can email a password, it means you’re not storing it securely.</p>
</li>
<li>
<p>Provide meaningful error messages when users create passwords.
Use labels like “weak,” “strong,” or “very strong,” not entropy scores users won’t understand.</p>
</li>
<li>
<p>Ensure passwords are transmitted via HTTPS.
Ban HTTP completely.</p>
</li>
<li>
<p>For extra security, implement authentication chains, meaning two-factor authentication (e.g., with a smartphone token) in addition to a password.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>On git never store secrets</title>
      <link>https://michee.io/en-us/posts/on-git-never-store-secrets/</link>
      <pubDate>Fri, 30 Apr 2021 10:20:21 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/on-git-never-store-secrets/</guid>
      <description>I see a bad use in the git world.</description>
      <content:encoded><![CDATA[<p>Even if some projects encourage this behaviour.
Be clear on that point: storing secrets on git always is a bad idea.</p>
<h2 id="remote-git-flow-breaking">Remote git flow breaking</h2>
<p>If you store a secret on git, you are supposed to store it encrypted (obviously).</p>
<p>To do a versioning you simply use a <em>commit</em>.
As the encryption algorithm is non-deterministic (as it should be, it is not a hash),
you end up with a blob of encrypted data which is entirely different from the previous <em>commit</em>.
It makes impossible to do a compare and the full file is uploaded everytime.</p>
<p>Now, more funny. You want to do a <em>git merge</em> because 2 branches received separate updates on their secrets.
As you have to compare 2 entirely different encrypted files, what advantages can offer any <em>merge</em> strategy from git.
You definitely will end up screwing up your file and loose the contained secrets.</p>
<h2 id="local-git-flow-breaking">Local git flow breaking</h2>
<p>You could say &ldquo;this way I manage my secrets with the same flow as my code&rdquo;. And I shall answer &ldquo;Really ? Are you really sure on that ?&rdquo;</p>
<p>So let&rsquo;s have a look at your local flow, as I already explained that your remote flow is definitely dead.</p>
<ul>
<li>You pull the repo</li>
<li>You integrate it into your VSCode or your terminal or any other IDE</li>
<li>You change something on the code</li>
<li>You <em>commit</em></li>
<li>You pull and push</li>
</ul>
<p>Okay, now for the secrets.</p>
<ul>
<li>You pull the repo</li>
<li>You integrate it into your VSCode or your terminal or any other IDE</li>
<li>So far so good</li>
<li>Hopefully you installed the tool to decrypt your secrets file</li>
<li>You decrypt it (hoping the tool is integrated in your IDE)</li>
<li>You change something on it</li>
<li>You encrypt it with the same tool or another</li>
<li>You double-triple check that you did not leave the unencrypted file somewhere on your workspace</li>
<li>you <em>commit</em> with a drop on your forehead and a pain on your stomach</li>
<li>you pull</li>
<li>you try to figure out how to solve the conflict between your 2 blobs of encrypted file because a new <em>commit</em> on remote already altered the file</li>
<li>you <em>commit</em> again hoping you did not screw everything up</li>
<li>you push</li>
<li>you see afterwards that you <em>commit</em> the unencrypted file as well and secrets are now freely available on the <em>remote</em></li>
<li>you desperately try to reset screwing up the git flow for the whole team</li>
<li>you cry</li>
</ul>
<p>I&rsquo;m not sure it is the same git flow.</p>
<p>As conclusion, store your secrets in storages made for that. For instance, Hashicorp Vault on your infrastructure and keepassXC locally.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to fix the root flaw in MacOS High Sierra</title>
      <link>https://michee.io/en-us/posts/how-to-fix-the-root-flaw-in-macos-high-sierra/</link>
      <pubDate>Wed, 29 Nov 2017 11:46:22 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/how-to-fix-the-root-flaw-in-macos-high-sierra/</guid>
      <description>A turkish researcher found a flaw allowing the access to root account without password on MacOS High Sierra.</description>
      <content:encoded><![CDATA[<p>This flaw is critical because easily executable. It can be used locally or remotely if the device has an active VNC protocol (screen sharing activated).
This flaw grants access to all device&rsquo;s permissions. The attacker can do whatever he wants.</p>
<h3 id="attack-surface">Attack surface</h3>
<p>The access to the authentication panel to tape the administrator password is the only thing needed.
This panel is available from any account on the device (locally or remotely via VNC protocol).</p>
<p>The flaw comes from the mistakenly activated root account on MacOS High Sierra.
This root account is an inheritance of the UNIX system from which MacOS is developed.
It is present and used in the Linux world but normally is deactivated (available but deactivated) on Mac, replaced with administrator accounts that cannot access system files.</p>
<h3 id="how-to-protect-yourself">How to protect yourself</h3>
<p>You just need to set a password for this root account. Never loose this password.</p>
<h4 id="in-command-lines-from-whatever-administrator-account-on-the-device">In command lines from whatever administrator account on the device</h4>
<ul>
<li>Open the terminal. The application is available in the folder <code>Applications &gt; Utilities</code>.</li>
<li>Enter the following command line then press <code>Enter</code>: <code>sudo passwd -u root</code></li>
<li>A password will be asked, enter the password of your root account then press <code>Enter</code>.</li>
<li>Enter the same password to confirm and press <code>Enter</code> again.</li>
<li>Your root account is configured with a password.</li>
</ul>
<h4 id="with-the-graphic-interface">With the graphic interface</h4>
<ul>
<li>Go to the menu <code> &gt; System Preferences</code>.</li>
<li>Click Users &amp; Groups (or Accounts).</li>
<li>Click the padlock, then enter an administrator name and password.</li>
<li>Click Login Options.</li>
<li>Click Join (or Edit).</li>
<li>Click Open Directory Utility.</li>
<li>Click the padlock in the Directory Utility window, then enter an administrator name and password.</li>
<li>From the menu bar in Directory Utility, choose <code>Edit &gt; Change Root Password...</code></li>
<li>Enter a root password when prompted.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>SSL/TLS and HSTS, what is that ?</title>
      <link>https://michee.io/en-us/posts/ssltls-and-hsts-what-is-that/</link>
      <pubDate>Thu, 18 May 2017 13:07:01 +0000</pubDate>
      <guid>https://michee.io/en-us/posts/ssltls-and-hsts-what-is-that/</guid>
      <description>Our websites are made safe with https. That means that we use SSL/TLS. But what is that ? And what is the HSTS extension ?</description>
      <content:encoded><![CDATA[<h2 id="the-running-of-ssltls">The running of SSL/TLS</h2>
<p>SSL/TLS is a protocol that provides server identity verification (for instance a web server like 
<a href="https://limawi.io/en-us" target="_blank">Limawi</a>,
in that case we speak about https because the protocol to access a web server is called http).
This identity verification works with a certificate sent from the server.</p>
<p>Here is the protocol step by step (technical terms are present in the graphs):</p>
<ul>
<li>The client software asks the server its identity</li>
<li>The server sends a certificate signed by the certification authority trusted by both the client software and the server to the client software</li>
<li>The client software checks if the signature belongs to the certification authority it trusts</li>
<li>It sends a request to this certification authority to check if it ensures that the certificate is still valid</li>
<li>The client software and the server agree on a session key that will encrypt informations during a limited period (this time passed, another session key will take the place,
the details for 
<a href="https://limawi.io/en-us" target="_blank">Limawi</a> are explained in the graphs about the session key)</li>
<li>The client software and the server can communicate in a secure way</li>
</ul>
<div class="row">
<div class="col-lg-6 col-md-6">

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/ssltls-and-hsts-what-is-that/images/ssltls-identity-server-protocol.png" class="figure-img img-fluid rounded" alt="Diagram displaying the SSL/TLS identity flow">
  <figcaption class="figure-caption"><p>SSL/TLS identity server protocol with Let’s Encrypt</p>
    <small>Diagram displaying the SSL/TLS identity flow</small>
  </figcaption>
</figure>

</div>

<div class="col-lg-6 col-md-6">

<figure class="figure text-center">
  <img src="https://michee.io/en-us/posts/ssltls-and-hsts-what-is-that/images/ssltls-server-session-protocol.png" class="figure-img img-fluid rounded" alt="Diagram displaying the SSL/TLS session flow">
  <figcaption class="figure-caption"><p>SSL/TLS server session protocol with Let’s Encrypt</p>
    <small>Diagram displaying the SSL/TLS session flow</small>
  </figcaption>
</figure>

</div>

</div>

<h2 id="the-hsts-extension">The HSTS extension</h2>
<p>The HSTS extension is a http protocol extension (the protocol that loads webpages) reinforcing the SSL/TLS use.</p>
<p>This extension forces the browser to load secure versions of a webpage and all the ressources this page holds (that is to say https versions) in a domain (the base address of a website) that implements it.</p>
<p>If the wanted webpage does not have any secure version, it is not loaded on the browser.</p>
<p>Once the browser accesses a website implementing this extension it keeps in memory that the next webpages wanted on that website must be secured. It can check it even before sending the first request to the website.</p>
<p>A HSTS extension is valid for a limited period and the browser must check at the end of this time if the website always uses this extension to start another period.</p>
<p>Domains (base address of a website) can be preloaded in a database available in your browser.
That way the browser knows even before sending the first request of its history to a webpage that it must be secure otherwise it does not load it.</p>
<p>This base is available here: 
<a href="https://hstspreload.org/" target="_blank">HSTS Preload</a></p>
<h2 id="with-limawi">With Limawi</h2>
<p>With 
<a href="https://limawi.io/en-us" target="_blank">Limawi</a>, the certification authority is 
<a href="https://letsencrypt.org/" target="_blank">Let&rsquo;s Encrypt</a>.</p>
<p>The session key exchange between the client software and the server is done with the Diffie-Helman protocol
that creates a symmetrical session key without exchanging secret elements.</p>
<p>
<a href="https://limawi.io/en-us" target="_blank">Limawi</a> uses HSTS. The HSTS validity period is 6 months.</p>
<h2 id="references">References</h2>
<ul>
<li>SSL/TLS: 
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security" target="_blank">Wikipedia</a></li>
<li>HSTS: 
<a href="https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security" target="_blank">Wikipedia</a></li>
<li>Diffie-Helman: 
<a href="https://en.wikipedia.org/wiki/Diffie%e2%80%93Hellman_key_exchange" target="_blank">Wikipedia</a></li>
<li>Preloading for Limawi: 
<a href="https://hstspreload.org/?domain=limawi.io" target="_blank">HSTS Preload</a></li>
</ul>]]></content:encoded>
    </item>
  </channel>
</rss>
