密码存在内存里安全吗?

问:

我刚刚意识到在任何语言里,当你把密码保存到一个变量里,它将以文本的形式存放在内存里。

我认为操作系统将发挥作用,禁止进程相互访问彼此分配的内存。但是我也认为这多少有些不是靠谱的做法。因此我想知道这是不是真正安全的,是否有更加安全的存储密码的方法,来确保外部进程不能访问它们。

我没有指定操作系统或者语言,因为我的问题是非常普遍的。这更像是一个计算机常识问题、而不是具体的问题。

答:

你点到了一个痛处……

从历史上讲,计算机是大型机,允许许多不同的用户在相同的物理机上建立会话和进程。类Unix系统(比如Linux),还有VMS和其相关亲戚(和包括所有NT、和此后的2000,XP, Vista, 7, 8…… 的Windows家族,),设计之初是为了支持大型机模型。这样,硬件提供权限级别。操作系统最重要的部分是内核,它以最高权限级别运行(是的,我知道对于虚拟化有些微妙),并管理权限级别。应用程序以较低级别运行,内核禁止它读、写其他应用程序的内存。应用程序按页(page,通常4或8KB)从内核获得RAM。如果一个应用程序试图访问另一个应用程序的页,内核就会阻止它,并且受到严重惩罚(”segmentation fault”, “general protection fault”)。

当一个应用程序不再需要页(特别是在该应用程序还存在的时候)时,内核会控制该页,可能会分给另一个应用程序。现代操作系统在使用这些页的时候,会“清空”(blank)该页,这里的“清空”指“用零填充”,从而阻止数据从一个进程泄露到另一个进程。注意,Windows 95/98/Millenium没有清空页,泄露有时候会出现……但是,这些操作系统是针对单台机器的单个用户的。

当然,有很多绕过内核的方法:应用程序有一些方式来获取“足够的权限”(没有上面权限高的、同种类型权限)。Linux系统有ptrace(),内核允许一个进程通过ptrace()读写另一个进程的内存,此时这两个进程需要运行在同一个用户ID下,或者运行ptrace()进程的是“root”用户。相似的功能也存在于Windows。

底线是RAM里的密码没有操作系统允许的安全。按照定义,在进程内存里存储一些机密数据有个前提,就是你相信操作系统不会把数据给第三方。操作系统是你的朋友,因为如果它是敌人,那么你就失去了一切。

...

web开发收集

下面是在做web项目时试着牢记于心的、动态更新的清单。有些是逻辑上的,有些是个人喜好。

我尽量遵守这里面的规则。

Design/UI

GitHub的公开演讲文化

2013年在某个地方为GitHub 240名员工中的三分之一或一半员工做演讲。

鼓励你的员工在大会上做演讲通常被认为是一件好事。另外对于GitHub,它还是一种好的广告:和我们花钱砸在banner广告上不同,直接给客户演讲就是我们能做的、最有效的营销。同时,它也有利于招聘工作。我们从来不缺简历。

管理工作通常集中在两个方面——广告和招聘——这是员工演讲的主要商业动机。当然,这不是全部。支持你的员工,鼓励他们在公开场合讨论他们的经验,很快你就会抓住每一个其他公司完全错过的机会。

员工当老师

在你教别人之前,你是不会真正了解某些东西的。这是人们说的比较好的警句,的确如此,如果你不是站在台上、在内心深处赶上这个糟糕的时刻,你是不能真诚地理解这句话的,那时候你才意识到你不得不向几百人说清楚一个概念。

为初学者做一份幻灯片和故事是十分让人气馁的,为了成功,你必须知道你的不足。通常意味着阅读你以前没有看过的文档,让你的大脑去解释以前没有考虑过的想法,从而比你以前更加熟悉这个概念。

再看一次上面最后一句话。你几乎可以培养出更好、更有竞争力的员工。

公开演讲就是公开文档

我喜欢谈论GitHub做为一个公司是如何协同工作的:我们的开发实践,我们的沟通工具,还有我们的内部机制。

直到最近,我才真正意识到这对于我们内部的公司文化是多么地重要。好处是双重的:新员工在开始之前对于如何做事情已经有了粗略的了解,而且更重要的是,所有的演讲和博文都是我们内部依赖的文档。由于我们的操作相当开放,当我们内部讨论、推行文化的时候,我们手头有更多有形的东西。你能够影响每个人之间的相同的术语。例如,当有人提到公司的异步工作流时,我们都会有一个基础的理解,它是什么,以及它不是什么。

这是微妙的,但它很强大。随着你的成长,公司文化很难弄清楚和保持。

社区领袖

演说者通常被看做某种精英群体,他们具有普通人没有的、某种与生俱来的知识。这完全是胡扯,但必须承认 演说者在会见社区其他人方面处于有利地位 的现实。

...