这个结构体(struct PasswordForm)是 Chromium 浏览器(以及所有基于 Chromium 的浏览器,例如 Chrome、Edge 等)中密码管理器用来存储和管理单个登录凭证(即一组用户名和密码)的核心数据结构。它不仅包含了用户名和密码本身,还包含了大量关于该凭证的来源上下文元数据以及在网页表单中定位所需的信息。


枚举类型 (Enums) 解释

PasswordForm 结构体内部定义了四个重要的枚举类型,用于对表单和凭证进行分类和标记。

1. enum class Scheme (认证方案)

用于区分登录凭证的认证方式或来源。只有具有相同 SchemePasswordForm 才能相互匹配和自动填充。

成员 含义 备注
kHtml HTML 表单认证(默认) 最常见的网页登录表单。
kBasic HTTP Basic 认证对话框 浏览器弹出的基础认证窗口。
kDigest HTTP Digest 认证对话框 浏览器弹出的摘要认证窗口。
kOther 其他类型的认证方案。 通用或未知方案。
kUsernameOnly 仅包含用户名的凭证。 仅保存用户名的场景。

2. enum class Type (凭证类型)

用于区分凭证的创建或获取方式,这个值会被转换成整数并存储在密码后端,因此其数值是固定的。

成员 数值 含义
kFormSubmission 0 通过用户提交网页表单保存的凭证(最常见)。
kGenerated 1 由密码管理器自动生成并保存的密码。
kApi 2 通过 Credential Management API 存储的凭证。
kManuallyAdded 3 用户在设置界面中手动添加的凭证。
kImported 4 从其他来源导入的凭证。
kReceivedViaSharing 5 通过密码分享功能接收到的凭证。
kImportedViaCredentialExchange 6 通过凭证交换机制导入。
kChangeSubmission 7 用户修改密码后保存的凭证。

3. enum class GenerationUploadStatus (生成上传状态)

跟踪关于密码生成的信息是否已发送到服务器。

成员 含义
kNoSignalSent 未向服务器发送信号。
kPositiveSignalSent 发送了积极信号(例如:用户使用了生成的密码)。
kNegativeSignalSent 发送了消极信号(例如:用户没有使用生成的密码)。

4. enum class MatchType (匹配类型)

这是一个位掩码(bitmask),用于描述 PasswordForm 如何与当前页面的表单或 URL 进行匹配,一个凭证可以有多种匹配类型。

成员 含义
kExact 0 精确匹配:凭证的 signon_realm 与请求的 URL 完全一致。
kAffiliated 1 << 1 (2) 关联匹配:通过关联服务(Affiliation Service)判断,signon_realm 与 URL 属于同一组关联网站。
kPSL 1 << 2 (4) 公共后缀列表匹配(Public Suffix List):signon_realm 与 URL 具有相同的 eTLD+1(effective Top-Level Domain + 1,例如 example.com)。
kGrouped 1 << 3 (8) 分组匹配:通过分组信息判断,signon_realm 与 URL 属于同一组。

5. enum class Store (存储位置)

指示凭证存储的位置,它也是一个位掩码,一个凭证可能同时存在于两个存储中。

成员 含义
kNotSet 0 未设置(默认值)。
kProfileStore 1 << 0 (1) 本地配置文件存储:凭证存储在本地设备。
kAccountStore 1 << 1 (2) 账户存储:凭证存储在与 Google 账户同步的云端存储中。

核心数据字段 (Core Fields) 解释

这些字段是识别和定位凭证在数据库中的位置,以及在网页上进行自动填充的关键信息。

1. 身份和定位 (Identity & Location)

字段 类型 作用和重要性
primary_key std::optional<FormPrimaryKey> 数据库中的主键,仅当从数据库读取时设置,用于唯一标识数据库记录。
scheme Scheme 认证方案(来自上面的枚举),默认是 kHtml
signon_realm std::string 登录域/范围。对于 HTML 表单,它通常是 scheme://host:port。对于对话框,包含 HTTP Realm。它实际上是检索数据的“主键”
url GURL 表单所在页面的 URL (scheme, host, port, path)。密码管理器用它来决定哪个凭证适合当前页面(最长前缀匹配)。
action GURL 表单提交的 URL(即 <form action="..."> 中的值)。这是自动填充的主要数据,保存的凭证的 action 必须与页面表单的 action 匹配才能自动填充。如果为空,则采用受限的自动填充策略(等待用户输入用户名)。

2. 用户名和密码 (Username & Password)

字段 类型 作用和重要性
username_element std::u16string 用户名输入框的 name 属性
username_value std::u16string 实际保存的用户名
password_element std::u16string 当前密码输入框的 name 属性
password_value std::u16string 实际保存的当前密码非空是凭证可以持久化到密码存储的必要条件。
new_password_element std::u16string 新密码输入框的 name 属性(用于注册或修改密码表单)。不持久化。
new_password_value std::u16string 实际保存的新密码(不持久化)。
all_alternative_usernames AlternativeElementVector 所有可能的备选用户名,用于填充下拉列表。
all_alternative_passwords AlternativeElementVector 所有可能的备选密码(用于待定密码状态)。
keychain_identifier std::string 钥匙串标识符(仅在 iOS 上使用)。

3. 元数据和状态 (Metadata & Status)

字段 类型 作用和重要性
date_last_used base::Time 上次使用此登录凭证的日期
date_password_modified base::Time 上次修改密码值的日期。旧凭证可能为空。
date_created base::Time 登录信息被 Chrome 保存的日期
blocked_by_user bool 用户是否选择了永不记住此站点的密码。
type Type 凭证类型(来自上面的枚举),默认是 kFormSubmission
times_used_in_html_form int 此用户名/密码在 HTML 表单中使用的次数
in_store Store 凭证存在于哪个或哪些存储中(本地或账户同步)。
password_issues base::flat_map<...> 凭证的安全问题(例如泄露、钓鱼)及其元数据。
notes std::vector<PasswordNote> 附加到凭证的笔记

4. Android 和关联信息 (Android & Affiliation)

这些字段主要用于关联桌面浏览器密码和 Android 应用密码。

字段 类型 作用和重要性
affiliated_web_realm std::string 如果是 Android 凭证,这是关联的网页域
app_display_name std::u16string 如果是 Android 凭证,这是应用的显示名称(如 Play 商店名称)。
app_icon_url GURL 如果是 Android 凭证,这是应用图标的 URL

5. Credential Management API 和 WebAuthn (凭证管理 API)

字段 类型 作用和重要性
display_name std::u16string 用户友好的名称(由 Credential Management API 设置)。
icon_url GURL 用于在 UI 中显示的凭证图标 URL(如用户头像)。
federation_origin url::SchemeHostPort 身份提供者(Federated Login,如“使用 Google 登录”)的来源。
skip_zero_click bool 如果为 true,Chrome 不会在没有用户交互的情况下将此凭证返回给站点。
accepts_webauthn_credentials bool 表单是否可以填充 WebAuthn 凭证。

6. 密码分享信息 (Password Sharing)

字段 类型 作用和重要性
sender_email std::u16string 共享此密码的发送者邮箱
sender_name std::u16string 共享此密码的发送者姓名
sender_profile_image_url GURL 发送者的个人资料图片 URL
date_received base::Time 通过分享功能接收此密码的日期
sharing_notification_displayed bool 是否已向用户展示分享通知。

️ 方法 (Methods) 解释

结构体包含了一系列判断表单类型的辅助方法和访问器。这些方法通常基于表单中不同元素的组合(如是否同时存在当前密码和新密码字段)来推断表单的用途。

方法 作用
IsLikelyLoginForm() 基于启发式规则判断是否为登录表单(有用户名、密码,无新密码)。
IsLikelySignupForm() 基于启发式规则判断是否为注册表单(有用户名、新密码,无当前密码)。
IsLikelyChangePasswordForm() 基于启发式规则判断是否为修改密码表单(有当前密码,有新密码)。
IsLikelyResetPasswordForm() 基于启发式规则判断是否为重置密码表单(有新密码,无当前密码或用户名)。
GetPasswordFormType() 返回表单的分类类型(更细致的分类)。
HasUsernameElement() / HasPasswordElement() / HasNewPasswordElement() 检查对应的输入元素是否存在。
IsFederatedCredential() 检查 federation_origin 是否非空(是否为联合登录凭证)。
IsSingleUsername() 检查是否仅有用户名元素而没有密码或新密码元素。
IsUsingAccountStore() / IsUsingProfileStore() 检查凭证是否存储在账户或配置文件存储中。
HasNonEmptyPasswordValue() 检查 password_valuenew_password_value 是否非空。

struct PasswordForm 是 Chromium 密码管理器中存储一个登录实体全面记录。它是一个高度工程化的结构,旨在支持多种认证方式(HTML、Basic/Digest)、多种凭证来源(提交、生成、API、导入)、跨平台(桌面、Android)的关联以及复杂的自动填充和密码安全检查逻辑。简单来说,它就是密码管理器中的一个“密码卡片”,但包含的元数据远超卡片本身所展示的内容。

Chormium 密码管理器表单结构体说明(基于Chromium138)的更多相关文章

  1. 用firefox 31配合KeePass密码管理器实现web帐号密码自动填写登录

    原文:http://bbs.kafan.cn/thread-1754676-1-1.html KeePass的优势:1.这是一款完全开源的密码管理器2.很多人都使用lastpass来保存密码,而这种严 ...

  2. Keeweb-Linux的密码管理器

    Keeweb-Linux的密码管理器 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.那么,下 ...

  3. jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法

    jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jq ...

  4. RookeyFrame Bug 表单管理 -> 查看表单 ->编辑字段页面 JS报错

    表单管理 -> 查看表单 ->编辑字段页面 小bug onchange里面直接就是方法,修改:去掉外面的function(){},直接把方法体写在onchange里面就可以了. 后台方法: ...

  5. 跨平台开源密码管理器 KeePassXC

    简介 KeePassXC 是一个开源的跨平台密码管理器.基于 KeePass 二次开发. KeePassXC 可以安全地在本地存储您的密码,配合浏览器插件KeePassXC-Browser可辅助登录. ...

  6. 在Express 中获取表单请求体数据

    在Express 中获取表单请求体数据 获取 GET 请求参数 获取 POST 请求体数据 安装 配置 获取 GET 请求参数 Express 内置了一个 API , 可以直接通过 req.query ...

  7. jQuery基本筛选器-表单筛选器-关系筛选器

    一.基本筛选器 :first // 第一个 :last // 最后一个 :eq(index)// 索引等于index的那个元素 :even // 匹配所有索引值为偶数的元素,从 0 开始计数 :odd ...

  8. [oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库

    1 form表单如何生成多选框(包含了多选框可选择内容) - Form设置班级输入框为 select多选 - 多选 class TeacherForm(Form): name = fields.Cha ...

  9. 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体

    1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...

  10. C++线性表通过结构体实现操作和结构体字符串快速排序和shell排序结合

    #include<iostream> #include<string> #define ml 10 using namespace std; typedef struct{// ...

随机推荐

  1. CSP-S 2024 游记

    上午 上午打板+睡觉.希望能比去年有进步. 下午 下午进考场,好像来早了,一直没见到带考的老师,于是自己先进去了. 鼠标不好用,滚轮坏了,申请换一个.结果更不好用,过一会就卡一下.于是换了个位置,鼠标 ...

  2. 前端开发系列040-基础篇之TypeScript简单介绍

    一.TypeScript语言简单说明 简单说明 TypeScript 是微软2012年推出的一种编程语言,属于 JavaScript 的超集,可以编译为 JavaScript 执行.它最大特点是强大的 ...

  3. java 注解&含义

    简介 随着 Spring Cloud 统一 java 编程. 注解可以完成很多基础项目的配置. 有的时候看不懂注解,也就看不懂代码 Example @Service 即将类交给Spring进行管理,一 ...

  4. 入门书籍 web前端开发最佳实践

    高效web前端开发  book PageSpeed  出自google公司  是一款  免费的工具  性能分析 Timeline网页交互  和渲染  所要花费的时间 Profile谁  可以查看网页c ...

  5. 回答准确率从60%飙至95%!AI知识库救命方案

    AI 的浪潮席卷而来,各行各业都在积极探索 AI 的落地应用,无论是为了提升工作效率,还是为了在同事和领导面前展现技术实力,技术先行者们都跃跃欲试.在众多 AI 落地场景中,**知识库(Retriev ...

  6. 产品更新丨谷云 AI Agent 智能体版本更新

    这次谷云科技AI Agent 智能体迎来了更新,此次更新聚焦于功能新增与优化,旨在提升智能体性能,深化平台交互体验,助力您在数据驱动的决策旅程中更加得心应手. 功能新增,开启智能新篇 1.MCP 服务 ...

  7. 【深度品质】win10 21h1 64位专业版系统 V2021.03

    [深度品质]win10 21h1 64位专业版系统 V2021.03 文件: w1021h1x64cj.rar大小: 5993449476 字节 5.58GBMD5: C38D6CF3F5226901 ...

  8. Unity帧同步框架与教程

    框架: https://github.com/JiepengTan/LockstepEngine 教程: https://github.com/JiepengTan/Lockstep-Tutorial ...

  9. UnityEditor工具链开发的常用小技巧与示例

    github链接 https://github.com/XINCGer/UnityToolchainsTrick UnityToolchainsTrick 提供一些UnityEditor工具链开发的常 ...

  10. AutoCAD2026界面底部状态栏不见了,如何找回?

    打开AutoCAD软件发现底部的状态栏突然没了,给绘图工作带来了很大的不便,但又不知道该如何找回? 其实,底部状态栏可通过系统变量STATUSBAR来控制状态栏的显示,如下,参数0表示隐藏底部状态栏, ...