要阅读更多类似的文章,visit my blog
哪个更聪明?打破锁或偷钥匙?
当然,您可以构建一个强锁,但是如果您可以保护钥匙,那就无用了!
密码就像系统的密钥。如果您是真诚的网络开发人员,则必须确保其强度!
今天,我们将讨论有关密码的一些最佳实践。许多例子正在路上。所以扣紧!
1.偏爱长密码而不是困难的密码
鼓励用户选择更长的密码,而不是让它更难以记住。
Easy + Long>困难 +短
这是因为大多数黑客攻击不是由试图猜测您的密码的人完成的 - 通常是由运行循环的机器完成的。
机器不在乎困难。因此,偏爱更长的密码!
2.切勿通过电子邮件发送普通密码
不幸的是,这是开发人员中非常普遍的错误。纯文本发送密码比您想象的更普遍。
近40%的人每周至少忘记一个密码。
所以,他们要做的就是重置密码并在电子邮件中恢复一个普通密码。
任何电子邮件都来自各种服务器。如果其中一个被妥协,那么您会遇到麻烦!所以永远不要这样做!
备择方案:
-
短信
-
一次密码
-
加密电子邮件服务
-
密码管理器
资源: Why sending password via email is bad
3.使用HTTP进行身份验证相关页面
这是一个显而易见的。尽早安装有效的SSL证书!如果您有任何限制,则至少对auth页面执行此操作。
这不仅对安全很重要。这对于在您的用户中建立 Trust 也很重要,它有助于SEO
HTTPS通过加密提供隐私。详细信息不超出本文的范围,但如果您有兴趣,以下是一个有趣的资源。
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中快速知道一个用户名。它可以使破裂更容易。
如果您关心安全性,则应考虑为用户实现第二个用户名。每个人都会有不同的目的。
已知用户名
-
确定一个人
-
搜索配置文件
-
在线身份
未知的用户名
-
这仅用于身份验证。
-
只有用户才知道。
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.保持挑战性问题无法预测
如果帐户被锁定,则有些系统使用挑战问题添加了第二层。
让这些问题无法预测!
您的母亲的名字是什么?这不是一个很好的问题 - 这可以在用户的社交媒体页面上找到!
好问题的素质
-
即使在几年后,也很容易记住。
-
包含数千个可能的答案,因此不容易猜测。
-
不是社交媒体上经常发现的话题。
-
有一个永远不会改变的答案(您最喜欢的颜色或梦想的汽车可能会随着时间而改变)。
示例:您的童年英雄是谁?
19.避免密码旋转
这是一个有争议的。有人说,您应该强迫用户在90天后旋转密码。这是破解密码需要多长时间的。
这不是真的,因为已经引入了更强大的机器。
这培养了用户之间的不良实践。他们通常想避免经常更改密码的并发症,因此到处使用相同的密码!
20.鼓励密码中的空间
密码中的空格是一件好事。不幸的是,许多用户没有利用这一点。
鼓励他们使用空间 - 它会自动创建更安全,易于记录的密码!
21.经验法则
如果您走这么远,很无聊,也不想记住所有这些要点,请让我为您简化。只要记住一件事!
大小很重要
鼓励长密码,您应该没事的。好吧,大多数时候!
恭喜,如果您做到了这么远!这些是一些可能不符合所有用例的准则,但我希望您学到了一两件事!
有一个美好的一天,我的朋友!
有话要说?
通过LinkedIn或我的Personal Website与我联系。