当前位置: 首页 > news >正文

PasswordVault —— 在 UWP 应用中安全地保存密码

只要你做过自动登录,一定会遇到密码的安全问题。现在大部分的网络服务都已经支持 Token 了,有些已经支持 OAuth2.0,这意味着客户端不怎么需要关心密码的安全保存问题。

但是,依然还有一些古老的服务和协议需要直接传输密码,比如邮件的 IMAP 协议。


我在 ERMail 应用的开发中就遇到了这样的问题,作为一款邮件客户端,IMAP 协议下的自动登录依然要在用户的本地保存密码。

无论你采用哪一种加密协议保存用户的密码,由于客户端与黑客的信息量都是相同的,所以客户端能解密出来黑客就一定能解密出来。所以,单纯地依靠应用自身是无法完成安全的密码保存的,利用操作系统、密码服务器或者其他硬件作为中转是一定需要采用的方案。

后两者的成本较高,采用操作系统自带的凭据管理器是成本较低的方案。于是我找到了 PasswordVault

微软官网对 PasswordVault 有全面的介绍:PasswordVault Class (Windows.Security.Credentials) - UWP app developer - Microsoft Docs,使用起来也是非常简单的。通过 Add(PasswordCredential) 方法完成密码的保存,使用 Retrieve(String, String?wt.mc_id=MVP) 完成密码的读取。

每一个 UWP 应用之间的 PasswordVault 是独立且互相不可访问的,普通用户也无法直接获取到密码;对于黑客,如果无法黑掉用户账户,也是无法解密出密码的,所以在一般使用场景下,安全性是够的。

如果需要保存密码:

var vault = new PasswordVault();
vault.Add(new PasswordCredential("Walterlv.Demo.Uwp", "walterlv", "t^vxR1kuR7@7*zZh"));

其中,walterlv 是保存的用户名,t^vxR1kuR7@7*zZh 是保存的密码。

如果需要获取此前保存的密码:

var vault = new PasswordVault();
var credential = vault.Retrieve("Walterlv.Demo.Uwp", "walterlv");
var password = credential.Password;

得到的 password 即是密码字符串 t^vxR1kuR7@7*zZh

在 ERMail 中,考虑到多数代码是跨平台的,所以我使用 IPasswordManager 接口来隔离这种 UWP 平台特定的方法。于是 ERMail 的 UWP 版本的密码管理实现就像如下这么简单:

using Windows.Security.Credentials;
using Walterlv.ERMail.Mailing;

namespace Walterlv.ERMail.Utils
{
    internal class PasswordManager : IPasswordManager
    {
        private const string MailVaultResourceName = "Walterlv.ERMail";

        internal static IPasswordManager Current = new PasswordManager();

        string IPasswordManager.Retrieve(string key)
        {
            var vault = new PasswordVault();
            var credential = vault.Retrieve(MailVaultResourceName, key);
            return credential.Password;
        }

        void IPasswordManager.Add(string key, string password)
        {
            var vault = new PasswordVault();
            vault.Add(new PasswordCredential(MailVaultResourceName, key, password));
        }
    }
}

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
  • 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
  • 使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松
  • git subtree 不断增加的推送时间,解不玩的冲突!这篇文章应该能救你
  • 阻止某个 NuGet 包意外升级
  • 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程
  • 在 Visual Studio 的解决方案资源管理器中隐藏一些文件
  • 长期支持 LTS(Long-term Support)是怎样的一种支持方式
  • .NET Standard 的管理策略
  • 如何在 .NET/C# 代码中安全地结束掉一个控制台应用程序?通过发送 Ctrl+C 信号来结束
  • Windows 10 应用创建模糊背景窗口的三种方法
  • 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名
  • 程序员与英语:即时聊天中的英语缩写 lol / lmao / idk
  • 使用 IFTTT 做 RSS 的邮件订阅服务
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angular 2 DI - IoC DI - 1
  • Asm.js的简单介绍
  • CAP 一致性协议及应用解析
  • github指令
  • in typeof instanceof ===这些运算符有什么作用
  • Java精华积累:初学者都应该搞懂的问题
  • learning koa2.x
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node 版本过低
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python实现BT种子转化为磁力链接【实战】
  • supervisor 永不挂掉的进程 安装以及使用
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从零开始的无人驾驶 1
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 反思总结然后整装待发
  • 机器学习学习笔记一
  • 开发基于以太坊智能合约的DApp
  • 前端之React实战:创建跨平台的项目架构
  • 世界上最简单的无等待算法(getAndIncrement)
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #if和#ifdef区别
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (10)ATF MMU转换表
  • (LeetCode) T14. Longest Common Prefix
  • (二)springcloud实战之config配置中心
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (九十四)函数和二维数组
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三)elasticsearch 源码之启动流程分析
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)ObjectiveC 深浅拷贝学习
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Net IOC框架入门之一 Unity
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net 中Partitioner static与dynamic的性能对比