用户如何确定我的应用程序使用了收件人的公钥?我仍然可以用我自己的密钥加密消息,拦截它并用接收者的公钥转发它。为了经受安全专家的测试,我只能在特定用户或特定时间这样做。
在某种程度上,用户将始终需要信任提供他们使用的任何加密软件(以及加密软件使用或与其一起运行的任何库和操作系统组件)的人。
您可以通过发布客户端软件的源代码、邀请安全专家对其进行审查以及鼓励用户从源代码编译软件来在一定程度上缓解此问题。您可以发布源代码(和二进制文件,如果您分发任何)的 SHA-2 哈希,让用户验证他们下载的源代码是官方审查的版本,并鼓励用户共享和比较哈希以确保您的不会向不同的用户发送不同的哈希值。
最终,这些都不会完全阻止您在程序中隐藏恶意代码(即使用户在编译之前亲自审查了代码,编译器本身仍然可能存在Thompson hack),但它确实更有可能如果你尝试它,你会被抓住的。
我认为不可能在同一个应用程序中安全地加密和共享数据。因此,用户必须在另一个应用程序中加密数据并手动将其复制到共享应用程序中。
即使加密和共享功能分开,大多数信任问题仍然存在。
这样做的主要优点是,使用单独的加密应用程序,用户原则上可以在不允许与其他任何通信的沙箱中运行它,除了读取明文和写出密文(反之亦然)反之亦然)。这将使应用程序更难打开一个隐蔽通道将数据传输给第三方——尽管,如果没有对密文进行详细的手动检查,用户很难排除加密文件本身包含的可能性额外的信息或故意的弱点,以允许预期接收者以外的人对其进行解码。此外,在实践中,大多数用户实际上不太可能会在这样的沙箱中运行加密软件。
当然,另一个优势是,将加密和共享代码拆分为单独的应用程序意味着要审查的安全关键代码更少:如果共享应用程序永远不会看到未加密的数据,并且无法控制它的加密方式,那么它真的不需要如此详细审查。此外,如果加密和共享软件是由不同方提供的,那么它们串通破坏组合软件的安全性的可能性就较小(尽管仅仅破坏加密应用程序可能就足够了)。
最终,它确实归结为信任。你可以做各种各样的事情来鼓励信任,并限制你自己破坏信任的能力,但你不能完全消除它。
在你的位置上,为了尽量减少我自己破坏软件的能力,我会做的是:
开源您的应用程序,并公开邀请独立的安全审查。
鼓励用户从源代码编译您的应用程序。
分发您发布的所有源代码(和二进制文件)的 SHA-2 总和,无论是在您的网页上、在发布包中、在邮件列表上还是通过您能想到的任何其他渠道。鼓励您的用户分享和比较来自多个来源的这些校验和,如果它们看起来不匹配,请公开抱怨。
可能在程序中提供基线加密功能,但请明确注意这可能并不完全安全,并鼓励您的用户在此基础上使用额外的加密(他们选择的)。
将任何内置加密代码和代码的任何其他安全关键部分分离到单独的程序中。即使这些帮助程序默认自动调用,为了提供集成的用户体验,用户也应该可以在隔离环境中分别调用它们中的每一个。
不使用按需代码分发(例如浏览器内的 JavaScript)或任何类型的自动更新机制:这些使得向特定用户交付受损代码变得非常容易(例如以错误修复更新为幌子)。唉,避免这些机制也使得向用户分发合法的错误修复变得更加困难,所以这里有一个棘手的安全权衡。
您可以在这里做的最好的事情是 a) 通过用户已经信任的渠道分发更新,并且最好至少涉及一些外部审查,例如 Linux 上的系统包管理器,或者 b) 轮询更新(通过 SSL ),但不要自动下载它们;鼓励您的用户在安装更新之前通过外部渠道验证确实存在合法更新(并执行上述 SHA-2 总和检查)。
接受这一点,无论我做什么,软件总是有可能被破坏。还要接受,在实践中,大多数用户不会关心,并且会满足于信任你,不管他们是否应该。