OWASP 应用程序安全验证标准 4.0.3
控制项模式应用安全验证标准是一份应用安全需求或测试清单,可供架构师、开发人员、测试人员、安全专家、工具供应商和用户用来定义、构建、测试和验证安全应用程序。
验证用户设置的密码长度至少为12个字符(合并多个空格后)。(C6)
验证是否允许至少64个字符的密码,以及是否拒绝超过128个字符的密码。(C6)
确认密码未被截断。但是,连续的多个空格可能会被替换为一个空格。(C6)
验证密码中允许使用任何可打印的 Unicode 字符,包括空格和表情符号等语言中性字符。
验证用户能否更改他们的密码。
验证密码更改功能是否需要用户的当前密码和新密码。
验证在账户注册、登录和密码更改过程中提交的密码是否与一组已泄露的密码进行核对,可以在本地进行(例如与系统密码策略匹配的前1000或10000个最常用密码)或使用外部API进行核对。如果使用 API,应使用零知识证明或其他机制以确保明文密码不会被发送或用于验证密码是否被泄露。如果密码已被泄露,应用程序必须要求用户设置一个新的未泄露密码。(C6)
确认提供密码强度测量工具,以帮助用户设置更强的密码。
验证是否没有限制允许字符类型的密码组成规则。密码不应要求包含大写或小写字母、数字或特殊字符。(C6)
确认没有定期凭证轮换或密码历史记录要求。
确认允许使用“粘贴”功能、浏览器密码助手和外部密码管理器。
确认用户能够选择临时查看整个被掩码的密码,或者在不具备此内置功能的平台上临时查看密码的最后一个输入字符。
验证防自动化控制是否能有效减轻凭证被泄露测试、暴力破解和账户锁定攻击。这些控制措施包括阻止最常被攻破的密码、软锁定、速率限制、验证码、尝试之间持续增加的延迟、IP地址限制,或基于风险的限制,例如位置、设备上的首次登录、近期解锁账户的尝试或类似情况。请验证单个账户每小时的失败尝试次数不超过100次。
验证弱验证方法(如短信和电子邮件)的使用是否仅限于二次验证和交易批准,而不是作为更安全验证方法的替代。验证在使用弱方法之前是否提供了更强的验证方法,用户是否意识到风险,或者是否已采取适当措施来限制账户被入侵的风险。
验证在更新认证信息后(如凭证重置、邮箱或地址更改、从未知或有风险的位置登录)是否向用户发送安全通知。优先使用推送通知而非短信或电子邮件,但在没有推送通知的情况下,短信或电子邮件也是可以接受的,只要通知中不泄露敏感信息。
验证防止网络钓鱼的冒充抵抗措施,例如使用多因素认证、带有意图的加密设备(如带有按压认证功能的连接密钥),或在更高的AAL级别使用客户端证书。
验证在凭证服务提供商(CSP)与验证身份的应用程序分离的情况下,两端点之间是否已建立相互认证的 TLS。
通过强制使用一次性密码(OTP)设备、加密认证器或查询代码来验证重放抵抗能力。
通过要求输入一次性密码(OTP)令牌或用户发起的操作(例如按下 FIDO 硬件钥匙上的按钮)来验证身份认证意图。
验证系统生成的初始密码或激活码应当是安全随机生成的,应至少包含6个字符,并且可以包含字母和数字,且应在短时间后失效。这些初始凭证不得作为长期密码使用。
验证是否支持用户提供的身份验证设备的注册和使用,例如 U2F 或 FIDO 令牌。
确认续订说明已提前发送,以便更新有时间限制的身份验证器。
验证密码是否以能够抵抗离线攻击的形式存储。密码必须使用批准的单向密钥派生或密码哈希函数进行加盐和哈希。密钥派生和密码哈希函数在生成密码哈希时以密码、盐和成本因子作为输入。(C6)
确认盐值长度至少为32位,并应任意选择以最小化存储的哈希值之间的盐值冲突。对于每个凭证,应存储唯一的盐值及其生成的哈希值。(C6)
请确保如果使用 PBKDF2,则迭代次数应尽可能大,在验证服务器性能允许的范围内,通常至少为 100,000 次迭代。(C6)
验证如果使用 bcrypt,工作因子应尽可能大,以匹配验证服务器的性能,最小值为 10。(C6)
验证是否执行了密钥派生函数的额外迭代,使用仅验证者知道的秘密盐值。使用经批准的随机比特生成器 [SP 800-90Ar1] 生成盐值,并提供至少符合 SP 800-131A 最新版本规定的最小安全强度。秘密盐值应与哈希密码分开存储(例如,在像硬件安全模块这样的专用设备中)。
验证系统生成的初始激活或恢复密钥未以明文形式发送给用户。(C6)
确认密码提示或基于知识的身份验证(所谓的“密保问题”)不存在。
验证密码凭证恢复不会以任何方式泄露当前密码。 (C6)
验证共享或默认账户不存在(例如“root”、“admin”或“sa”)。
确认如果身份验证因素被更改或替换,用户会收到此事件的通知。
验证忘记的密码以及其他恢复途径时,应使用安全的恢复机制,例如基于时间的一次性密码(TOTP)或其他软令牌、移动推送或其他离线恢复机制。(C6)
确认如果OTP或多因素身份验证因素丢失,身份验证的证据应与注册时的级别相同。
验证查找密钥只能使用一次。
验证查找密钥是否具有足够的随机性(112位熵),如果熵不足112位,则使用唯一且随机的32位盐进行加盐,并使用批准的单向哈希进行哈希。
验证查找密钥能够抵御离线攻击,例如可预测值的攻击。
验证默认情况下不提供基于明文的带外(NIST“受限制”)认证方式,例如短信或公用交换电话网(PSTN),并且首先提供更强的替代方案,例如推送通知。
验证带外验证器会在 10 分钟后使带外身份验证请求、代码或令牌失效。
验证带外验证器的身份验证请求、代码或令牌仅可使用一次,并且仅适用于原始身份验证请求。
验证带外身份验证器和验证器是否通过安全的独立通道进行通信。
验证带外验证器只保留身份验证码的哈希版本。
验证初始认证码是否由安全的随机数生成器生成,至少包含20位熵(通常六位数字的随机数就足够)。
验证基于时间的一次性密码在过期之前是否有定义的有效期。
验证用于验证提交的 OTP 的对称密钥是否得到高度保护,例如通过使用硬件安全模块或基于安全操作系统的密钥存储。
验证在 OTP 的生成、初始化和验证过程中使用的是经过批准的加密算法。
验证基于时间的一次性密码在有效期内只能使用一次。
验证如果在有效期内重复使用基于时间的多因素一次性密码(OTP)令牌,是否会被记录并拒绝,同时向设备持有者发送安全通知。
验证实体单因素 OTP 生成器在被盗或丢失的情况下可以被撤销。确保撤销在所有登录会话中立即生效,无论位置如何。
确保生物识别身份验证器仅限于作为二级因素使用,并需与您拥有的东西或您知道的东西结合使用。
验证用于验证的加密密钥是否安全存储并受到防泄露保护,例如使用可信平台模块(TPM)或硬件安全模块(HSM),或使用可以利用此安全存储的操作系统服务。
验证挑战随机数至少为64位长度,并且在统计上是唯一的,或在加密设备的使用寿命内是唯一的。
验证在生成、初始化和验证过程中使用了经过批准的密码算法。
确保服务内部的秘密不依赖于不变的凭证,例如密码、API 密钥或具有特权访问权限的共享账户。
请确保如果服务身份验证需要密码,所使用的服务账户不是默认凭据。(例如,在某些服务安装期间,root/root 或 admin/admin 是默认账户)。
验证密码是否以足够的保护方式存储,以防止离线恢复攻击,包括本地系统访问。
验证密码、与数据库和第三方系统的集成、种子和内部密钥,以及 API 密钥是否安全管理,并且不包含在源代码中或存储在源代码仓库中。这类存储应能够抵御离线攻击。建议使用安全的软件密钥存储(L1)、硬件 TPM 或 HSM(L3)来存储密码。