21个在Web应用程序中处理密码的最佳实践
#aws #javascript #编程 #react

要阅读更多类似的文章,visit my blog

哪个更聪明?打破锁或偷钥匙?

当然,您可以构建一个强锁,但是如果您可以保护钥匙,那就无用了!

密码就像系统的密钥。如果您是真诚的网络开发人员,则必须确保其强度!

今天,我们将讨论有关密码的一些最佳实践。许多例子正在路上。所以扣紧!

1.偏爱长密码而不是困难的密码

鼓励用户选择更长的密码,而不是让它更难以记住。

Easy + Long>困难 +短

这是因为大多数黑客攻击不是由试图猜测您的密码的人完成的 - 通常是由运行循环的机器完成的。

机器不在乎困难。因此,偏爱更长的密码!

Image Source: [https://xkcd.com/936/](https://xkcd.com/936/)

资源: https://xkcd.com/936/

2.切勿通过电子邮件发送普通密码

不幸的是,这是开发人员中非常普遍的错误。纯文本发送密码比您想象的更普遍。

近40%的人每周至少忘记一个密码​​。

所以,他们要做的就是重置密码并在电子邮件中恢复一个普通密码。

任何电子邮件都来自各种服务器。如果其中一个被妥协,那么您会遇到麻烦!所以永远不要这样做!

备择方案:

  • 短信

  • 一次密码

  • 加密电子邮件服务

  • 密码管理器

资源: Why sending password via email is bad

3.使用HTTP进行身份验证相关页面

这是一个显而易见的。尽早安装有效的SSL证书!如果您有任何限制,则至少对auth页面执行此操作。

这不仅对安全很重要。这对于在您的用户中建立 Trust 也很重要,它有助于SEO

Image Source: [https://howhttps.works/the-keys/](https://howhttps.works/the-keys/)

HTTPS通过加密提供隐私。详细信息不超出本文的范围,但如果您有兴趣,以下是一个有趣的资源。

资源: https://howhttps.works/

4.防止字典密码

字典密码是最常见的密码列表。密码饼干发现密码更容易破解。他们通常首先贯穿这些。

Here是100000个最常见密码文件的列表 - 使用此列表作为参考,并通过。

进行检查

资源: List of 10 million dictionary password

5.防止顺序密码

人们使用一些通用序列作为密码,这些序列易于预测。

不好的例子

qwertyuiop -> top row of keyboard
asdfghjkl -> middle row of keyboard
zxcvbnm -> bottom row of keyboard
123456 -> numeric digits in sequence

对于用户的手指来说,这些更容易,但对安全性不利。防止用户提供这些。

6.防止重复密码

此外,重复密码在用户中非常普遍。它们通常很容易记住,因此很容易猜测。

坏例子

aaaaa1111 
bbbbb22222

检测到前端,并阻止人们使用它们。

7.在数据库中不存储普通密码

这意味着任何可以访问数据库的人都可以轻松折衷所有用户帐户。

切勿将密码直接存储在数据库

实施某种加密。这并不难,为什么不呢?

8.使用哈希功能,而不是加密功能

谈论加密请勿使用诸如SHA1,SHA2,MD5等的加密功能。这些都是旨在处理大型数据集的通用哈希功能。

这意味着它们非常适合确保数据的完整性和完全存储密码的垃圾 - 不使用它们!

始终使用bcrypt.在bcrypt中,您可以确定哈希函数的昂贵程度。以下是一个代码,可以显示它有多简单!

import bcrypt from 'bcrypt'

const password = 'oe3im3io2r3o2'
const rounds = 10

bcrypt.hash(password, rounds, (err, hash) => {
  console.log(hash)
})

由于密码不是一个大数据集,它们非常适合此用例。

** resurce:**https://codahale.com/how-to-safely-store-a-password/

9.惩罚您的用户

引入惩罚系统,以实现失败的登录尝试。如果某人可以在10/15次后登录,请惩罚大约一个小时左右。

这可以使您免于蛮力攻击。

10.考虑实施第二个用户名

在大多数网站上(例如Facebook),如果您转到其个人资料,您可以从URL中快速知道一个用户名。它可以使破裂更容易。

My Profile

如果您关心安全性,则应考虑为用户实现第二个用户名。每个人都会有不同的目的。

已知用户名

  • 确定一个人

  • 搜索配置文件

  • 在线身份

未知的用户名

  • 这仅用于身份验证。

  • 只有用户才知道。

11.适当的UI设计。

尽管可以在后端检查强密码,但您应该考虑实现某种前端验证。

禁用提交按钮,直到给出有效的密码为输入。以下是检查密码强度的示例。

let strongPassword = new RegExp('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{8,})')
let mediumPassword = new RegExp('((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{6,}))|((?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?=.{8,}))')


const checkPasswordStrength = (inputPassword) => {
  if(strongPassword.test(inputPassword)){
    console.log('Password is strong!')
  }else if(mediumPassword.test(inputPassword)){
    console.log('Password strength is medium!')
  }else{
    console.log('Password is weak!')
  }
}

const inputPassword = 'Some Password Given By User'
checkPasswordStrength(inputPassword)

资源: Password strength checker with javascript

12.引入延迟

在每次失败的登录力延迟五秒钟后 - 您的用户不会感觉到它,但是攻击者会感到疼痛。

如果攻击者试图猜测用户的密码,他们将失败多次。它将使攻击顺序更加困难,因此不太可能在合理的时间范围内取得成功。

资源:This is an informative thread

13.劝阻替代

有些人认为使用C0mpl3x代替Complex作为密码更安全。但猜猜怎么了?其他人也知道这一点!

[https://giphy.com/gifs/culture--think-hmm-d3mlE7uhX8KFgEmY]

因此,阻止您的用户使用这种类型的密码 - 无论如何都会替换这些替代品,因此它们只是使密码复杂而无需任何功能。

14.两因素身份验证

这与密码没有直接相关,但与安全有关。考虑为您的Web应用程序实施两因素身份验证。

15.密码器更好

有两种类型的人:那些相信复杂词更好的人,那些相信长密封词更好的人。

好吧,根据联邦调查局(FBI)的说法,较长的密码较高,因为它们很难破解。

这是一个比较:

资源: [https://www.zdnet.com/article/fbi-recommends-passphrases-over-password-complexity/]

16.向上

添加多层安全性 - 不仅取决于前端或后端验证。尝试采用多个级别的安全性,以便有多个故障点。

您永远不知道会出问题!

17.几次不正确的尝试后锁定帐户

这是一个相当明显的。跟踪用户是否尝试登录帐户并反复给出错误的输入。

阻止或锁定这些帐户并进行其他验证。但是,这应该取决于您的用例。

18.保持挑战性问题无法预测

如果帐户被锁定,则有些系统使用挑战问题添加了第二层。

让这些问题无法预测!

您的母亲的名字是什么?这不是一个很好的问题 - 这可以在用户的​​社交媒体页面上找到!

好问题的素质

  • 即使在几年后,也很容易记住。

  • 包含数千个可能的答案,因此不容易猜测。

  • 不是社交媒体上经常发现的话题。

  • 有一个永远不会改变的答案(您最喜欢的颜色或梦想的汽车可能会随着时间而改变)。

示例:您的童年英雄是谁?

资源:Good challenge questions

19.避免密码旋转

这是一个有争议的。有人说,您应该强迫用户在90天后旋转密码。这是破解密码需要多长时间的。

这不是真的,因为已经引入了更强大的机器。

这培养了用户之间的不良实践。他们通常想避免经常更改密码的并发症,因此到处使用相同的密码!

20.鼓励密码中的空间

密码中的空格是一件好事。不幸的是,许多用户没有利用这一点。

鼓励他们使用空间 - 它会自动创建更安全,易于记录的密码!

21.经验法则

如果您走这么远,很无聊,也不想记住所有这些要点,请让我为您简化。只要记住一件事!

大小很重要

鼓励长密码,您应该没事的。好吧,大多数时候!

恭喜,如果您做到了这么远!这些是一些可能不符合所有用例的准则,但我希望您学到了一两件事!

有一个美好的一天,我的朋友!

有话要说?

通过LinkedIn或我的Personal Website与我联系。