<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" 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>
            <![CDATA[ passwords - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ passwords - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 14 Jun 2026 22:42:51 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/passwords/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ What Your Auth Library Isn't Telling You About Passwords: Hashing and Salting Explained ]]>
                </title>
                <description>
                    <![CDATA[ Before I started building auth into my own projects, I didn't think too deeply about what was happening to passwords behind the scenes. Like most developers, I installed a library, called a hash funct ]]>
                </description>
                <link>https://www.freecodecamp.org/news/passwords-hashing-and-salting-explained/</link>
                <guid isPermaLink="false">69b310eb93256dfc5303de72</guid>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Hashing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Salting ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Cryptography ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tilda Udufo ]]>
                </dc:creator>
                <pubDate>Thu, 12 Mar 2026 19:15:55 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/61e84941-bb32-4029-9d58-39022488d29e.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Before I started building auth into my own projects, I didn't think too deeply about what was happening to passwords behind the scenes.</p>
<p>Like most developers, I installed a library, called a hash function, stored the result, and moved on. I see a random string like <code>\(2a11yMMbLgN9uY6J3LhorfU9iu....</code> in my database and assume my user's passwords are unbreakable. I knew it was a hashed password. But what was the <code>\)2a</code>? What was <code>11</code>? And if I couldn't reverse it, how was my app verifying logins at all?</p>
<p>If you've ever used bcrypt, Devise, Django's auth system, or really any authentication library, you've been protected from these details. That's good engineering. But understanding what's actually happening makes you a better developer, and it explains a lot of things that seem confusing or arbitrary until suddenly they don't.</p>
<p>By the end of this article, you'll be able to look at that string and know exactly what every part means.</p>
<h2 id="heading-prerequisites">Prerequisites</h2>
<p>This article is written for developers who have used an auth library before but never looked closely at what it's doing. You don't need a cryptography background. If you've ever hashed a password and moved on, this is for you.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ol>
<li><p><a href="#heading-hashing-vs-encryption">Hashing vs Encryption</a></p>
</li>
<li><p><a href="#heading-why-a-plain-hash-isnt-enough">Why a Plain Hash Isn't Enough</a></p>
</li>
<li><p><a href="#heading-enter-salting">Enter Salting</a></p>
</li>
<li><p><a href="#heading-why-bcrypt-is-slow-and-why-thats-the-point">Why bcrypt Is Slow (and Why That's the Point)</a></p>
</li>
<li><p><a href="#heading-whats-actually-in-your-database">What's Actually in Your Database</a></p>
</li>
<li><p><a href="#heading-wrapping-up">Wrapping Up</a></p>
</li>
</ol>
<h2 id="heading-hashing-vs-encryption">Hashing vs Encryption</h2>
<p>Most developers use the terms <strong>hashing</strong> and <strong>encryption</strong> interchangeably. They're not the same thing, and the difference matters more than you might think.</p>
<p>Encryption is a two-way process. You take data, encrypt it with a key, and you can decrypt it later using that same key (or a related one). This is useful when you need to retrieve the original value. Storing a credit card number you'll need to charge later, or sending a message that the recipient needs to read.</p>
<p>Hashing is different. It's a one-way process. You put data in, you get a fixed-length string out, and there's no key that lets you reverse it. The original value is gone.</p>
<p>That might sound like a limitation. For passwords, it's actually exactly what you want.</p>
<p>Think about it: when a user logs in, you don't need to know their password. You just need to verify that what they typed matches what they set when they signed up. You can do that entirely with hashes. Hash what they typed, compare it to the stored hash, done. You never need the original.</p>
<p>This is why "forgot password" flows always ask you to set a new password rather than sending you your old one. Yes, sending you your old password over email might be risky but the actual reason is that they genuinely can't retrieve it. If they can email you your original password, that's a red flag. It means they stored it in a way that's reversible, which means it's not properly protected.</p>
<h2 id="heading-why-a-plain-hash-isnt-enough">Why a Plain Hash Isn't Enough</h2>
<p>So if hashing is one-way and irreversible, isn't that enough? Just hash every password before storing it and you're done?</p>
<p>Not quite.</p>
<p>The first problem is <strong>rainbow tables</strong>. A <a href="https://en.wikipedia.org/wiki/Rainbow_table">rainbow table</a> is a precomputed database of hashes for common passwords. An attacker who gets hold of your database doesn't need to reverse the hashes. They just look them up. If your user's password is "password123", its <a href="https://en.wikipedia.org/wiki/SHA-2">SHA-256</a> hash is always the same string, and that string is almost certainly already in a rainbow table somewhere.</p>
<p>The second problem is related. If two users have the same password, they'll have the same hash. So if an attacker cracks one, they've cracked all of them. In a database with thousands of users, that's a significant security risk.</p>
<p>Here's what that looks like in practice:</p>
<pre><code class="language-python">import hashlib

# Two users, same password
password = "password123"

hash_one = hashlib.sha256(password.encode()).hexdigest()
hash_two = hashlib.sha256(password.encode()).hexdigest()

print(hash_one == hash_two)  # True, every single time
</code></pre>
<p>The hash is deterministic. The same input always produces the same output. That's useful for a lot of things, but for passwords it creates a real vulnerability.</p>
<p>A plain hash gets you partway there. But it's not enough on its own.</p>
<h2 id="heading-enter-salting">Enter Salting</h2>
<p>The fix for both problems is something called a <strong>salt</strong>. And, no it's not your regular table salt.</p>
<p>A salt is a random string generated uniquely for each password. Before hashing, you combine the salt with the password, then hash the result.</p>
<pre><code class="language-python">import hashlib
import os

password = "password123"

# Generate a random salt
salt = os.urandom(16).hex()

# Combine salt and password, then hash
salted_password = salt + password
hashed = hashlib.sha256(salted_password.encode()).hexdigest()

print(f"Salt: {salt}")
print(f"Hash: {hashed}")
</code></pre>
<p>Now two users with the same password produce completely different hashes, because their salts are different. And because the salt is random and unique, it can't be precomputed into a rainbow table.</p>
<p>Here's the surprising part: <strong>the salt doesn't need to be secret</strong>. It gets stored alongside the hash in your database, in plain text. That might feel wrong at first. If an attacker has your database, they have the salt too.</p>
<p>But that's fine. The salt's job isn't to be secret. Its job is to make each hash unique so that precomputed tables are useless. An attacker who wants to crack a salted hash has to brute force each password individually, from scratch, using that specific salt. They can't reuse work across users.</p>
<p>That's a meaningful increase in the cost of an attack, even when the salt is visible.</p>
<h2 id="heading-why-bcrypt-is-slow-and-why-thats-the-point">Why bcrypt Is Slow (and Why That's the Point)</h2>
<p>Salting solves the rainbow table problem. But there's still a gap. If an attacker has your database and decides to brute force a password, they can just keep guessing. Hash a candidate password with the stored salt, compare it to the stored hash, repeat. With a fast hashing algorithm like SHA-256, a modern GPU can do billions of these comparisons per second.</p>
<p>That's the problem with using a general-purpose hash function for passwords. Algorithms like SHA-256 and MD5 were designed to be fast. That's great for things like verifying file integrity or generating checksums. For passwords, it's a liability.</p>
<p>This is where bcrypt comes in. <a href="https://en.wikipedia.org/wiki/Bcrypt">bcrypt</a> is a password hashing algorithm designed specifically to be slow. Not broken or inefficient by accident, but deliberately, configured-to-be slow. It has a <strong>cost factor</strong> (sometimes called a work factor) that controls how computationally expensive the hashing operation is.</p>
<pre><code class="language-python">import bcrypt

password = b"password123"

# The cost factor is set here (12 is a common production value)
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))

print(hashed)
</code></pre>
<p>Every time you increase the cost factor by 1, the hashing operation takes roughly twice as long. At a cost factor of 12, a single hash might take around 300 milliseconds on your server. That's imperceptible to a user logging in. But for an attacker trying to brute force millions of passwords, it turns a feasible attack into an impractical one.</p>
<p>The other advantage of a configurable cost factor is that you can increase it over time as hardware gets faster. What was slow enough in 2015 might not be slow enough today. bcrypt lets you adapt without changing the algorithm itself.</p>
<h2 id="heading-whats-actually-in-your-database">What's Actually in Your Database</h2>
<p>So far, we've talked about salting and cost factors as separate concepts. Here's the satisfying part: in bcrypt, they're all stored together in a single string. That string sitting in your database contains everything needed to verify a password, and once you know how to read it, it's not mysterious at all.</p>
<p>Here's a typical bcrypt hash:</p>
<pre><code class="language-plaintext">\(2a\)12$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO
</code></pre>
<p>Let's break it down:</p>
<ul>
<li><p><code>$2a</code> — the <strong>algorithm version</strong>. This tells your auth library which version of bcrypt was used to generate the hash.</p>
</li>
<li><p><code>$12</code> — the <strong>cost factor</strong>. This is the number we talked about in the previous section. A cost factor of 12 means the hashing operation was run 2¹² times.</p>
</li>
<li><p><code>\(yMMbLgN9uY6J3LhorfU9iu</code> — the <strong>salt</strong>. The first 22 characters after the final <code>\)</code> are the salt, stored right there in plain text alongside the hash. Your auth library reads this back out when verifying a login.</p>
</li>
<li><p><code>LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO</code> — the <strong>hash</strong> itself. The remaining characters are the actual output of the hashing operation.</p>
</li>
</ul>
<p>When a user logs in, your auth library doesn't need any extra information. It reads the algorithm version, cost factor, and salt directly from the stored string, hashes the login attempt using those same parameters, and compares the result. If they match, the password is correct.</p>
<p>This is why bcrypt verification works even though the salt is never stored separately. It was never separate to begin with.</p>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>Next time you see a bcrypt string in your database, you'll know exactly what you're looking at. The algorithm version, the cost factor, the salt, and the hash, all encoded in a single string that your auth library knows how to read.</p>
<p>But the bigger takeaway is this: the libraries we rely on every day aren't magic. They're carefully designed systems built on top of concepts that are worth understanding.</p>
<p>Knowing why bcrypt is slow, why salting works even when the salt is visible, and why fast hash functions like SHA-256 are the wrong tool for passwords makes you a more intentional developer. You'll make better decisions about cost factors, you'll recognise a poorly implemented auth system when you see one, and you'll understand why a data breach where passwords were hashed with MD5 is so much worse than one where bcrypt was used.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is WebAuthn? How to Authenticate Users Without a Password ]]>
                </title>
                <description>
                    <![CDATA[ Most of us are used to logging into different accounts using a password. For years this has been the norm. But passwords face a number of security issues: They are extremely annoying when we don’t remember them and even harder to reset They can be q... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/intro-to-webauthn/</link>
                <guid isPermaLink="false">66bb4589cd114247c2941f36</guid>
                
                    <category>
                        <![CDATA[ authentication ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rohit Jacob Mathew ]]>
                </dc:creator>
                <pubDate>Wed, 20 Apr 2022 23:45:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/04/webauthn.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Most of us are used to logging into different accounts using a password. For years this has been the norm. But passwords face a number of security issues:</p>
<ul>
<li>They are extremely annoying when we don’t remember them and even harder to reset</li>
<li>They can be quite insecure with the most common password being <code>password</code> or <code>123456</code></li>
<li>Phishing attacks are commonplace in today’s internet era, and using this technique hackers can steal your passwords</li>
</ul>
<p>Would it not be simpler to move towards a more passwordless login? A place where we don’t have to remember or have to enter passwords to gain access to our accounts? One such passwordless solution is WebAuthn.</p>
<h2 id="heading-what-is-webauthn">What is WebAuthn? 😅</h2>
<p>The Web Authentication API (also known as WebAuthn) is an API that enables strong authentication with public-key cryptography. It lets you implement passwordless authentication and/or secure second-factor authentication without SMS texts.</p>
<p>Let’s break that down to quickly understand the parts:</p>
<ul>
<li><strong>Public Key Cryptography</strong> — So we use a key-based authentication (public and private key) to login and not a password. If you are not sure how it works I suggest watching this <a target="_blank" href="https://youtu.be/6-JjHa-qLPk?t=277">video</a>.</li>
<li><strong>Passwordless Authentication</strong> — In this type of authentication we will not be using a password to login but will use some form of user interaction to verify and login. This uses a hardware authenticator like a fingerprint sensor on your device or a YubiKey.</li>
<li><strong>Secure Second-Factor Authentication Without SMS Texts</strong> — Two-Factor Authentication today is predominantly driven by SMS-based OTP, but these are also susceptible to SIM swap. SIM swap is essentially taking control of someone’s phone number, and tricking a carrier into transferring it to a new phone. A two-factor authentication scenario-driven through a hardware authenticator using WebAuthn would be a safer solution to the above problem.</li>
</ul>
<p>WebAuthn is a specification written by the <a target="_blank" href="https://www.w3.org/">W3C</a> and <a target="_blank" href="https://fidoalliance.org/">FIDO</a>, with the participation of Google, Mozilla, Microsoft, Yubico, and others. </p>
<p>Web Authentication works hand in hand with other industry standards such as <a target="_blank" href="https://www.w3.org/TR/credential-management-1/">Credential Management Level 1</a> and <a target="_blank" href="https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html">FIDO 2.0 Client to Authenticator Protocol 2</a>.</p>
<h2 id="heading-how-does-webauthn-work">How Does WebAuthn Work? 🤔</h2>
<p>So like every other login situation:</p>
<ul>
<li>A user would be prompted for a username to identify them.</li>
<li>The browser would then prompt the user to use their hardware authenticator and verify themselves.</li>
<li>On successful authentication, they would be logged into the system.</li>
</ul>
<p>Now what we don’t often see is what goes on in the background to facilitate this process. Let me explain a little more.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/webauthn_flow_diagram.png" alt="Image" width="600" height="400" loading="lazy">
<em>Generic WebAuthn Flow</em></p>
<h3 id="heading-registration-flow">Registration Flow</h3>
<p>In this process, a new set of key credentials are created against the username entered by the user. This key credential is the crux of the process which enables us to make sure this authentication is in a passwordless manner.</p>
<p>There is a simple 8 step process that takes place:</p>
<ol>
<li>A user clicks on the register button on a site on their browser (user agent).</li>
<li>The authenticating server (relying party) issues a challenge (a random set of data sent as an array) to the user’s browser to be able to enable WebAuthn login.</li>
<li>The browser sends this challenge to the authenticator device.</li>
<li>The authenticator device then prompts the user to authenticate themselves. This would be different based on the device, for example   Touch ID on a Macbook or touching a YubiKey.</li>
<li>Once the user authorizes the authenticator device, the authenticator will then create a new key pair (a public and private key) and will then use the private key to sign the challenge.</li>
<li>The authenticator device will then return the signed challenge, the public key as well as details pertaining to the process, back to the authenticating server.</li>
<li>The authenticating server will then confirm the authenticity of the private key by using the public key to ensure the challenge was signed by the private key.</li>
<li>It will then store the received details against the username for future use and respond that the user is registered.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/Registration.png" alt="Image" width="600" height="400" loading="lazy">
<em>Registration Flow</em></p>
<h3 id="heading-the-webauthn-authentication-flow">The WebAuthn Authentication Flow</h3>
<p>Authentication is a similar process where the above-generated credentials are used to verify the user’s identity by going through a signed challenge process again.</p>
<p>There is a simple 8 step process that takes place:</p>
<ol>
<li>A user clicks on the login button on a site on their browser (user agent) and enters their username.</li>
<li>The authenticating server (relying party) issues a challenge (a random set of data sent as an array) to the user’s browser along with the saved private key ID registered with the username.</li>
<li>The browser sends this challenge &amp; private key ID to the authenticator device.</li>
<li>The authenticator device then prompts the user to authenticate themselves. This would be different based on the device (again,  Touch ID on a Macbook or touching a YubiKey).</li>
<li>Once the user authorizes the authenticator device, the authenticator will then retrieve the generated key pair saved on it with the provided private key ID. It will then use the private key to sign the challenge.</li>
<li>The authenticator device will then return the signed challenge as well as details pertaining to the process back to the authenticating server.</li>
<li>The authenticating server will then confirm the authenticity of the private key by using its saved public key to ensure the challenge was signed by the private key.</li>
<li>It will then log the user in.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/Login.png" alt="Image" width="600" height="400" loading="lazy">
<em>Authentication Flow</em></p>
<h2 id="heading-benefits-of-webauthn">Benefits of WebAuthn</h2>
<p>That sounds awesome, right? 😮 Absolutely. Let’s quickly see some of the benefits:</p>
<ul>
<li><strong>Private/Public Key Based Authentication</strong> — It’s a more secure way to authenticate users compared to the current norm of password-based authentication as it uses asymmetric cryptography by default.</li>
<li><strong>Phishing Resistant</strong> — WebAuthn is resistant to phishing attacks due to the domain name being stored on the authenticator. This makes it harder for hackers to be able to spoof websites and gain access to credentials.</li>
<li><strong>Store Public Data in Your DB</strong> — Only public data is stored in the DB. No sensitive data such as passwords are required to be stored in this flow.</li>
<li><strong>Fine-Grained Control</strong> — You can control what sort of user interaction you want as a part of the flow, for example a specific hardware device.</li>
<li><strong>Better UX</strong> — A user won’t need to remember any passwords or such and will only need to use a hardware authenticator to be able to login to the device.</li>
<li><strong>W3C Recommendation</strong> — This means it should be supported by all major browsers across devices.</li>
</ul>
<p>and lastly <strong>NO MORE PASSWORDS.</strong></p>
<h3 id="heading-disadvantages-of-webauthn">Disadvantages of WebAuthn</h3>
<p>All that being said, it does have some issues which are still to be solved:</p>
<ul>
<li><strong>User Credential Management</strong> — The user experience with respect to credential management is still in a very primitive state.</li>
<li><strong>Cross-Device Credentials</strong> — Being able to pass credentials from one device to another is not very easy unless you use a roaming hardware authenticator like a YubiKey.</li>
<li><strong>Lost/Stolen Authenticator Device Recovery</strong> — In case you don’t have access or lose your roaming hardware authenticator, the fallback scenario is generally a password to gain access to an account but would need to be explicitly setup.</li>
<li><strong>WebAuthn Might Replace Passwords</strong> — WebAuthn is still in a very early phase and is slowly being adopted and supported. It might replace password-based login in the future but it might be a while before we see that happening.</li>
</ul>
<p>Note — this doesn’t replace things like token-based authentication flows like OAuth or OIDC or identity providers like Auth0, Okta, Google, and others.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>WebAuthn is a much more secure authentication flow than simply using a password. It is phishing resistant and only stores public data on a database with most private data generally stored on the hardware authenticator only. </p>
<p>It makes use of asymmetric cryptography to do a user check and provides a much better UX compared to the existing login flow.</p>
<p>Currently, WebAuthn is majorly being driven as a two-factor authentication or universal 2nd factor workflow. But it could possibly replace password-based login in the future.</p>
<p>Hopefully, this article helps you understand what WebAuthn is and how it works.</p>
<p>Thanks for reading! I really hope that you find this article useful. I’m always interested to know your thoughts and happy to answer any questions you might have in your mind. If you think this post was useful, please share it so others can see it, too.</p>
<p>Also, do feel free to connect with me on <a target="_blank" href="https://www.linkedin.com/in/rohitjmathew">LinkedIn</a> or <a target="_blank" href="https://twitter.com/iamrohitjmathew">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Password Protect a Zip File [Windows 10 PC Guide] ]]>
                </title>
                <description>
                    <![CDATA[ Zip files often contain multiple large files, so you might want to encrypt them or protect them with a password. That way, only certain people will have access to it. In this guide, I will show you a great way to password protect a zip file, so you c... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/password-protect-zip-file-windows10/</link>
                <guid isPermaLink="false">66adf1b6f452caf50fb1fe0b</guid>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows 10 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kolade Chris ]]>
                </dc:creator>
                <pubDate>Wed, 03 Nov 2021 15:49:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/11/zip.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Zip files often contain multiple large files, so you might want to encrypt them or protect them with a password. That way, only certain people will have access to it.</p>
<p>In this guide, I will show you a great way to password protect a zip file, so you can be rest assured only those who should see it have access to it.</p>
<h2 id="heading-first-what-is-a-zip-file">First, What is a Zip File?</h2>
<p>A zip file, also called a zip folder, helps you compress multiple files into one giant file. This lets you easily save them in one file, or send them across to anyone you want in one go. Zip files have .zip as their extension.</p>
<p>In addition to being able to squeeze down multiple files into one, you also get the advantage of reduced file size and being able to protect the zip file with a password.</p>
<h2 id="heading-how-to-password-protect-a-zip-file-on-windows-10">How to Password Protect a Zip File on Windows 10</h2>
<p>Windows 10 only offers a way to encrypt a zip file, not password protect it. So, to password protect a zip file on Windows 10, you need a third-party app that runs on Windows. An example of such a third-party app is WinRAR.</p>
<h3 id="heading-how-to-password-protect-a-zip-file-with-winrar">How to Password Protect a Zip File with WinRAR</h3>
<p><strong>Step 1</strong>: The first thing you need to do is download WinRAR from its official website. 
<img src="https://www.freecodecamp.org/news/content/images/2021/11/dowwnloadd-winRAR.png" alt="dowwnloadd-winRAR" width="600" height="400" loading="lazy"></p>
<p>When you download the installer (usually with a .exe extension), open it up and follow the installation wizard to install WinRAR.</p>
<p><strong>Step 2</strong>: Open the Zip file with WinRAR
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-1-2.jpg" alt="ss-1-2" width="600" height="400" loading="lazy"></p>
<p><strong>Step 3</strong>: From the menu items, select "Tools" and choose "Convert archives". You can also press <code>Alt</code> + <code>Q</code> on your keyboard to quickly do this.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-2-2.jpg" alt="ss-2-2" width="600" height="400" loading="lazy"></p>
<p><strong>Step 4</strong>: Click on the "Compression..." button from the pop-up that appears.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-3-2.jpg" alt="ss-3-2" width="600" height="400" loading="lazy"></p>
<p><strong>Step 5</strong>: Click on "Set Password..." in the next pop-up that appears.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-4-2.jpg" alt="ss-4-2" width="600" height="400" loading="lazy"></p>
<p><strong>Step 6</strong>: Input the password of your choice in the "Enter password" field, and confirm it in the "Reenter password for verification" field and click “Ok”.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-5-2.jpg" alt="ss-5-2" width="600" height="400" loading="lazy"></p>
<p><strong>Step 7</strong>: Click “Ok” again. A pop-up will appear asking if you want to encrypt converted archives. Click on Yes.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-6-1.jpg" alt="ss-6-1" width="600" height="400" loading="lazy"></p>
<p><strong>Step 8</strong>: Click “Ok” once again. WinRAR will now go through the process of protecting your zip file with the set password. The larger the file, the longer it takes. </p>
<p>After it's done, click on the Close button and that's all.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-7.png" alt="ss-7" width="600" height="400" loading="lazy"></p>
<p>You will now have a separate zip file with the <code>.rar</code> extension. This is the one that will be protected with a password.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-8.jpg" alt="ss-8" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-password-protect-a-zip-file-with-7-zip">How to Password Protect a Zip File with 7-Zip</h3>
<p>Another third-party app for protecting your zip files with passwords is 7-Zip.</p>
<p>Go through the steps below to password protect your zip files with 7-Zip.</p>
<p><strong>Step 1</strong>: Download the 7-Zip app from their website and install it.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/downlooad-7-zip.png" alt="downlooad-7-zip" width="600" height="400" loading="lazy"></p>
<p><strong>Step 2</strong>: Right-click on the folder you want to zip and hover over the 7-Zip option. In the menu that appears while you're hovering, select "Add to archive".
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-9.png" alt="ss-9" width="600" height="400" loading="lazy"></p>
<p><strong>Step 4</strong>: In the "Encryption" section, enter your desired password in the "Enter password" field and confirm it in the "Reenter password" field.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-10.jpg" alt="ss-10" width="600" height="400" loading="lazy"></p>
<p><strong>Step 5</strong>: Click on "Ok" to finally create the zip file and protect it with a password.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Since you can compress multiple files into one giant zip folder, you might need to protect it with a password. This makes sure that only those who have access can open the zip file.</p>
<p>I hope this guide helps you password protect your zip files. If you find it helpful, please share with your friends and family.</p>
<p>Thank you for reading.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Password Definition ]]>
                </title>
                <description>
                    <![CDATA[ A password is a secret set or characters and numbers to something like a computer or website. Passwords are often paired with usernames or email addresses to identify specific users. For good security, your passwords should be long, difficult to gues... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/password-definition/</link>
                <guid isPermaLink="false">66c35c7971e87702d4e5b722</guid>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Tech Terms ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 08 Apr 2021 04:51:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/6077c5fb776bd507fe31fed0.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A password is a secret set or characters and numbers to something like a computer or website.</p>
<p>Passwords are often paired with usernames or email addresses to identify specific users.</p>
<p>For good security, your passwords should be long, difficult to guess, but easy for you to remember. Your passwords should also be unique to each account or website. That way, if one of your passwords is leaked, all your other passwords are still secure.</p>
<p>Because it's very difficult to create and remember secure, unique passwords, it's recommended to use a password manager. Popular password managers include Bitwarden, 1Password, and LastPass.</p>
<p>You an read more about password managers and online security <a target="_blank" href="https://www.freecodecamp.org/news/outsourcing-security-with-1password-authy-and-privacy-com/">here</a>.</p>
<h2 id="heading-related-tech-terms">Related Tech Terms:</h2>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/username-definition/">Username Definition</a></li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Login Without a Password – How to Go Password-less with .NET Identity ]]>
                </title>
                <description>
                    <![CDATA[ By Arjav Dave There are tons of new apps launching every day, so you'll want to make yours stand out. It should have unique features, and it should be easy and convenient to use. One of the major pain points for many apps is that they require a usern... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-go-passwordless-with-dotnet-identity/</link>
                <guid isPermaLink="false">66d84de6e86088251dd27bb1</guid>
                
                    <category>
                        <![CDATA[ api ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 07 Apr 2021 16:58:03 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/04/Screenshot-2021-04-02-at-6.59.47-PM.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Arjav Dave</p>
<p>There are tons of new apps launching every day, so you'll want to make yours stand out. It should have unique features, and it should be easy and convenient to use.</p>
<p>One of the major pain points for many apps is that they require a username and a password to login. I personally have to remember 10-15 passwords for apps like Gmail, Facebook, Instagram, and more. You get the idea.</p>
<p>In this article we are going to create a solution for your APIs that will allow your users to login without a password.</p>
<h2 id="heading-how-to-go-password-less">How to go password-less</h2>
<p>In order to omit the need for a password, your app should generate some type of token for the user.</p>
<p>This token then gets sent to the user where only they can access it – for example in their email or via their phone. Here is an overview of the flow.</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/njjypscirkr5stsiqexu.png" alt="No Password Login Flow" width="1200" height="685" loading="lazy"></p>
<p>.NET Identity is a <a target="_blank" href="https://www.nuget.org/packages/Microsoft.AspNetCore.Identity/">package</a> which provides ways to manage users, passwords, profile data, roles, claims, tokens, and more. </p>
<p>In addition, Identity provides ways to generate tokens for email confirmation or for changing the user's email or phone. We will be using the tokens generated by Identity to verify our users.</p>
<p>There are two main token providers available:</p>
<ul>
<li><code>TotpSecurityStampBasedTokenProvider</code> (Time-based One Time Password).</li>
<li><code>DataProtectionTokenProvider</code></li>
</ul>
<h3 id="heading-totpsecuritystampbasedtokenprovider">TotpSecurityStampBasedTokenProvider</h3>
<p>This token provider generates time-based tokens which are valid for around 3 minutes (you can reference the <a target="_blank" href="https://github.com/aspnet/AspNetIdentity/blob/b7826741279450c58b230ece98bd04b4815beabf/src/Microsoft.AspNet.Identity.Core/Rfc6238AuthenticationService.cs#L75">source code here</a>). Based on the token provider, the tokens are generated from the email, phone number, or user id as well as the user's security stamp.</p>
<p>Dotnet Identity provides the utility classes <code>EmailTokenProvider</code> and <code>PhoneNumberTokenProvider</code> that are subclasses of <code>TotpSecurityStampBasedTokenProvider</code>.</p>
<h3 id="heading-dataprotectortokenprovider">DataProtectorTokenProvider</h3>
<p>If you want to generate a token that doesn't expire for a long time, <code>DataProtectorTokenProvider</code> is the way to go.</p>
<p><code>DataProtectorTokenProvider</code> generates tokens using a <code>DataProtector</code> and cryptographic algorithms. You can check out the implementation for more details <a target="_blank" href="https://github.com/aspnet/AspNetIdentity/blob/main/src/Microsoft.AspNet.Identity.Owin/DataProtectorTokenProvider.cs">here</a>.</p>
<p>In this article we are going to subclass <code>DataProtectorTokenProvider</code> so that our token is valid for 10 minutes.</p>
<h2 id="heading-how-to-set-up-identity">How to Set Up Identity</h2>
<p>Let's start with a new project. Create a project by executing the command <strong><code>dotnet new webapi –-name NoPasswordProject</code></strong>.</p>
<pre><code>dotnet add package Microsoft.EntityFrameworkCore.InMemory --version <span class="hljs-number">5.0</span><span class="hljs-number">.4</span>
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version <span class="hljs-number">5.0</span><span class="hljs-number">.4</span>
</code></pre><p>We are going to create an in-memory database for this tutorial. But you can use a database of your choice and accordingly change the package above.</p>
<p>Note: The in memory database will clear the users every time the server restarts.</p>
<h2 id="heading-how-to-create-a-custom-token-provider">How to Create a Custom Token Provider</h2>
<p>Let's create a custom token provider that generates tokens that are valid for 10 minutes.</p>
<h3 id="heading-nptokenprovider">NPTokenProvider</h3>
<p>Create a new file called <code>NPTokenProvider.cs</code>. The NP prefix stands for No Password.</p>
<pre><code>using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NPTokenProvider</span>&lt;<span class="hljs-title">TUser</span>&gt; : <span class="hljs-title">DataProtectorTokenProvider</span>&lt;<span class="hljs-title">TUser</span>&gt;
<span class="hljs-title">where</span> <span class="hljs-title">TUser</span> : <span class="hljs-title">IdentityUser</span>
</span>{
    public NPTokenProvider(
        IDataProtectionProvider dataProtectionProvider,
        IOptions&lt;NPTokenProviderOptions&gt; options, ILogger&lt;NPTokenProvider&lt;TUser&gt;&gt; logger)
        : base(dataProtectionProvider, options, logger)
    { }
}
</code></pre><p>Here we're subclassing the <code>DataProtectorTokenProvider</code>. Nothing out of the ordinary, except in the constructor we are passing <code>NPTokenProviderOptions</code>. The options need to be subclasses of <code>DataProtectionTokenProviderOptions</code>.</p>
<h3 id="heading-nptokenprovideroptions">NPTokenProviderOptions</h3>
<p>Create a new file called <code>NPTokenProviderOptions.cs</code> and paste in the below code.</p>
<pre><code>using System;
using Microsoft.AspNetCore.Identity;

public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NPTokenProviderOptions</span> : <span class="hljs-title">DataProtectionTokenProviderOptions</span>
</span>{
    public NPTokenProviderOptions()
    {
        Name = <span class="hljs-string">"NPTokenProvider"</span>;
        TokenLifespan = TimeSpan.FromMinutes(<span class="hljs-number">10</span>);
    }
}
</code></pre><p>We are setting options for the tokens to be created. You can change the <code>Name</code> and <code>TokenLifeSpan</code> to your liking.</p>
<h3 id="heading-dbcontext">DbContext</h3>
<p>Almost every project needs a database to store its users and other data related to the project. The Dotnet EF Framework provides a nice helper <code>DbContext</code> to handle sessions with the database and query and save entities. </p>
<p>So create a subclass of <code>IdentityDbContext</code> which is in turn a subclass of <code>DbContext</code>. Name the file <code>NPDataContext.cs</code>.</p>
<pre><code>using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NPDataContext</span> : <span class="hljs-title">IdentityDbContext</span>
</span>{
    public NPDataContext(DbContextOptions&lt;NPDataContext&gt; options)
        : base(options)
    { }
}
</code></pre><h3 id="heading-startupcs">Startup.cs</h3>
<p>We have created the classes. Now it's time to configure them in our <code>Startup.cs</code> files. In <code>ConfigureServices</code> add the below code at the start.</p>
<pre><code><span class="hljs-keyword">var</span> builder = services
.AddIdentityCore&lt;IdentityUser&gt;()
.AddEntityFrameworkStores&lt;NPDataContext&gt;();

<span class="hljs-keyword">var</span> UserType = builder.UserType;
<span class="hljs-keyword">var</span> provider = <span class="hljs-keyword">typeof</span>(NPTokenProvider&lt;&gt;).MakeGenericType(UserType);
builder.AddTokenProvider(<span class="hljs-string">"NPTokenProvider"</span>, provider);

services.AddDbContext&lt;NPDataContext&gt;(<span class="hljs-function"><span class="hljs-params">options</span> =&gt;</span>
    options.UseInMemoryDatabase(Guid.NewGuid().ToString()));

services.AddAuthentication(<span class="hljs-function"><span class="hljs-params">options</span> =&gt;</span>
{
    options.DefaultScheme = IdentityConstants.ExternalScheme;
});
</code></pre><p>Also add <strong><code>app.UseAuthentication();</code></strong> above <code>app.UseAuthorization();</code> in the <code>Configure</code> method.</p>
<h3 id="heading-nopasswordcontrollercs">NoPasswordController.cs</h3>
<p>Let's create a controller for our login and verify the APIs. Create a <code>NoPasswordController.cs</code> file in your <code>Controllers</code> folder. Add the below content to the file.</p>
<pre><code>using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;

namespace NoPasswordProject.Controllers
{
    [ApiController]
    [Route(<span class="hljs-string">"[controller]/[action]"</span>)]
    public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NoPasswordController</span> : <span class="hljs-title">ControllerBase</span>
    </span>{
        private readonly UserManager&lt;IdentityUser&gt; _userManager;

        public NoPasswordController(UserManager&lt;IdentityUser&gt; userManager)
        {
            _userManager = userManager;
        }
    }
}
</code></pre><p>We are injecting an instance of <code>UserManager</code> in our controller. UserManager is used for CRUD operations for a user as well as generating tokens and validating them.</p>
<h3 id="heading-login-api">Login API</h3>
<p>Let's add a <code>Login</code> API which accepts an Email as input. The Email is the unique identifier for a user, that is there should be a one-to-one relationship between user and email.</p>
<p>Create a new function in your controller as below.</p>
<pre><code>[HttpGet]
public <span class="hljs-keyword">async</span> Task&lt;ActionResult&lt;<span class="hljs-built_in">String</span>&gt;&gt; Login([FromQuery] string Email)
{
    <span class="hljs-comment">// Create or Fetch your user from the database</span>
    <span class="hljs-keyword">var</span> User = <span class="hljs-keyword">await</span> _userManager.FindByNameAsync(Email);
    <span class="hljs-keyword">if</span> (User == <span class="hljs-literal">null</span>)
    {
        User = <span class="hljs-keyword">new</span> IdentityUser();
        User.Email = Email;
        User.UserName = Email;
        <span class="hljs-keyword">var</span> IdentityResult = <span class="hljs-keyword">await</span> _userManager.CreateAsync(User);
        <span class="hljs-keyword">if</span> (IdentityResult.Succeeded == <span class="hljs-literal">false</span>)
        {
            <span class="hljs-keyword">return</span> BadRequest();
        }
    }

    <span class="hljs-keyword">var</span> Token = <span class="hljs-keyword">await</span> _userManager.GenerateUserTokenAsync(User, <span class="hljs-string">"NPTokenProvider"</span>, <span class="hljs-string">"nopassword-for-the-win"</span>);

    <span class="hljs-comment">// DON'T RETURN THE TOKEN.</span>
    <span class="hljs-comment">// SEND IT TO THE USER VIA EMAIL.</span>
    <span class="hljs-keyword">return</span> NoContent();
}
</code></pre><p>Here we are fetching a User from the database. If the user doesn't exist then we create a user. Make sure to set the UserName as well or it will give a runtime error.</p>
<p>Then based on the user, we generate a <code>UserToken</code>. The <code>GenerateUserTokenAsync</code> takes the user, token provider, and the purpose for generating a token.</p>
<p>The token provider string should be the one you have used in <code>NPTokenProviderOptions</code>. The purpose can be anything you want.</p>
<p>Send out the token to the user via a link in a nicely designed email. When the user clicks on the link in the email it will open your front-end page. Consequently this page will request the Verify API.</p>
<h3 id="heading-verify-api">Verify API</h3>
<p>Let's add another API called <code>Verify</code> that takes the <code>Email</code> and <code>Token</code> as query parameters.</p>
<pre><code>[HttpGet]
public <span class="hljs-keyword">async</span> Task&lt;ActionResult&lt;<span class="hljs-built_in">String</span>&gt;&gt; Verify([FromQuery] string Token, [FromQuery] string Email)
{
    <span class="hljs-comment">// Fetch your user from the database</span>
    <span class="hljs-keyword">var</span> User = <span class="hljs-keyword">await</span> _userManager.FindByNameAsync(Email);
    <span class="hljs-keyword">if</span> (User == <span class="hljs-literal">null</span>)
    {
        <span class="hljs-keyword">return</span> NotFound();
    }

    <span class="hljs-keyword">var</span> IsValid = <span class="hljs-keyword">await</span> _userManager.VerifyUserTokenAsync(User, <span class="hljs-string">"NPTokenProvider"</span>, <span class="hljs-string">"nopassword-for-the-win"</span>, Token);
    <span class="hljs-keyword">if</span> (IsValid)
    {
        <span class="hljs-comment">// <span class="hljs-doctag">TODO:</span> Generate a bearer token</span>
        <span class="hljs-keyword">var</span> BearerToken = <span class="hljs-string">""</span>;
        <span class="hljs-keyword">return</span> BearerToken;
    }
    <span class="hljs-keyword">return</span> Unauthorized();
}
</code></pre><p>We are again fetching the user based on email. As a result, if we are not able to find the user we'll return 404 Not Found.</p>
<p>We then continue to verify the user. <code>VerifyUserTokenAsync</code> takes user, token provider, purpose, and token as input parameters. The purpose should be the same as the one used while generating the token.</p>
<p>If the token is not valid, return 401 Unauthorised. Otherwise return the bearer token. <a target="_blank" href="https://arjavdave.com/2021/03/31/net-5-setup-authentication-and-authorisation/">This is a good article</a> on how to generate a bearer token for the user.</p>
<p>You can find the whole project <a target="_blank" href="https://github.com/shenanigan/dotnet-passwordless">here</a>.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Good features used to be the main thing that mattered when creating an app. But today, besides having great features convenience is a priority for users.</p>
<p>In this article, we looked at one way you can make your apps more user-friendly. Let me know if you have other ways to improve your apps.</p>
<p><a target="_blank" href="https://arjavdave.com">Check here</a> for more tutorials like this.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ PDF Password Remover Guide: How to Remove Password Protection from a PDF ]]>
                </title>
                <description>
                    <![CDATA[ Password protected PDFs are common. You've probably received one from a bank or dealt with them at work. Passwords are often used to protect sensitive information in a PDF document, or to prevent someone from easily editing it. That's great – it's go... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/pdf-password-remover-guide-how-to-remove-password-protection-from-a-pdf/</link>
                <guid isPermaLink="false">66ac88259e10a480c13037d8</guid>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ pdf ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Tue, 01 Sep 2020 17:10:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c98eb740569d1a4ca1ccd.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Password protected PDFs are common. You've probably received one from a bank or dealt with them at work.</p>
<p>Passwords are often used to protect sensitive information in a PDF document, or to prevent someone from easily editing it. That's great – it's good to know that whoever created the document is going the extra mile to protect your privacy.</p>
<p>The problem with a password protected PDF is that you need to enter the password every time you want to open the document. If you have multiple password protected PDFs, safely storing and managing all those different passwords can be a real hassle.</p>
<p>If you've ever wondered how to remove a password from a PDF to make it easier to open and share, read on.</p>
<p><strong>Important note:</strong> To remove a password from a PDF, you must know what the password is beforehand. This guide is about convenience, and not for cracking or brute forcing an unknown PDF password.</p>
<h2 id="heading-print-to-another-pdf-file">Print to another PDF file</h2>
<p>The most convenient way to remove password protection from a PDF is to open it, then print it as another PDF file. The new PDF file will not be password protected, and you'll be able to open it without having to enter the original password.</p>
<p>While this works in most free PDF readers, using a browser like Google Chrome is very easy, and works the same across all major operating systems.</p>
<p>First, open the password protected PDF in Chrome by opening a new tab and dragging the file into the browser. You could also right click on the PDF and select "Open with" and "Google Chrome", though this may differ slightly depending on your operating system.</p>
<p>You'll be prompted for the password. Enter the password, then click the "Submit" button:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-38.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Once the document is open, bring up Chrome's print menu by clicking the print button in the upper right-hand corner. Alternatively, just press <strong>Ctrl + p</strong> for Windows and Linux or <strong>Cmd + p</strong> for macOS:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-39.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p> With the print menu open, make sure "Destination" is set to "Save as PDF". Then click "Save" in the lower right-hand corner:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-40.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Rename the file if you wish and save it.</p>
<p>Then when you open the new file you won't be prompted for a password:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/unencrypted-pdf.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Finally, store your new PDF file somewhere safe. And be careful whom you share it with if it contains any sensitive information.</p>
<h2 id="heading-tldr">TL;DR</h2>
<p>Here's a CliffsNotes version of the steps above:</p>
<ul>
<li>Open the password protected PDF file in Google Chrome</li>
<li>Enter the password when prompted</li>
<li>Open the print menu, select "Save as PDF", and click the "Save" button</li>
<li>Rename the file if you want to and save it somewhere that's secure</li>
</ul>
<p>And with that, you should be able to quickly and easily remove password protection from any PDF in Windows, macOS, and Linux.</p>
<p>Stay safe and happy password removing :)</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why a little salt can be great for your passwords (but not pepper!) ]]>
                </title>
                <description>
                    <![CDATA[ By Megan Kaczanowski A brief note - this article is about the theory of how to crack hashed passwords. Understanding how cybercriminals execute attacks is extremely important for understanding how to secure systems against those types of attacks.  Bu... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-a-little-salt-can-be-great-for-your-passwords/</link>
                <guid isPermaLink="false">66d46081230dff0166905841</guid>
                
                    <category>
                        <![CDATA[ cybersecurity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Ethical Hacking ]]>
                    </category>
                
                    <category>
                        <![CDATA[ hacking ]]>
                    </category>
                
                    <category>
                        <![CDATA[ information security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 30 Mar 2020 23:23:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9be2740569d1a4ca2e82.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Megan Kaczanowski</p>
<p>A brief note - this article is about the theory of how to crack hashed passwords. Understanding how cybercriminals execute attacks is extremely important for understanding how to secure systems against those types of attacks. </p>
<p>But attempting to hack a system you do not own is likely illegal in your jurisdiction (plus hacking your own systems may [and often does] violate any warranty for that product). </p>
<p>This article assumes some level of knowledge of hashing functions and basic password cracking techniques - if you don't understand those topics, check out <a target="_blank" href="https://www.freecodecamp.org/news/how-did-someone-get-my-password-2/">these</a> <a target="_blank" href="https://www.freecodecamp.org/news/an-intro-to-password-cracking/">articles</a>.</p>
<p>So, you've obtained a set of hashed passwords. Brute forcing the hash will take a <a target="_blank" href="https://www.quora.com/How-long-would-it-take-to-brute-force-a-10-digit-passwords-MD5-hash-using-the-fastest-computer-available-on-consumer-market">very</a> long time. How can you speed up this process?</p>
<h3 id="heading-wait-i-thought-hash-functions-were-one-way-how-do-you-crack-hash-functions">Wait, I thought hash functions were one-way! How do you crack hash functions?</h3>
<p>Unfortunately, the hashing functions which are used for hashing passwords aren't always as secure as generally approved hash functions. For example, the hashing function used for old Windows devices is known as LM Hash, which is so weak that it can be cracked in a few seconds.</p>
<p>Also, you don't need to reverse engineer the hash. Instead, you can use a pre-computed set of plaintext passwords and the corresponding hash value (, ). This tells a hacker what plaintext value produces a specific hash.</p>
<p>With this you'll know what plaintext value produces the hash you're looking for. When you enter a password the computer will hash this value and compare it to the stored value (where it will match) and you'll be able to authenticate. Thus, you don't actually need to guess someone's password, just a value which will create the same hash.</p>
<p>This is called a collision. Essentially, as a hash can take data of any length or content, there are unlimited possibilities for data which can be hashed. </p>
<p>Since a hash converts this text into a fixed length content (for example, 32 characters), there are a finite number of combinations for a hash. It is a very very large number of possibilities, but not an infinite one.</p>
<p>Eventually two different sets of data will yield the same hash value. </p>
<p>Precomputed tables are very helpful in achieving this, as they save significant time and computing power. Using a pre-computed set of hashes to look up a password hash is called a 'lookup-table attack'. These tables are used by system administrators to test the strength of their users' passwords, and are often available online or for purchase. However, they can also be used by nefarious hackers.</p>
<p>If a password is insecure (let's say someone uses a password 5 characters long), it can be relatively easily cracked. For example, a password of 5 lowercase characters can only be used to create 11,881,376 different passwords (26^5). </p>
<p>For a hash of this password, even if the hash is cryptographically secure (uses an appropriate algorithm), it would still be very easy to compute all possible passwords and their corresponding hashes. Lookup tables work very well for these types of password hashes. </p>
<p>However, as passwords increase in length, the storage (and therefore storage cost) you need for every possible password and the corresponding hash grows exponentially. </p>
<p>For example if the password you're trying to crack is 8 characters long but uses numbers (10 digits), lowercase letters (26), uppercase letters (26), and some special characters (10), the number of possible passwords jumps to 722,204,136,308,736 - which is A LOT of storage space, when you realize each is hashed with a hashing function like SHA-256.</p>
<p>Rainbow tables address this issue by offering reduced storage needs, but they take more time to compute the potential passwords. At the most basic level, these are essentially pre-computed lookup tables which enable you to quickly find the plaintext which matches the hash you have. If the hash and plaintext are contained in the table you have - similar to dictionary attacks - you're only looking to see if the password is contained in the table you have. If it isn't, you won't be able to crack the password. You can find these online for free or for purchase. </p>
<p>Check out <a target="_blank" href="https://null-byte.wonderhowto.com/how-to/create-rainbow-tables-for-hashing-algorithms-like-md5-sha1-ntlm-0193022/">this article</a> for a tutorial on creating your own rainbow tables.</p>
<h3 id="heading-im-still-interested-how-do-rainbow-tables-work">I'm still interested. How do rainbow tables work?</h3>
<p><em>If you want to skip the detailed explanation of how these work, feel free to scroll down to the 'How to protect against these attacks' section.</em></p>
<p>In order to save yourself from hashing and storing each possible plaintext until you find the hash you need (like a lookup table), you hash each plaintext and store the result in a table to look up later without having to regenerate them. This takes longer, but saves memory. </p>
<p>To generate the table, you create 'chains' of hashes and plaintext using a hashing function and a reduction function. A reduction function just creates plaintext from a hash (it doesn't reverse engineer the hash, but rather creates different plaintext from the hash). It is also a one-way function.</p>
<p>Thus in order to compute the table, you use one of your hashes, h1, in your reduction function, R(), in order to create the plaintext p1.</p>
<p>R(h1) = p1.</p>
<p>Then you use the hash function H() with p1 to create a new hash.</p>
<p>H(p1) = h2.</p>
<p>Using our example from before:</p>
<p>If the set of plaintext is [abcdefghijklmnopqrstuvwxyz]{5} (we're looking for a rainbow table of all passwords composed of lowercase letters of length 5) and we're using MD5 (a hashing algorithm):</p>
<p>A hash might be ab56b4d92b40713acc5af89985d4b786 (h1). Now, we apply the reduction function, which could be as simple taking the last 5 letters in the hash.</p>
<p>R(ab56b4d92b40713acc5af89985d4b786) = cafdb</p>
<p>H(cafdb) = 81a516edabf924cd0f727d329e855b1f</p>
<h3 id="heading-why-are-they-called-rainbow-tables">Why are they called rainbow tables?</h3>
<p>Each column uses a different reduction function. So if each column were colored, it would be a very long, skinny rainbow.  </p>
<p>Using different reduction functions reduces the number of chain merges (collisions) which happened frequently with hash-chains, the predecessor to rainbow tables. This essentially means that if you keep using the same reduction function, there's a chance you'll end up with two different chains which converge to the same plaintext. Using different reduction functions reduces the chance of this happening, though it isn't impossible. </p>
<h3 id="heading-great-how-do-you-create-a-chain">Great, how do you create a chain?</h3>
<p>In order to create a chain, you're using your reduction function and hashing function (both one way) to create a 'chain' of hashes and plaintext. Each of these 'chains' would continue for k steps, and when the chain ends, will store only the first plaintext and the last hash in the chain. </p>
<p>So, a sample chain looks like this:</p>
<p>p1 -&gt; h1 = H(p1) -&gt; R1(h1) = p2 -&gt; H(p2) = h2 -&gt; R2(h2) = p3 -&gt; H(p3) = h3</p>
<p>Each reduction function is different (represented by R1, R2, R3, etc.) A sample table of chains (each row is a chain of length 5) looks like the following. Note that this is populated with fake data just to give you an example - the hashing function isn't a hash function you would find used to hash passwords. </p>
<p>The reduction functions, R1 and R2 are defined as follows – R1 takes the first 3 digits of the hash, and R2 takes the last 2 letters of the hash:</p>
<p>p1 -&gt; h1 = H(p1) -&gt; R1(h1) = p2 -&gt; H(p2) = h2 -&gt; R2(h2) = p3 -&gt; H(p3) = h3</p>
<p>2  -—&gt;  abdu2934   -—&gt;  293  -—&gt;  83kdnif8  -—&gt;  if  -—&gt;  ike83jd3        </p>
<p>15  -—&gt;  dks2ne94  -—&gt;   294  -—&gt;  ld932nd9  -—&gt;  ld  -—&gt;  ldie938d    </p>
<p>20  -—&gt;  ld93md8d  -—&gt;  938  -—&gt;  lxked93k  -—&gt;  lx  -—&gt;  93mdkg8d        </p>
<p>In a rainbow table, only the first starting point and the endpoint are saved to save on storage, like this:</p>
<p>starting point (plaintext)                    endpoint, after k steps through the chain (hash)</p>
<p>            p1                              -—&gt;                               h1k</p>
<p>            p2                              -—&gt;                              h2k</p>
<p>            p3                              -—&gt;                              h3k</p>
<p>Then when you have a hash (h) where you don't know the plaintext (?), you'll compare it to the chains.</p>
<ol>
<li>First, you'll check if the hash is in the list of final hashes (h1k, h2k, etc.). If so, you can move to step 3.</li>
<li>If not, you can reduce the hash to different plaintext (R1) and then hash that plaintext (using the hash function and next reduction function above) and compare it to the list of final hashes (h1k, h2k, h3k, etc.). When it matches one of the final hashes, that chain will likely contain the original hash.</li>
<li>In order to find the original hash in the chain, take that chain's starting plaintext (so if it matches h1k, start with p1) and apply the hashing and reduction functions to move along the chain until you reach the known hash and its corresponding plaintext. This way you can move through the hashes in the chain without having them take up storage space on your machine.</li>
</ol>
<p>While you can't be sure that the chains will contain the hash you need, the more chains you've generated (or are referencing) the more certain you can be. Unfortunately, each chain is time-intensive to generate, and increasing the number of chains increases the time you need.</p>
<h3 id="heading-how-do-you-defend-against-these-types-of-attacks">How do you defend against these types of attacks?</h3>
<p>First, a layered defense of all systems. If you can prevent compromise of your systems via other methods (so the attacker can't get a copy of your hashed passwords), the attacker won't be able to crack them. </p>
<p>You can also use salting, which adds a random value to the password before encrypting it. That means that the precomputed value you've found (which matches the hash) won't work. The encrypted text is not based solely on the unencrypted text. Because the salt is different for each password, each needs to be cracked individually. </p>
<p>Salting is now included in most major hash types as an option. While Windows doesn't currently use salting, they can encrypt stored hashes if you use the 'SYSKEY' tool. </p>
<p>You can also use 'rounds', or hashing a password multiple times. Using rounds (particularly if the number of rounds is randomly chosen for each user), makes the hacker's job harder. This is most effective when combined with salting.</p>
<p>Unfortunately, a hacker who has the hashed passwords will have also have access to the number of rounds used and the salt used (because in order to get that list they've probably compromised . The salt and number of rounds used is stored with the password hash, meaning that if the attacker has one, they also have the other. However, they won't be able to use precomputed rainbow tables available online, and will have to compute their own tables (which is extremely time consuming). </p>
<p>One other method designed to increase the difficulty of cracking the password is to use a pepper. Pepper is similar to salt, but while a salt is not secret (it's stored with the hashed password), pepper is stored separately (for example, in a configuration file) in order to prevent a hacker from accessing it. This means the pepper is secret, and its effectiveness depends on this.</p>
<p>Pepper needs to be different for each application it is used for, and should be long enough to be secure. At least 112 bits is recommended by the National Institute of Standards and Technology. </p>
<p>While using a pepper can be effective in some cases, there are some downsides. First, no current algorithm supports peppers, which means practically, this is impossible to implement at scale. That is, unless you're creating your own algorithms. Listen to <a target="_blank" href="https://www.schneier.com/blog/archives/2011/04/schneiers_law.html">Bruce Schneier</a>. <strong>Don't do that.</strong> </p>
<p>For a longer article on the problems with peppers, check out <a target="_blank" href="https://stackoverflow.com/questions/16891729/best-practices-salting-peppering-passwords">this thread.</a></p>
<p>Finally, use strong (at least 12 character), complex passwords, and implement strong password policies across all systems. This can include forcing users to create strong passwords, testing their strength regularly, using password managers on an enterprise level, enforcing use of 2FA, and so on.</p>
<p>Confused about what makes a strong password?</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/Screen-Shot-2019-08-26-at-5.21.11-PM-1.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://xkcd.com/936/">https://xkcd.com/936/</a></em></p>
<h3 id="heading-it-seems-really-easy-to-get-hacked-should-i-be-concerned">It seems really easy to get hacked. Should I be concerned?</h3>
<p>The most important thing to remember about hacking is that no one wants to do more work than they have to do. For example, calculating rainbow tables is a lot of work. If there's an easier way to get your password, that's probably what a nefarious actor will try first (like phishing!). </p>
<p>That means that enabling basic cyber security best practices is probably the easiest way to prevent getting hacked. In fact, Microsoft <a target="_blank" href="https://www.zdnet.com/article/microsoft-using-multi-factor-authentication-blocks-99-9-of-account-hacks/">recently reported</a> that just enabling 2FA will end up blocking 99.9% of automated attacks. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/Screen-Shot-2019-08-27-at-1.18.47-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://xkcd.com/538/">https://xkcd.com/538/</a></em></p>
<h2 id="heading-happy-hacking">Happy hacking!</h2>
<p><strong>Additional Reading:</strong></p>
<p><a target="_blank" href="https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture24.pdf">More details on hash chains</a></p>
<p><a target="_blank" href="http://kestas.kuliukas.com/RainbowTables/">Another explanation of rainbow tables</a></p>
<p><a target="_blank" href="http://project-rainbowcrack.com/table.htm">A list of rainbow tables online</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Outsource Your Online Security with 1Password, Authy, and Privacy.com ]]>
                </title>
                <description>
                    <![CDATA[ Take some work off your plate while beefing up security with three changes you can make today. Unstable times are insecure times, and we’ve already got enough going on to deal with. When humans are busy and under stress, we tend to get lax in less-ob... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/outsourcing-security-with-1password-authy-and-privacy-com/</link>
                <guid isPermaLink="false">66bd8f69c1ca1df1936e29d7</guid>
                
                    <category>
                        <![CDATA[ authentication ]]>
                    </category>
                
                    <category>
                        <![CDATA[ cybersecurity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ life ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Victoria Drake ]]>
                </dc:creator>
                <pubDate>Tue, 17 Mar 2020 22:08:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/03/cover-4.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Take some work off your plate while beefing up security with three changes you can make today.</p>
<p>Unstable times are insecure times, and we’ve already got enough going on to deal with. When humans are busy and under stress, we tend to get lax in less-obviously-pressing areas, like the security of our online accounts. </p>
<p>These areas only become an obvious problem when it’s too late for prevention. Thankfully, most of the work necessary to keep up our cybersecurity measures can be outsourced.</p>
<p>Implementing proper cybersecurity measures can be fiddly, and I especially dislike fiddling with things that I could avoid fiddling with. </p>
<p>These fiddly things include resetting forgotten passwords, transferring multifactor authentication (MFA) codes when I change devices, and dealing with the fallout of compromised payment details in the event one of my accounts is still breached.</p>
<p>Here are three changes I’ve made that significantly reduce the chances of needing to fiddle with any of these things again. You can too.</p>
<h2 id="heading-1password">1Password</h2>
<p>I’ve historically avoided password managers because of an irrational knee-jerk reaction to putting all my eggs in one basket. </p>
<p>You know what’s great for irrational reactions? Education. To figure out if putting all my passwords into a password manager is more secure than not using one, I set out to see what some smart people wrote about it.</p>
<p>First, we need to know a thing or two about passwords. Troy Hunt figured out almost a decade ago that <a target="_blank" href="https://www.troyhunt.com/only-secure-password-is-one-you-cant/">trying to remember strong passwords doesn’t work</a>. In more recent times, Alex Weinert expanded on this in <a target="_blank" href="https://techcommunity.microsoft.com/t5/azure-active-directory-identity/your-pa-word-doesn-t-matter/ba-p/731984">Your Pa$$word doesn’t matter</a>. </p>
<p>TL;DR: our brains aren’t better at passwords than computers, and please use MFA.</p>
<p>So passwords don’t matter, but complicated passwords are still better than memorable and guessable ones. </p>
<p>Since I’ve next to no hope of remembering a dozen variations of <code>p/q2-q4!</code> (I’m not a <a target="_blank" href="https://inbox.vuxu.org/tuhs/CAG=a+rj8VcXjS-ftaj8P2_duLFSUpmNgB4-dYwnTsY_8g5WdEA@mail.gmail.com/">chess player</a>), this is a task I can outsource to <a target="_blank" href="https://1password.com/">1Password</a>. I’ll still need to remember one, long, complicated master password - 1Password uses this to encrypt my data, so I really can’t lose it - but I can handle just one.</p>
<p>Using 1Password specifically has another, decidedly obvious, advantage. I chose 1Password because of their <a target="_blank" href="https://support.1password.com/watchtower/">Watchtower</a> feature. <a target="_blank" href="https://www.troyhunt.com/have-i-been-pwned-is-now-partnering-with-1password/">Thanks to Troy Hunt’s Have I Been Pwned</a>, Watchtower will alert you if any of your passwords show up in a breach so you can change them. Passwords still don’t completely work, but this is probably the best band-aid there is.</p>
<p>One last bonus is that using a password manager is a heck of a lot more convenient. Complicated passwords need not take two tries to type. </p>
<p>When it comes to sites that I only rarely use, and don’t consider important, I’m typically far more likely to end up (re)setting those passwords to something memorable, and thus something easily hacked. Even - perhaps especially - unimportant sites can open doors to your more important ones. </p>
<p>Using 1Password and generated passwords, those sites are now also first-class citizens in the land of strong passwords, instead of being half-abandoned and half-open attack vectors.</p>
<p>So, yes, all my eggs are in one basket. A well-protected, complex, and monitored basket, as opposed to being scattered about in several of those paper cartons from the grocery store that don’t really close and certainly can’t survive a <em>rather gentle bump</em> as you come in the doorway, Victoria, how many times do I need to remind you to be careful.</p>
<h2 id="heading-authy">Authy</h2>
<p>Okay - so it’s more like one-and-a-half baskets. ??</p>
<p><a target="_blank" href="https://authy.com/">Authy</a>, from the folks over at <a target="_blank" href="https://www.twilio.com">Twilio</a>, provides a 2FA solution that’s more secure than SMS (I find this to be an interesting intersection, coming from Twilio, and I applaud.) <a target="_blank" href="https://authy.com/blog/authy-vs-google-authenticator/">Unlike Google Authenticator</a>, you can choose to back up your 2FA codes in case you lose or change your phone. (1Password offers 2FA functionality as well - but, you know, redundancies.)</p>
<p>With Authy, your back up is encrypted with your password, similarly to how 1Password works. This makes it the second password you can’t forget, if you don’t want to lose access to your codes. If you reset your account, they all go away. I can deal with remembering two passwords; I’ll take that trade.</p>
<p>I’ve tried other methods of MFA, including hardware keys, which can make accessing accounts on your phone more complicated than I care to put up with. I find the combination of 1Password and Authy to be the most practical combination of convenience and security that yet exists in my knowledge.</p>
<h2 id="heading-privacycom">Privacy.com</h2>
<p>Finally, there’s one last line of defense you can put in place in the unfortunate event that one of your accounts is still compromised. All the strong passwords and MFA in the world won’t help if you open the doors yourself, and scams and phishing are a thing.</p>
<p>Since it’s rather impractical to use a different real credit card every place you shop, virtual cards are just a great idea. There’s no good reason to spend an afternoon (or more) resetting your payment information on every account just to thwart a misbehaving merchant or patch up a data breach from that online shop for cute salt shakers you made a purchase at last year (just me?).</p>
<p>By setting up a separate virtual card for each merchant, in the event that one of those merchants is compromised, I can simply pause or delete that card. None of my other accounts or actual bank details are caught up in the process. Cards can have time-oriented limits or be one-off burner numbers, making them ideal for setting up subscriptions.</p>
<p>This is the sort of basic functionality that I hope, one day, becomes more prevalent from banks and credit cards. In the meantime, I’ll keep using <a target="_blank" href="https://privacy.com/join/Q6V3V">Privacy.com</a>. That’s my referral link; if you’d like to thank me by using it, we’ll both get five bucks as a bonus.</p>
<h2 id="heading-outsource-better-security">Outsource better security</h2>
<p>All together, implementing these changes will probably take up an afternoon, depending on how many accounts you have. It’s worth it for the time you’d otherwise spend resetting passwords, setting up new devices, or (knock on wood) recovering from compromised banking details.  </p>
<p>Best of all, you’ll have continual protection just running in the background - an effortless boost to your <a target="_blank" href="https://victoria.dev/blog/personal-cybersecurity-posture-for-when-youre-just-this-guy-you-know/">personal cybersecurity posture</a>.</p>
<p>We have the technology. Free up some brain cycles to focus on other things - or simply remove some unnecessary stress from your life by outsourcing the fiddly bits.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Crack Passwords ]]>
                </title>
                <description>
                    <![CDATA[ By Megan Kaczanowski A brief note - this article is about the theory of how to crack passwords. Understanding how cybercriminals execute attacks is extremely important for understanding how to secure systems against those types of attacks.  Attemptin... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/an-intro-to-password-cracking/</link>
                <guid isPermaLink="false">66d46041ffe6b1f641b5fa34</guid>
                
                    <category>
                        <![CDATA[ cyber ]]>
                    </category>
                
                    <category>
                        <![CDATA[ cybersecurity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ fintech ]]>
                    </category>
                
                    <category>
                        <![CDATA[ information security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 28 Feb 2020 05:52:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9c61740569d1a4ca31d0.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Megan Kaczanowski</p>
<p>A brief note - this article is about the theory of how to crack passwords. Understanding how cybercriminals execute attacks is extremely important for understanding how to secure systems against those types of attacks. </p>
<p>Attempting to hack a system you do not own is likely illegal in your jurisdiction (plus hacking your own systems may [and often does] violate any warranty for that product). </p>
<h2 id="heading-lets-start-with-the-basics-what-is-a-brute-force-attack">Let's start with the basics. What is a brute force attack?</h2>
<p>This type of attack involves repeatedly trying to login as a user by trying every possible letter, number, and character combination (using automated tools). </p>
<p>This can be done either online (so in real-time, by continually trying different username/password combinations on accounts like social media or banking sites) or offline (for example if you've obtained a set of hashed passwords and are trying to crack them offline). </p>
<p>Offline isn't always possible (it can be difficult to obtain a set of hashed passwords), but it is much less noisy. This is because a security team will probably notice many, many failed login accounts from the same account, but if you can crack the password offline, you won't have a record of failed login attempts.</p>
<p>This is relatively easy with a short password. It becomes exponentially more difficult with a longer password because of the sheer number of possibilities. </p>
<p>For example, if you know that someone is using a 5 character long password, composed only of lowercase letters, the total number of possible passwords is 26^5 (26 possible letters to choose from for the first letter, 26 possible choices for the second letter, etc.), or 11,881,376 possible combinations. </p>
<p>But if someone is using an 11 character password, only of lowercase letters, the total number of possible passwords is 26 ^11, or 3,670,344,486,987,776 possible passwords. </p>
<p>When you add in uppercase letters, special characters, and numbers, this gets even more difficult and time consuming to crack. The more possible passwords there are, the harder it is for someone to successfully login with a brute force attack.</p>
<h3 id="heading-how-to-protect-yourself">How to protect yourself</h3>
<p>This type of attack can be defended against in a couple of different ways. First, you can use sufficiently long, complex passwords (at least 15 characters). You can also use unique passwords for each account (use a password manager!) to reduce the danger from data breaches.</p>
<p>A security team can lock out an account after a certain number of failed login attempts. They can also force a secondary method of verification like Captcha, or use 2 factor authentication (2FA) which requires a second code (SMS or email, app-based, or hardware key based).</p>
<p><a target="_blank" href="https://null-byte.wonderhowto.com/how-to/gain-ssh-access-servers-by-brute-forcing-credentials-0194263/">Here's</a> an article on how to execute a brute force attack.</p>
<h2 id="heading-how-can-you-crack-passwords-faster">How can you crack passwords faster?</h2>
<p>A dictionary attack involves trying to repeatedly login by trying a number of combinations included in a precompiled 'dictionary', or list of combinations. </p>
<p>This is usually faster than a brute force attack because the combinations of letters and numbers have already been computed, saving you time and computing power. </p>
<p>But if the password is sufficiently complex (for example 1098324ukjbfnsdfsnej) and doesn't appear in the 'dictionary' (the precompiled list of combinations you're working from), the attack won't work. </p>
<p>It is frequently successful because, often when people choose passwords, they choose common words or variations on those words (for example, 'password' or 'p@SSword'). </p>
<p>A hacker might also use this type of attack when they know or guess a part of the password (for example, a dog's name, children's birthdays, or an anniversary - information a hacker can find on social media pages or other open source resources). </p>
<p>Similar protection measures to those described above against brute force attacks can prevent these types of attacks from being successful.</p>
<h2 id="heading-what-if-you-already-have-a-list-of-hashed-passwords">What if you already have a list of hashed passwords?</h2>
<p>Passwords are stored in the /etc/shadow file for Linux and C:\Windows\System32\config file for Windows (which are not available while the operating system is booted up). </p>
<p>If you've managed to get this file, or if you've obtained a password hash in a different way such as sniffing traffic on the network, you can try 'offline' password cracking. </p>
<p>Whereas the attacks above require trying repeatedly to login, if you have a list of hashed passwords, you can try cracking them on your machine, without setting off alerts generated by repeated failed login attempts. Then you only try logging in once, after you've successfully cracked the password (and therefore there's no failed login attempt). </p>
<p>You can use brute force attacks or dictionary attacks against the hash files, and may be successful depending on how strong the hash is.</p>
<h3 id="heading-wait-a-minute-whats-hashing">Wait a minute - what's hashing?</h3>
<p>35D4FFEF6EF231D998C6046764BB935D</p>
<p>Recognize this message? It says 'Hi my name is megan'</p>
<p>7DBDA24A2D10DAF98F23B95CFAF1D3AB</p>
<p>This one is the first paragraph of this article. Yes, it looks like nonsense, but it's actually a 'hash'. </p>
<p>A hash function allows a computer to input a string (some combination of letters, numbers, and symbols), take that string, mix it up, and output a fixed length string. That's why both strings above are of the same length, even though the strings' inputs were very different lengths. </p>
<p>Hashes can be created from nearly any digital content. Basically all digital content can be reduced to binary, or a series of 0s and 1s. Therefore, all digital content (images, documents, etc.) can be hashed. </p>
<p>There are many different hashing functions, some of which are more secure than others. The hashes above were generated with MD5 (MD stands for "Message Digest"). Different functions also differ in the length of hash they produce. </p>
<p>The same content in the same hash function will always produce the same hash. However, even a small change will alter the hash entirely. For example, </p>
<p>2FF5E24F6735B7564CAE7020B41C80F1</p>
<p>Is the hash for 'Hi my name is Megan' Just capitalizing the M in Megan completely changed the hash from above.</p>
<p>Hashes are also one-way functions (meaning they can't be reversed). This means that hashes (unique and one-way) can be used as a type of digital fingerprint for content. </p>
<h3 id="heading-whats-an-example-of-how-hashes-are-used">What's an example of how hashes are used?</h3>
<p>Hashes can be used as verification that a message hasn't been changed. </p>
<p>When you send an email, for example, you can hash the entire email and send the hash as well. Then the recipient can run the received message through the same hash function to check if the message has been tampered with in transit. If the two hashes match, the message hasn’t been altered. If they don’t match, the message has been changed. </p>
<p>Also, passwords are usually hashed when they're stored. When a user enters their password, the computer computes the hash value and compares it to the stored hash value. This way the computer doesn’t store passwords in plaintext (so some nosy hacker can't steal them!).</p>
<p>If someone is able to steal the password file, the data is useless because the function can’t be reversed (though there are ways, like rainbow tables, to figure out what plaintext creates the known hash).</p>
<h3 id="heading-whats-the-problem-with-hashes">What's the problem with hashes?</h3>
<p>If a hash can take data of any length or content, there are unlimited possibilities for data which can be hashed. </p>
<p>Since a hash converts this text into a fixed length content (for example, 32 characters), there are a finite number of combinations for a hash. It is a very very large number of possibilities, but not an infinite one.</p>
<p>Eventually two different sets of data will yield the same hash value. This is called a collision. </p>
<p>If you have one hash and you're trying to go through every single possible plaintext value to find the plaintext which matches your hash, it will be a very long, very difficult process. </p>
<h3 id="heading-however-what-if-you-dont-care-which-two-hashes-collide">However, what if you don't care which two hashes collide?</h3>
<p>This is called the '<a target="_blank" href="https://en.wikipedia.org/wiki/Birthday_problem">birthday problem</a>' in mathematics. In a class of 23 students, the likelihood of someone having a birthday on a specific day is around 7%, but the probability that any two people share the same birthday is around 50%. </p>
<p>The same type of analysis can be applied to hash functions in order to find any two hashes which match (instead of a specific hash which matches the other). </p>
<p>To avoid this, you can use longer hash functions such as SHA3, where the possibility of collisions is lower.</p>
<p>You can try generating your own hash functions for SHA3 <a target="_blank" href="https://www.browserling.com/tools/sha3-hash">here</a> and MD5 <a target="_blank" href="http://onlinemd5.com/">here</a>.  </p>
<p>You can try to brute force hashes, but it takes a very long time. The faster way to do that, is to use pre-computed <a target="_blank" href="https://www.freecodecamp.org/news/p/ee82d358-9d43-49a8-84a6-8ffca9a3ee1f/www.freecodecamp.org/news/why-a-little-salt-can-be-great-for-your-passwords">rainbow tables</a> (which are similar to dictionary attacks).</p>
<h2 id="heading-it-seems-really-easy-to-get-hacked-should-i-be-concerned">It seems really easy to get hacked. Should I be concerned?</h2>
<p>The most important thing to remember about hacking is that no one wants to do more work than they have to do. For example, brute forcing hashes can be extremely time consuming and difficult. If there's an easier way to get your password, that's probably what a nefarious actor will try first. </p>
<p>That means that enabling basic cyber security best practices is probably the easiest way to prevent getting hacked. In fact, Microsoft <a target="_blank" href="https://www.zdnet.com/article/microsoft-using-multi-factor-authentication-blocks-99-9-of-account-hacks/">recently reported</a> that just enabling 2FA will end up blocking 99.9% of automated attacks. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/Screen-Shot-2019-08-27-at-1.18.47-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://xkcd.com/538/">https://xkcd.com/538/</a></em></p>
<p><strong>Additional Reading:</strong></p>
<p><a target="_blank" href="https://resources.infosecinstitute.com/10-popular-password-cracking-tools/#gref">Popular password cracking tools</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How did someone get my password? ]]>
                </title>
                <description>
                    <![CDATA[ By Megan Kaczanowski Have you ever received a 'sextortion' email telling you that your computer has been hacked and warning you that if you don't pay up, they will release videos of an intimate nature to your entire contact list? Did the email includ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-did-someone-get-my-password-2/</link>
                <guid isPermaLink="false">66d4604f052ad259f07e4b24</guid>
                
                    <category>
                        <![CDATA[ cyber ]]>
                    </category>
                
                    <category>
                        <![CDATA[ cybersecurity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ information security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ phishing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 30 Jan 2020 05:46:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9d47740569d1a4ca36db.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Megan Kaczanowski</p>
<p>Have you ever received a <a target="_blank" href="https://www.forbes.com/sites/zakdoffman/2019/08/05/200m-email-addresses-held-by-sextortion-attackers-is-yours-on-their-list/#4214f11f67e4">'sextortion</a>' <a target="_blank" href="https://www.cnbc.com/2019/06/17/email-sextortion-scams-on-the-rise-says-fbi.html">email</a> telling you that your computer has been hacked and warning you that if you don't pay up, they will release videos of an intimate nature to your entire contact list? Did the email include an old password of yours as 'proof' that their claims were true? Did you wonder how they got your password?</p>
<h2 id="heading-what-is-phishing">What is Phishing?</h2>
<p>Statistically, this was probably from a phishing email. In 2018, 93% of all breaches globally began with a phishing or pretexting attack.</p>
<p>Phishing emails are extremely common and highly effective. They use emotion such as fear and shame (in sextortion emails or 'male enhancement ads'), urgency (my boss needs this now!), or greed (I won a new car??). </p>
<p>They can also be sent via text message (SMiShing), voice (vishing), email (phishing), and social media phishing. </p>
<p>The more people adapt, the more the hackers change in response – their tactics are constantly evolving.  </p>
<p>Usually phishing emails contain a link or an attachment. Once you click the link or open the attachment, they may install malware on your device or trick you into entering your credentials into a fake site (which looks just like the real site). The malware will check to see if it can exploit unpatched vulnerabilities in order to install more malware onto your system (which can then steal passwords, install keyloggers to record all of your keystrokes – and therefore your passwords! – and so on). </p>
<p>Once the hacker has stolen your credentials, they can do things like exfiltrate your personal financial data or account information, or those of your customers if this happens on your corporation's device.</p>
<p>Phishing deserves its own article entirely, so if you're interested in learning how to phish, check out <a target="_blank" href="https://www.pentestgeek.com/phishing/how-do-i-phish-advanced-email-phishing-tactics">this article</a>.</p>
<h2 id="heading-how-can-you-stop-phishing-from-impacting-you">How can you stop phishing from impacting you?</h2>
<p>Defending against phishing is also difficult. As an individual, the best thing you can do is use caution when opening emails – be wary of emails which play on your emotions, ask you to make quick decisions, or seem too good to be true. </p>
<p>Look out for unusual senders (do you recognize the person emailing you? Is this the same email address they've used before?), or unexpected links or attachments. If you're unsure if an email is legitimate, confirm that it is with the sender via a different method of communication.</p>
<p>You should also use antivirus and endpoint protection software. The paid version is better than the free version, as it is updated as new malware is identified. But the free version is usually better than nothing. I like Malwarebytes for laptops.</p>
<p>Security teams will use a myriad of tools:</p>
<ul>
<li>email filtering mechanisms that attempt to reduce the phishing and spam emails which reach user's inboxes, </li>
<li>measures like SPF, DKIM, and DMARC which can help provide authentication that an email is telling the truth about where it came from, </li>
<li>user awareness training, </li>
<li>and endpoint protection mechanisms. </li>
</ul>
<p>Endpoint protection mechanisms can range from simple anti-virus to agents installed on every device. These will try to prevent known malware from running, identify unusual behavior, and prevent malicious processes from running by alerting a security operations team or forcing the program to quit. </p>
<p>This way, even if the email gets through the filters and the user doesn't notice anything wrong, the endpoint protection will keep the malware from actually doing damage to the machine.</p>
<h2 id="heading-how-else-could-someone-have-gotten-my-password">How else could someone have gotten my password?</h2>
<p>Often when a hacker breaches a company, they will sell the usernames and passwords they've obtained on the dark web. </p>
<blockquote>
<p><strong>Surface Web:</strong> What you can find on Google or other popular search engines. This is probably most of what you think of as the internet. Compared to the deep web, this is a very small portion of information which is ‘online’.</p>
<p><strong>Deep Web:</strong> Information which is online, but isn’t indexed (searchable) by Google and other popular browsers. This is information such as that contained in government or university databases. Often this information is hidden behind a paywall or other restriction mechanism.</p>
<p><strong>Dark Web:</strong> The dark web requires certain browsers, such as a ‘TOR browser’ to access. Some, though not all, of this content is illegal. This is often a place where criminals gather to talk on forums, sell illegal services and goods, and sometimes activists living under repressive regimes gather to communicate.</p>
</blockquote>
<p>If you were re-using passwords and usernames between different websites (particularly since your email is probably used as your username for many websites), a hacker might already have your username and password. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/Screen-Shot-2019-10-04-at-4.06.38-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://xkcd.com/792/">https://xkcd.com/792/</a></em></p>
<p>The hacker will then perform something called 'credential stuffing'. Credential stuffing is when an attacker takes these usernames and passwords and plugs them into an automated 'account checker' which basically tries the username/password combination across many, many different sites across the internet, from social media logins to bank accounts. If the password works, the hacker now has access to the account and can drain an account, sell the data, etc. </p>
<p>For a better description, check out XKCD's comic below.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/Screen-Shot-2019-08-27-at-12.56.37-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://xkcd.com/2176/">https://xkcd.com/2176/</a></em></p>
<h2 id="heading-how-do-you-defend-against-credential-stuffing">How do you defend against credential stuffing?</h2>
<p>Don't reuse your passwords. Use a password manager like 1<a target="_blank" href="https://1password.com/">Password</a> or <a target="_blank" href="https://www.lastpass.com/solutions/business-password-manager">LastPass</a>. <a target="_blank" href="https://keepass.info/">KeePass</a> is (in my opinion) less user friendly, but it's free!</p>
<p>Password managers can securely store your passwords and often have browser extensions and apps so they can autofill your passwords across many accounts. Plus, you only have to remember one master password this way. But your master password now grants access to all of your other passwords, so make sure it's very strong! </p>
<p>They can also help you autogenerate very strong passwords, and some even have vaults so you can store other sensitive information (bank account details, insurance information, etc.). </p>
<p>I personally use 1Password because I like the family account option – if anyone in your family ever gets locked out, someone else can reset their account password (but won't have access to your individual vault). </p>
<p>You can also set up free alerts with <a target="_blank" href="https://haveibeenpwned.com/">Have I Been Pwned</a>. This site aggregates information from data breaches and provides consumers with the ability to use that information to protect themselves. You can navigate to the 'Notify Me' tab at the top and enter your email address. </p>
<p>After you confirm the email address you've entered (where it will provide your current exposure), the site will send you an email anytime your email is involved in a data breach. That is, any breach the site is alerted to – their coverage is very good, but no single source will contain every leaked data breach. This way, you can just change the impacted password, and won't have to worry about it impacting any of your other accounts.</p>
<p>If you're working on security for a large organization, enterprise password management software (the same companies listed above provide these services) is a great idea, as well as strong password policies (mandating that your employees use sufficiently strong passwords). Have I Been Pwned also has a service which allows the domain owner to monitor for breaches which involve any email on the domain (and it's free!). </p>
<h2 id="heading-how-else-do-hackers-get-passwords">How else do hackers get passwords?</h2>
<p>There are a few other possibilities – shoulder surfing, or basically watching you type your password – though this is unlikely given that the person has to be physically watching you. </p>
<p>Then there's theft of passwords which have been written down, or just <a target="_blank" href="https://www.businessinsider.com/hawaii-emergency-agency-password-discovered-in-photo-sparks-security-criticism-2018-1">pictures of written down passwords which are visible in photos</a>. Again, this is much less likely than any of the above options as it typically comes from a targeted attack (which is inherently less common than crimes of opportunity).</p>
<p>Avoiding these two is pretty simple – don't allow someone to watch you enter your password, and don't write down your password. Use a password manager instead! If you simply have to write it down, store it someplace that someone is unlikely to search through or find by accident. I'd suggest the bottom of a box of tampons. Much more secure than a sticky note on your monitor.</p>
<h2 id="heading-it-seems-really-easy-to-get-hacked-should-i-be-concerned">It seems really easy to get hacked. Should I be concerned?</h2>
<p>The most important thing to remember about hacking is that no one wants to do more work than they have to do. For example, breaking into your house to steal your password notebook is a lot harder than sending phishing emails from the other side of the world. If there's an easier way to get your password, that's probably what a nefarious actor will try first. </p>
<p>That means that enabling basic cyber security best practices is probably the easiest way to prevent getting hacked. In fact, Microsoft <a target="_blank" href="https://www.zdnet.com/article/microsoft-using-multi-factor-authentication-blocks-99-9-of-account-hacks/">recently reported</a> that just enabling Two-Factor Authentication will end up blocking 99.9% of automated attacks.  </p>
<p>So, enable 2FA, use a password manager to autogenerate long, complex, unique passwords for every account, and think before you click! Avoid clicking on sketchy or unexpected links and attachments, and stay vigilant.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/Screen-Shot-2019-08-27-at-1.18.47-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://xkcd.com/538/">https://xkcd.com/538/</a></em></p>
<p>### </p>
<p>## </p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Create a Password That is Actually Secure ]]>
                </title>
                <description>
                    <![CDATA[ By Gwendolyn Faraday I am very tired of seeing arbitrary password rules that are different for every web or mobile app. It's almost like these apps aren't following a standard and are just making up their own rules that aren't based on good security ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/actually-secure-passwords/</link>
                <guid isPermaLink="false">66d45edda3a4f04fb2dd2e47</guid>
                
                    <category>
                        <![CDATA[ information security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 27 Nov 2019 16:19:18 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9f00740569d1a4ca4048.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Gwendolyn Faraday</p>
<p>I am very tired of seeing arbitrary password rules that are different for every web or mobile app. It's almost like these apps aren't following a standard and are just making up their own rules that aren't based on good security practices.</p>
<p>All too often I see password entry requirements like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/11/Screen-Shot-2019-11-26-at-10.20.06-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em>Apparently, my password is 'unacceptable' for AT&amp;T because it's more than 24 characters long...</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/11/Screen-Shot-2019-11-18-at-2.05.09-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em>12 characters is an arbitrary number! This website actually wants you to be less secure.</em></p>
<p>Who came up with the idea that you need to have short passwords with only certain types of symbols that are impossible for the average human to remember?</p>
<p>XKCD made an excellent point about this here:</p>
<p><img src="https://imgs.xkcd.com/comics/password_strength.png" width="740" height="601" alt="password_strength" loading="lazy"></p>
<h2 id="heading-more-secure-passwords">More Secure Passwords</h2>
<p>Decades ago, it was recommended that people use more complex passwords containing numbers and symbols to make them more secure. That is no longer the recommendation of security professionals – even the <a target="_blank" href="https://www.nbcnews.com/tech/security/forget-everything-you-know-about-passwords-says-man-who-made-n790711">ones who used to recommend more complex passwords now say that practice is outdated</a>.</p>
<p>Security testing shows that the best ways to make passwords more secure is to simply make them longer and use a unique one for every app or website. They don't even have to be fancy or completely random. But you should be using a password manager to generate them anyway. </p>
<p>I recommend using <a target="_blank" href="https://1password.com/">1Password</a> (browser), <a target="_blank" href="https://spideroak.com/encryptr/">Encryptr</a> (desktop), or <a target="_blank" href="https://www.roboform.com/">RoboForm</a> (browser). Then you will just have one password to remember and have the password manager do the hard work of generating a unique one for every app or website you use.</p>
<h3 id="heading-more-information">More Information</h3>
<ul>
<li>Here is <a target="_blank" href="https://www.troyhunt.com/science-of-password-selection/">a full list of best practices for creating passwords</a> by security researcher Troy Hunt.</li>
<li>If you want to dive deep into password strength estimation, I highly recommend <a target="_blank" href="https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler">this talk by Daniel Wheeler</a> at Dropbox.</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Remember, make longer passwords, educate yourself by reading <a target="_blank" href="https://www.troyhunt.com/science-of-password-selection/">Troy Hunt's article</a>, and use a password manager.</p>
<p>I hope you enjoyed this brief article. Let me know your feedback or additional recommendations in the comments.</p>
<p>Here is how you can reach me:</p>
<ul>
<li>gwenf@protonmail.com</li>
<li><a target="_blank" href="https://gwenfaraday.com">https://gwenfaraday.com</a></li>
<li><a target="_blank" href="https://www.youtube.com/channel/UCxA99Yr6P_tZF9_BgtMGAWA">Faraday Academy YouTube Channel</a></li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Things You Should Know Before Enabling 2-Factor Authentication (2FA) ]]>
                </title>
                <description>
                    <![CDATA[ By Nitin Sharma With Cybersecurity becoming a big concern, two-factor authentication (2FA) is a topic that is becoming hotter with each passing day. After all, who doesn’t want to keep their private data safe? Two-factor authentication may not be a b... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/things-you-should-know-before-enabling-2-factor-authentication-2fa-6f11e4b5eab1/</link>
                <guid isPermaLink="false">66c3630baf2b7c40e7d7eb44</guid>
                
                    <category>
                        <![CDATA[ cybersecurity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ passwords ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Two-factor authentication ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 17 Dec 2018 17:13:46 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*2blNOZ7xEYZbq7px1K1lOg.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Nitin Sharma</p>
<p>With Cybersecurity becoming a big concern, two-factor authentication (2FA) is a topic that is becoming hotter with each passing day.</p>
<p>After all, who doesn’t want to keep their private data safe? Two-factor authentication may not be a bulletproof solution but is one of the easiest and best ways to shore up your virtual security.</p>
<p><strong>Treat 2-factor authentication as a supplement to strong passwords, not as a replacement.</strong></p>
<p>Two-factor authentication adds another security layer to the login process, reducing the chances of your account getting hacked. Just knowing and entering your password is not enough since there is a second layer which is usually time sensitive. This makes the process a whole lot more secure.</p>
<p>Here are some facts you would want to know before you enable two-factor authentication:</p>
<h4 id="heading-four-out-of-five-data-breaches-could-be-avoided-by-using-2fa">Four out of five data breaches could be avoided by using 2FA</h4>
<p>Cyber threats are on a rise and 2-factor authentication actually helps to counter them.</p>
<p>Majority of the hacking-related breaches take place due to weak or stolen passwords. Since many users tend to use the same password everywhere, the risk grows ten fold. Clearly, something more than just passwords are needed.</p>
<p>According to a <a target="_blank" href="http://www.verizonenterprise.com/resources/reports/rp_data-breach-investigations-report-2013_en_xg.pdf">Verizon’s Data Breach Report</a>, 80% of data breaches could be eliminated by the use of two-factor authentication.</p>
<p>2FA makes sure that even if your password gets compromised, the hacker has to crack another security layer before they can access your account. And since most of the 2FA methods are time-dependent, it makes the hacker’s job so much more difficult.</p>
<p>No wonder all the major websites and banks provide an option to enable 2-factor security.</p>
<h4 id="heading-two-factor-authentication-is-not-a-replacement-for-strong-passwords">Two-factor authentication is not a replacement for strong passwords</h4>
<p>Weak and repeated passwords are a bane to Cyber security. No matter which account or service you’re using, it’s always best to set a unique complex password.</p>
<p>Using repeated passwords all over the Internet makes us vulnerable to massive impacts even if one site’s security gets breached. In such a case, all our accounts can be at the attacker’s disposal.</p>
<p>Even if you enable two-factor authentication, strong passwords are a must. As mentioned earlier, treat 2FA as a supplement to strong passwords, not as a replacement.</p>
<p>Always use a complex combination of letters, numbers, and special symbols to generate a strong and unique password for each service you use. You can also use a service like <a target="_blank" href="https://www.lastpass.com/">LastPass</a> to easily manage your passwords.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/MgQT70g6WFU4xfJ6Ce5-OuuTvLDXmOckpiLD" alt="Image" width="800" height="438" loading="lazy">
<em>Facebook is one of the leading companies supporting two-factor authentication.</em></p>
<h4 id="heading-there-are-two-ways-you-can-get-the-passcodes">There are two ways you can get the passcodes</h4>
<p>You can generate the passcodes for 2FA in multiple ways. Codes can be generated on the server and then sent to you via Email, SMS or phone call. This usually requires network connectivity for your mobile and thus can leave you prone to inaccessible accounts in remote areas.</p>
<p>The other option is to generate the passcode offline on your phone or a hardware device. You can easily generate 2FA passcodes on your phone via apps like Google Authenticator, Authy or TOTP Authenticator. There are also hardware devices like YubiKey available in the market for setting up two-factor authentication.</p>
<p>This method is more robust as no data connectivity is required, leaving you less prone to network phishing.</p>
<p>In some cases, the second step can also be biometric verification or entering a PIN you set by yourself earlier.</p>
<h4 id="heading-always-back-up-you-dont-want-to-be-locked-out-of-your-account">Always back up. You don’t want to be locked out of your account</h4>
<p>2FA works on the premise that you always have access to the secondary passcode. But in case you use a 2-factor authentication app and you lose your phone or your data gets wiped out, you can be locked out of your account.</p>
<p>To avoid such a scenario, some websites provide backup codes which you must save securely and can use in such situations. Alternatively, you can use an authentication app which provides the option to back up your security key and related data.</p>
<p>We developed the TOTP Authentication app for iOS and Android keeping this in mind. The app allows you to back up your security key and related information either to your device or to online storage options such as Google Drive in a hassle free way. The encrypted backup file can be set up on another device with just a couple of taps. You can download the app from iTunes store from <a target="_blank" href="https://itunes.apple.com/us/app/totp-authenticator/id1404230533?mt=8">here</a>, and from Google Play Store from <a target="_blank" href="https://play.google.com/store/apps/details?id=com.authenticator.authservice2">here</a>.</p>
<h4 id="heading-conclusion">Conclusion</h4>
<p>Two-factor authentication is slowly becoming a norm in the digital world. Most of the banks, cloud storage services and social media websites already provide the option. You should switch on 2FA wherever possible. As they say, prevention is better than cure.</p>
<p>Have any questions about 2FA authentication? Shoot them in the comments!</p>
<p>To know more about 2-factor authentication you can also check out <a target="_blank" href="https://hackernoon.com/what-is-2-factor-authentication-and-why-you-should-care-e8af5808d499">this article</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
