问题标签 [password-storage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在 C 中的客户端应用程序中存储密码
我正在编写一个客户端程序(用 C 语言)来访问某个网站,我想在其中实现一个“记住密码”功能。我不认为以纯文本形式存储它是一个好主意(如果用户正在运行可能找到密码的恶意软件怎么办?),所以我想知道。在这种情况下存储密码的最佳方法是什么?我需要能够逐字恢复它(哈希/盐不行,服务器需要整个密码),并且解决方案需要具有一定的可移植性(它必须至少在 GNU/Linux 上工作)。
php - 将密码本身用作盐是个好主意吗
我在许多文章中读过,我们应该在散列之前将唯一的盐与每个密码结合起来,并将盐存储在数据库中以进行验证,但是将密码本身用作盐怎么样?
这样做会有好处,因为盐对每个人来说都是独一无二的,而且它会被隐藏起来,因为它不会存储在任何地方。
我可以在上面给出的一个简单示例是:
上面我只是反转密码并将其用作盐(我将做一些更复杂的事情,然后只是在开发中反转它。)
这是存储密码的更好方法还是不好的做法。
PS:我完全了解 php 最新的内置功能,例如 crypt()
并在现实世界中使用它,但还想对上述内容进行审查。
php - 简单但安全的密码散列
我正在寻找一种简单(或尽可能简单)但安全的方法,用于在将用户密码提交到数据库然后从数据库中检索时对其进行散列和加盐处理。在过去 3 个小时的研究中,实际上有数百种不同的方法,每个人都会说是最好的方法。
我正在寻找一种相对简单的方法来保证用户帐户的安全。显然,安全一词可以有不同的解释,但我只是希望它至少对于潜在的黑客(或任何你称之为悲伤的人)来说很难获得对用户帐户的访问权限。
我很感激我至少应该尝试一些事情,但对于我的目的来说,它们似乎都如此复杂且过于安全。
我尝试使用password_hash()
,但似乎我正在运行比 5.5 更早的 PHP 版本。我知道下面的代码存在问题,但这只是我正在从事的个人项目的起点,以便更好地学习 PHP。
目前的登记表
登录逻辑
encryption - bcrypt,河豚的密码最大长度
我的问题来自 如何用河豚散列长密码(> 72个字符)
我正在使用 bcrypt(blowfish) 对密码进行哈希处理。所以,正如我从这个问题中发现的那样 https://security.stackexchange.com/questions/39849/does-bcrypt-have-a-maximum-password-length
它的字符数限制为 72。
所以,我开始考虑限制密码的最大长度,但是在这些问题和他们的答案之后
所有人都反对这一点。提到事情,比如
- 节省存储空间
- 旧的 Unix 系统经验
- 与不支持长密码的遗留系统交互
- 约定(即“我们一直这样做”)
- 简单的天真或无知。
- 明文存储
- 另外,
a maximum length specified on a password field should be read as a SECURITY WARNING
通过这个答案 - https://stackoverflow.com/a/99724/932473 - ETC
所以,我认为我不符合其中一种情况。当然,我同意愚蠢的限制,比如最大长度为 10,甚至更糟糕的是 8 或 6,但 30、40 或更多长度的密码(盐渍)不被认为是安全的吗?从这篇文章(虽然有点旧),但它说
这适用于 8 个字符的密码。所以,我想象自定义彩虹表将有多么巨大,可以暴力破解一个 30 或更多字符的密码(考虑到每个密码都有自己的盐),因为彩虹表的大小呈指数增长
引用同一篇文章的评论
每次在密码中添加一个字符时,通过暴力破解的难度都会成倍增加。例如,8 个字符的密码具有 95^8 个组合的键空间,而 20 个字符的密码具有 95^20 个组合的键空间。
因此,对于一个带有 bcrypt 的 20 长度密码,需要 95^20 / (71 000 * 3600 * 24 * 365) ~ 10 的 28 度年(如果我做得对的话)
qsn1:现在,在这种情况下,对于河豚来说,有一个含义是不将密码最大长度限制为 72,因为在任何情况下,所有内容都将被截断,因此这里没有额外的安全增益。
qsn2:即使存在盐(对于每个用户来说都是唯一的并且保存在数据库中),毕竟我想在密码中添加胡椒(在应用程序中硬编码而不是保存在数据库中)。我知道是否会增加一点额外的安全性,但我认为以防万一 db(或 db 备份)只是泄漏,胡椒会很有用。
https://security.stackexchange.com/a/3289/38200
因此,为了能够添加 20 个字符的胡椒,我需要将密码的最大长度设置为 50 左右。我认为是这样的:假设用户使用 70 个字符,在大多数情况下(如果不是全部),它会是一些类似的短语或smth,而不是生成强大的短语,所以将用户限制为最大长度 50 并添加另一个 20-22 个字符的胡椒不是更安全,这绝对是更安全/随机的。另外,假设黑客正在使用“常用短语”的彩虹表,我认为72 character common phrase
被黑客攻击的机会比50 character common phrase + 22 character random string
. 那么,这种使用胡椒和 50 最大长度的方法是否更好,或者我做错了,最好保留 72 最大限制(如果 qsn1 没问题)?
谢谢
顺便提一句:
根据 Owasp,密码的合理最大长度为 160 https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet#Do_not_limit_the_character_set_and_set_long_max_lengths_for_credentials
谷歌的密码最大长度为 100
Wordpress 的最大限制为 50
passwords - 用于保存旧密码以进行身份验证的设计
我要求重置密码时,新密码应与旧密码不同。我正在考虑将其设计为具有多个密码对象的用户对象和包含用户 ID、密码和创建日期的密码对象。
重置密码时,它将检查新密码与用户的所有旧密码(最新密码除外),如果找到匹配,则将其丢弃。
如果它不在旧密码列表中,它将在密码列表中为用户创建一个新条目。当用户登录时,系统应该根据 createdDate 检查最新的密码。
只是想检查您对此设计的想法,看看是否有更好的方法来做到这一点。谢谢。
sequelize.js - 续集:不返回密码
我正在使用 Sequelize 为用户记录进行数据库查找,并且我希望模型的默认行为不返回该password
记录的字段。该password
字段是一个哈希,但我仍然不想返回它。
我有几个可行的选择,但似乎没有一个特别好:
findWithoutPassword
为模型创建一个自定义类方法,User
并在该方法User.find
中对attributes
集合进行操作,如Sequelize 文档中所示做一个正常
User.find
并过滤控制器中的结果(不是首选)使用其他一些库来去除不需要的属性
有没有更好的办法?最重要的是,如果有一种方法可以在 Sequelize 模型定义中指定从不返回该password
字段,但我还没有找到一种方法来做到这一点。
bcrypt - 使用 Bcrypt 密码失败
到目前为止,bcrypt 到目前为止还没有出现任何问题。由于某种原因,以下密码不起作用。UIO78349%^&(]\\';=
这是我第一次密码无效,我希望有人能解释一下。我在网上搜索并阅读了有关字符限制的信息,但这远低于此。不确定它是否有任何区别,但用户输入的密码正在通过 mysqli_real_escape_string。
登录表单所在的第一批代码:
这里是 js。
这是被调用的php:
到目前为止,在帖子顶部的密码之前,任何密码都不会打嗝?如果你问我很奇怪。
php - 如果使用 facebook 进行身份验证,则在 USER 表中存储空白密码
我正在设计一个应用程序,它可以通过注册表单接受新用户,或者使用 facebook 登录。
当用户注册时,我会创建一个用户记录并将加密的密码(哈希)存储在USER
表中。如果用户通过FB注册,我还是要创建用户记录。
但是我应该如何处理密码列,因为我不会接触到他们的 FB 密码。或者我应该将用户名/登录名/密码与USER
表分开并将其保存在单独的表中,FB 用户将不会在这个新表中记录。
bash - Bash 中的密码管理
我的.bashrc
文件中有一些函数用于在远程网站上发出备份命令。现在,用户名和密码字段在函数定义中以纯文本形式存储为函数本地字符串。有没有更好的方法来做到这一点?
到目前为止,我的想法是将密码的散列版本放在只有我的用户帐户具有读取权限的文件中,在其上运行去散列命令行函数并将纯文本结果存储在内存中,使用它,然后清除它。
是否有更好/更安全甚至事实上的通用方法来实现这一目标?
谢谢你。
security - 为什么不使用 MD5 进行密码散列?
我有一个朋友是白帽黑客。他说 md5 并没有那么糟糕,实际上真的很安全,只要我们正确使用它。
我相信他是对的。据我所知,有 3 种方法可以打破哈希:
- 使用彩虹表(可以通过长/随机盐来保护)
- 碰撞(可以通过多种盐或哈希来防止 - 如下例所示)
- 生成时间(如果我们为每个用户使用足够长的盐值 - AFAIK,这并不重要)
我和我的朋友认为 Blowfish 并不是真正需要的,它也可能是有害的,因为它可以减慢密码验证过程,并且它可以与 DDOS 攻击一起使用,即使攻击资源较少也可以破坏服务器。
所以,我想确保以下算法真的安全吗?而且,是否有真正的理由使用 Blowfish 哈希算法?