C’YaPass:您从未用过的最佳密码管理器(一个完整的密码生态系统)
C’YaPass(完全开源软件)现已成为一个功能齐全的密码生态系统,它不会将您的密码存储在任何地方——您的数据由您自己拥有。
引言
C'YaPass 现已成为一个功能齐全的密码生态系统,它从不将您的任何密码存储在任何地方。没错,您的密码每次都会被生成。
注意:所有源代码均可在 GitHub 上找到(链接在文章底部)——所有源代码均为 100% 开源,软件永久免费。
关于“从不存储您的密码”的快速解释
所有密码均由两个输入的 SHA256 哈希值生成
SiteKey
- 与您登录的网站关联的基于string
的提醒(由您创建)Pattern
- 您在 C'YaPass 网格中绘制的几何图案,用于为您的 SiteKey 加盐
您的密码将如下所示
a40ebcd6611aee763d931762dbc5ff75bf0f54d4f029eb2f3524adf9036ffdfb
要了解其工作原理,请阅读 我的详细 LinkedIn 文章。
为什么它现在是一个生态系统?
通过新的 WebAPI(本文中有解释),您将可以从任何联网设备完全访问您的 SiteKeys(如果您选择的话),但您的密码不会存储在任何云端。是的,这就像魔法一样——但更好,因为它是科学(计算机科学,包括加密学)。
C'YaPass 不会在任何地方保存您的密码,这使得您的密码更加安全。
使用 AES256 加密
但现在,我终于实现了一种超级安全的方式来存储和导入您的 SiteKeys 到任何联网设备。所有 SiteKeys 都使用认证加密和 AES256 加密,以确保 total 安全。
所有源代码都是 FOSS(完全开源软件),可在 GitHub 上获取。
本文将向您展示这一切是如何完成的。
请允许我告诉您使用 C'YaPass 的所有好处,这样我就可以说服您使用该应用程序。我已经使用它多年了,它确实让密码使用变得更好。我的妻子也使用它,生活也因此变得更好,因为我们不再为密码争吵。😁 是的,我是认真的。
使用 C'YaPass 的好处
- 您的所有密码都将是超级强壮的(基本上是随机数字和字母)SHA256 哈希值。
- 永远不要再次输入密码。密码会被复制到剪贴板,所以您不必输入它们。(在手机上用拇指输入长密码可能会很痛苦——现在您不必这样做了。)
- 永远不要再次记住密码。它们都在 C'YaPass 中,而且您可能无论如何也记不住所有密码。
- 永远不要再次编造密码。我讨厌编造密码,您可能也是。
- 网站的所有那些烦人的密码要求(使用大写字母、特殊字符、最大长度)都会被 C'YaPass 记住,所以您再也不必考虑它们了。
- FOSS(完全开源软件),永久免费。您可以获取代码、检查代码、修改代码,甚至将其用于您自己的项目。
- 轻松为您访问的每个网站创建唯一的密码。您只需要绘制一个几何图案,因为每次添加新的 SiteKey 时,都会从您独特的 SiteKey 和几何图案的组合中创建一个新的 SHA256 哈希值。
- 您的所有密码都可以在您选择的任何设备上使用,但它们永远不会存储在任何计算机上,包括您自己的计算机。(本文中有更多关于这方面的内容。)
- 您的任何数据都不会存储在云端(他人的计算机上),除非您选择使用 WebAPI 来存储您 AES256 加密的 SiteKeys。但是,即使那样,存储的也不是您的密码——而是您的 SiteKeys,所以您受到更大的保护。(本文中有更多介绍。)
- 如果您决定使用 WebAPI 存储您的 SiteKeys,它们将使用认证加密(本文中有更多介绍)和 AES256 进行完全加密,并使用您选择的密码密钥加密,这个密码密钥只有您知道,并且不会存储在任何地方。(当然,这意味着如果您忘记了加密数据的密码,没有人能够解密该数据。)
- 如果您选择导出您的 SiteKeys(用于创建基于 SHA256 的密码的密钥的一半),那么您将使用只有您知道的密钥来加密您的数据,并且您的数据保证使用 AES256 认证加密进行加密(本文中有更多关于这方面的内容)。
- 用于导出 SiteKeys 的 WebAPI 也是 FOSS(完全开源软件),您可以运行它并将您的加密 SiteKeys 存储在您自己的服务器上。是的!这意味着您可以使用生态系统,甚至您的加密数据也可以存储在您自己的服务器上。C'YaPass 客户端是可配置的,所以您可以简单地添加指向您的 LibreStore WebAPI 站点的 URL,您的数据就会在那里被加密和保存。
- 您可以在任何平台(Windows、Mac、Linux)上运行 ElectronJS。
- 您无需安装任何东西即可进行尝试。您可以在任何设备(iOS、Android、Mac、Linux、Windows)上的浏览器中尝试并使用 C'YaPass。只需将您的浏览器指向 https://cyapass.com/js/cya.htm,添加一个 SiteKey,绘制一个图案,您就会生成一个超级强壮的密码并将其复制到您的剪贴板。
- 您的 SiteKeys 仅存储在本地(在 localStorage 中 -
localStorage.getItem("siteKeys")
),除非您决定导出它们。 - 即将推出——您可以在 C'YaPass 客户端中删除本地计算机/浏览器中的所有 siteKeys。在我编写此列表时,我想,如果用户想删除 localStorage 中的所有 siteKeys,那会很好,所以我很快就会添加一个按钮来实现这一功能。在网站上打开浏览器控制台并运行
localStorge.removeItem("siteKeys")
即可完成。
背景
如果您着手创建一个密码管理器,首先会出现的要求是
必须在所有平台和设备上可用。
原因是我们都有各种各样的设备(和平台),并且在任何时候,我们都可能需要从设备安全地登录一个网站。
使用 C'YaPass 需要两样东西
正如您所知,为了让 C'YaPass 生成您强大的(基于 SHA256 的)密码,您需要向它提供两样东西
- SiteKey:用于提醒您密码将用于哪个网站的唯一字符串
- 几何图案:您在 C'YaPass 的网格区域绘制的一个图案
这就像高层伪代码函数可能的样子
CreateSha256Hash(uniqueString + geometricPatternValue)
……然后弹出一个新的、无法逆转的 SHA256 哈希值
a40ebcd6611aee763d931762dbc5ff75bf0f54d4f029eb2f3524adf9036ffdfb
网站密码要求
如果网站强制执行密码要求,例如
- 包含特殊字符
- 添加大写字符
- 最大密码长度
那么 C'YaPass 允许您设置其中任何或所有项,并且在您每次回来生成密码时,它都会记住这些值。
需要两样东西,但记不住所有 SiteKeys
由于您只需要一个几何图案,您可以轻松记住它。
然而,您不太可能记住所有 SiteKeys。这是长期以来限制 C'YaPass 使用的挑战。如果您最初在台式计算机上使用 C'YaPass,然后在 iPhone 上想使用它怎么办?您必须设法将所有这些 SiteKeys 输入到您的 iPhone C'YaPass 实例中。我过去这样做过。我只是把它们都输入了。
但是,真正的用户不会接受这一点。
将 SiteKeys 存储在某个地方而不暴露它们
要求
我们需要一种方法来允许用户存储他们的 SiteKeys,以便只有原始用户可以检索它们并在任何其他设备上使用它们。
这正是本文的主题。
深入数据加密的兔子洞
我不确定为什么数据加密是一个如此棘手的课题。当我发现使用 AES256 加密数据的正确方法(认证加密)时,我经常被各种干扰所吸引。您需要阅读多个来源并整合信息才能得到一个答案。这是一个困难的主题。
信任问题
还有您现在可能正在考虑的问题。您可能会想
- 为什么我应该相信这个作者知道他在说什么?为什么我应该相信他真的会正确地加密数据?
- 为什么我应该信任这个作者?也许他在加密我的数据时会存储我的一些秘密,以便他可以随时解密我的数据?
好吧,我能说的就是,这就是我将项目设为 FOSS(完全开源软件)的原因。您可以深入研究代码,确切地看看我在做什么。
这也是我最近在这里 CodeProject 上撰写的一篇文章(创建认证加密和使用 AES256 加密您的数据[^])。
我不会在这里解释所有细节,只谈要点。
数据加密摘要
AES256 认证加密所需的一切列表
- 明文 - 您要加密的数据
- 密钥密码 - 解密数据所需的特殊密码。此密码不存储在任何地方。在 C'YaPass 中,您通过选择一个 SiteKey 和绘制一个几何图案来创建此密码。这将生成一个 64 个字符的 HEX 值,用于加密数据。
- 随机 IV - (初始化向量),它将以明文形式传递——AES256 需要 16 字节的随机数据,并且每次加密数据时都应创建此 IV,即使密码或明文数据未更改。这有助于随机化数据,以免攻击者发现加密数据的模式。
- MAC 密钥 - 用于生成 MAC(消息认证码)的密钥,MAC 是 16-32 字节的数据,在您与将要解密数据的接收方之间保密。
- MAC - 最终的消息认证码 - 使用 MAC 密钥(秘密密钥)在 IV 和加密数据上生成 - 此代码将以明文形式传递给接收方(解密方)。必须知道此 MAC,以便接收方可以将其与他们计算的值进行比较,以确保 IV 和加密数据未被篡改。
其中涉及的内容太多,以至于很难弄清楚哪些值可以暴露,哪些值必须保密。
加密 SiteKeys 的步骤
SiteKeys 以 JSON 格式存储在用户的 localStorage 中 - 阅读更多关于 Mozilla MDN 上的 localStorage。
SiteKey JSON 是一个对象数组,其中包含一些名称/值对
[{"MaxLength":0,"HasSpecialChars":false,"HasUpperCase":false,"Key":"c3VwZXJzaXRl"},
{"MaxLength":16,"HasSpecialChars":true,"HasUpperCase":true,"Key":"ZmFrZWtleQ=="},
...]
名称/值对说明
MaxLength
- 如果其值大于 0,则该值将用作密码的最大长度,并且密码将设置为该长度。HasSpecialChars
- 如果值为true
,则密码将包含用户输入到 C'YaPass 客户端相关编辑框中的特殊字符(参见 C'YaPass 的 UI)。C'YaPass 代码将自动将特殊字符添加到密码的前 5 个字符中。HasUpperCase
- 如果值为true
,则 C'YaPass 客户端将自动强制将生成的密码中找到的第一个字母大写。Key
- 这是用户创建的用于记住密码将用于哪个网站的实际字符串。C'YaPass 将其编码为 Base64,以便于存储和发送/接收。
SiteKey JSON 是我们的明文
我展示 SiteKey JSON 格式的原因是,在我们的例子中,这就是我们要加密的明文。
接下来,我们需要一个强密码
由于这是 C'YaPass 的本能(生成强密码),我们使用相同的功能来创建用于加密我们数据的密码。
当用户尝试将数据导出到 WebAPI 时,整体流程如下。
使用特殊的 SiteKey 进行传输密码
您可以创建一个特殊的传输 SiteKey,就像我在示例中那样(或使用现有的 SiteKey)。
在这种情况下,我添加一个带有文本:@transferKey
的 SiteKey,然后单击[确定]按钮。
开始导出过程
单击[导出 SiteKeys]
按钮,这将开始该过程。
如果您还没有绘制几何图案,您将收到以下对话框警告。这确保了在尝试加密(和导出)数据之前生成了强密码。
创建 CyA Secret ID - 用于在 WebAPI 存储数据的密钥
一旦您选择了 SiteKey 并绘制了几何图案(您的密码已生成),您将看到以下对话框,它会请求一个简单的密钥,该密钥仅用于标识您要从远程站点检索的数据(始终加密)。
在此示例中,我将 demoKeys2022
用作此示例的标识符。如果您忘记该标识符,您将无法检索您的(加密)数据。
是的,如果其他人获得了您的标识符,他们就可以检索您的(加密)数据。但是数据是 AES256 加密的,所以他们无法解密。
创建标识符后,单击[确定]按钮,您的 SiteKeys 将使用您的强密码进行加密,然后发布到 LibreStore WebAPI。完成后,您将看到一个对话框,告知您加密并导出了多少个密钥——这是您所有 SiteKeys 的总数。
导入您的密钥
现在您可以转到任何设备并打开网站(https://cyapass.com/js/cya.htm),并使用以上所有信息导入加密的 SiteKeys。
当然,如果您没有用于导出数据的原始 SiteKey(@transferKey
),您需要添加它。它可能看起来像这样
单击[导出 SiteKeys]按钮,它将开始该过程。同样,如果您不绘制几何图案,您将收到警告。
现在,您只需要使用完全相同的 CYa Secret ID(否则您将收到一个错误消息,说明找不到 Secret ID)。
单击[确定]按钮,您的 SiteKeys 将从 LibreStore WebAPI 检索,并使用您的强密码解密。
如果您提供了正确的强密码,那么您所有的 SiteKeys 都将被解密并插入到您当前的 SiteKey 列表中。如果 SiteKey 已存在于您的列表中,则不会导入——这样就不会丢失(覆盖)任何 SiteKeys。您还将看到一条提供详细信息的消息。
亲自尝试
您拥有所有数据,可以亲自尝试。您现在可以从任何设备访问我的网络版本并进行尝试。只需使用演示密钥和上述步骤,您就可以导入所有示例密钥。
有人可以导出到我们的 DemoKeys
是的,有可能别人使用不同的密码进行导出,并使用我们的 demoKeys2022(Cya Secret Id),那么那里的数据将被加密,只有他们能读懂。这是一个社区事物,所以可能会有人来破坏它。
好了,那么 WebAPI 最终会做什么?
导出真正的魔力在于 LibreStore API 可以从任何地方访问。
我的 LibreStore WebAPI 位于 https://newlibre.com/LibreStore。这是一个基本的 .NET 网站,它在那里没有文档(因为我很懒)。但它所做的事情以及如何做都相当酷。
WebAPI - 两个基本端点
- /Cya/SaveData - 允许您 POST 加密的 SiteKeys
- /Cya/getCya/GetData?key=demoKeys2022 -- 检索与密钥关联的 Cya 数据
POST 加密数据
SaveData
将数据元素以 FormData
对象的形式 POST,该对象如下所示
const formDataX = new FormData();
formDataX.append("key",secretId);
formDataX.append("data",encryptedData);
formDataX.append("hmac", generateHmac(encryptedData,iv));
formDataX.append("iv", iv);
- 这提供了
secretId
(demoKeys2022
)以关联加密数据。 - 发送的
data
是加密 SiteKeys 的Base64
编码数据。 HMAC
是消息认证码,用于确保 IV 和加密数据未被更改或损坏。此 MAC 在导入 C'YaPass 时进行检查,如果不匹配,则导入将被拒绝,因为这表明有人试图损坏数据或发生了一些数据损坏。- 用于初始化数据加密的原始 IV(初始化向量),它用于确保数据始终随机化。
Sqlite 数据存储
当数据 POST 到 LibreStore API 时,它会存储在一个 Sqlite 数据库 中。没错,一个老旧但高可用的 Sqlite 数据库。它非常优雅且易于使用。
节省存储空间
每当导出密钥并使用相同的 CYa Secret Id(demoKeys2022)时,Sqlite 数据库就会覆盖前一个值,只保留新的那一行。这样,同一个 CYa Secret Id 就不会有数百个导出记录。
获取所有 LibreStore 源代码
当然,LibreStore WebAPI 也是 FOSS,您可以在我的 GitHub 上获取所有源代码(https://github.com/raddevus/LibreStore)。
它还需要很多清理工作,但它会让您对正在发生的事情有所了解。
在您自己的站点上运行 LibreStore
这也意味着您可以在您自己的站点上运行 LibreStore WebAPI,并将您的加密 SiteKeys POST 到您自己的个人站点。
更改 C'YaPass 客户端中的 URL
如果您决定在您自己的网站上运行 LibreStore WebAPI,您可以简单地单击 C'YaPass 客户端中的[设置传输 URL]按钮,并将其设置为指向您的 LibreStore WebAPI。
将弹出一个对话框,您可以在其中设置 LibreStore API 的基本 URL。
它默认设置为我的网站。您可以通过单击[设置默认值]按钮将其恢复为默认值。
现在,如果您愿意,您可以完全拥有您自己的所有数据。
这使得 C'YaPass 成为一个完整的密码生态系统。
示例 LibreStore WebAPI 控制器代码
当您 POST 到 CyaController
时,SaveData
方法如下所示
[HttpPost("SaveData")]
public ActionResult SaveData([FromForm] String key,
[FromForm] String data,
[FromForm] String hmac,
[FromForm] String iv){
SqliteProvider sp = new SqliteProvider();
var mainTokenId = WriteUsage(sp,"SaveCyaData",key);
// if mainTokenId == 0 then an error occurred.
if (mainTokenId == 0){
var jsonErrorResult = new {success=false,
message="Couldn't save Cya data because of invalid MainToken.Key."};
return new JsonResult(jsonErrorResult);
}
SqliteCyaProvider scp = new SqliteCyaProvider();
Cya c = new Cya(mainTokenId,data,hmac,iv);
CyaData cd = new CyaData(scp,c);
cd.Configure();
var cyaId = scp.Save();
var jsonResult = new {success=true,CyaId=cyaId};
return new JsonResult(jsonResult);
}
您必须提供四个参数,它们保存将存储在 Sqlite 数据库中的相关元素。(当然,C'YaPass 客户端会为您处理这些。)
key
-- 您的MainTokenId
(demoKeys2022
)data
-- 您的加密数据(必须是加密的)hmac
-- 这是在加密数据和 iv 值上生成的。消息认证码。这确保了 iv 和加密数据都没有被篡改或损坏。解密方将使用它来验证 iv 和加密数据。当 C'YaPass 客户端在导入期间检索数据时,它使用 iv 和加密数据以及 MAC 密钥来重新创建此值。MAC 不必加密——也不应该——这样解密方就可以在其自己的 iv 和加密数据上生成 MAC,然后将其与原始值进行比较。如果不匹配,C'YaPass 客户端将警告用户数据已损坏,并且不会导入数据。使用 MAC 来确保数据未被篡改,这创建了认证加密,并使我们能够在解密数据之前知道数据未被损坏。iv
-- 这是一个加密强度极高的随机生成的值,用于随机化加密数据。它也解密所需,并且可以显示为明文而不会泄露任何数据。初始化向量的重要性如下。假设您使用一个密码来加密字母 'a
',然后您使用相同的密码来加密 'b
',然后再次使用相同的密码加密字母 'c
'。攻击者有可能发现加密数据中的某些模式。我们使用随机创建的值来随机化数据,因此即使长时间使用相同的密码加密数据,我们也不会暴露加密数据中的任何模式。
认证 JavaScript 加密算法
您可能会想,我们如何知道 JavaScript 加密算法(AES256 的 JavaScript 版本)是否正常工作。
我们如何知道 HMAC 算法在 JavaScript 中是否正常工作?
答案揭示了加密数据的重大挑战之一。
各种语言使用不同的加密 API
为了使我的 C'YaPass 客户端随处可用,我用 HTML、JavaScript 和 CSS(Bootstrap)编写了它。
测试加密/解密
但是,我也使用了 C# 和相关的 C# 算法(在其他项目中)来加密和解密数据(更多内容将在接下来的文章中介绍)。关键在于,如果我使用 AES256 JavaScript 算法加密数据,我可以到我的 C# 应用程序中,使用 C# API 和 AES256 算法来解密数据。我还可以运行 C# HMAC 算法来生成 IV 和加密数据上的 MAC,并且我得到相同的 MAC 值。
反之亦然
我也可以使用 AES256 API 加密数据,然后使用 JavaScript Cryptography API 解密它。这实际上非常有价值,并且花了很多学习时间。
Java 加密 API 也一样
我也使用 Java Cryptographic API 完成了同样的工作。所以,关键在于 JavaScript、Java、C# 的 AES256 算法都以相同的方式工作,并且能够验证加密和解密的数据,确保所有这些语言中的算法都以相同的方式实现。
加密数据的额外挑战
这一直是加密/解密数据的额外挑战。在我的例子中,我用一种特定的语言(C#)在一个平台上加密了数据,然后我写了一个 Android 应用程序,需要解密这些数据。挑战在于 Android 设备使用 Java API 来进行加密/解密,所以我不得不学习那些加密 API。这花了很多功夫,但确实巩固了您的知识。
长文 - 希望您有所收获
这是一篇很长的文章,但我希望它能引发讨论,并说服您开始使用 C'YaPass。
请记住,它永久免费使用,而且是完全开源的软件。您真的没有什么可损失的。
额外资源
这里有一些额外的链接(来自我的 LinkedIn 文章),可以让您找到各种 C'YaPass 资源。
- 销毁所有密码:再也不用记密码[^] - LinkedIn 文章准确地解释了 C'YaPass 如何生成密码。
- C'YaPass:再也不用输入密码[^] - 现在就在您的浏览器中尝试
- https://www.microsoft.com/en-us/p/cyapass/9pfd82d1z7rw -- 从 Windows 应用商店安装应用程序。这是 ElectronJS 版本,它作为原生桌面应用程序运行,但底层是 JavaScript。
请注意 - 我部署到 Windows 应用商店非常困难,该版本(1.3.1)有点滞后,导出功能尚未更新。 - 您可以在我的 GitHub 上获取最新 ElectronJS 版本的源代码并立即运行:GitHub - raddevus/CYaPass-Electron:基于 Electron 的官方 C'YaPass 桌面应用程序(可在 Windows、Linux、Mac 上运行)[^]
- GitHub - raddevus/CYaPass-Web:基于 HTML5、JavaScript、Bootstrap 的 CYaPass 解决方案 - 再也不用记密码[^] -- cyapass.com 上运行的最新版 C'YaPass 的所有源代码
- 创建认证加密和使用 AES256 加密您的数据[^]
最后一点 - 加密数据看起来是什么样子?
它是 Base64 编码的,所以看起来像这样。
QA0KVapeDs0xAhOrL8/ub8ZTvNjSsXrVy9WgTfMhODMaaJ6q9/1U...
它只是字节在加密后的编码。
历史
- 2022 年 7 月 26 日:本文初次发布。包含 C'YaPass 的 ElectronJS(及 Web)版本 1.4.0