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

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

2018-06-15 13:43

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

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


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

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

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

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

每一个 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://walterlv.com/post/uwp-password-vault.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏听雨堂

Apache+wsgi+flask部署

flask自带的web server是开发用途,并不适用与发布,需要借助专业的web服务器。 配置的坑无数,Apache部署,403禁止,莫名其妙无法访问,50...

40790
来自专栏Golang语言社区

Golang之chan/goroutine

最近在team内部培训golang,目标是看看golang能否被C工程师快速掌握。我定了个一个月,共计20小时的培训计划,首先花10个小时(两周,每天1小时)让...

38770
来自专栏小狼的世界

Mac OS X下GnuPlot的安装

Gnuplot是一个科学界广泛使用的作图软件,从Unix软件发展而来,是一款免费软件。因为其强大的作图功能,逐渐也有其他行业的人来维护支持这个软件,使其变的越来...

23110
来自专栏北京马哥教育

Linux系统六个最佳PDF文档阅览器,看看哪款更适合你

目前,互联网在线图书与其他相关文档正越来越多的使用PDF格式的文件,因此如果你使用的是桌面Linux发行版,那么选择一个合适的PDF阅览器就变得格外重要。 在本...

40750
来自专栏编程

年底总结一下Python WEB最好用的几个框架,让你有一个系统的了解

2017年就要过完了,我们来总结一下2017年最好用的17个Python Web框架 群内不定时分享干货,包括2017最新的python企业案例学习资料和零基础...

90080
来自专栏非著名程序员

如何在 Windows 下像 Mac 一样优雅开发

起因:之前一直用 Mac 开发,换了家公司,只许用 Windows 下开发,说实话,一开始我是拒绝的,可自从看到了这几个工具以后...... 下文大标题说明:(...

47390
来自专栏信安之路

Pentester Lab SQL to shell

首先先介绍一款工具,个人觉得老牛逼——Netdiscover,之前我询问一哥们arp扫描工具时他推荐的。

9900
来自专栏FreeBuf

如何设置自己的Dionaea蜜罐来收集恶意软件样本

许多安全人员都热衷于恶意软件的逆向工程。在本文中我将教大家设置一个自己的Dionaea蜜罐,来协助我们恶意软件样本的收集工作。

15840
来自专栏技术博文

Git分支管理策略

文章转自:http://www.ruanyifeng.com/blog/2015/08/git-use-process.html。感谢作者辛苦撰写 眼下最流行的...

30470
来自专栏张善友的专栏

腾讯社区开放平台.NET SDK在Mono下运行

腾讯社区开放平台.NET SDK在CentOS下运行发生了如下错误: QzoneException:  QConnectSDK.Exceptions.Qzon...

21580

扫码关注云+社区

领取腾讯云代金券