我正在建立一个网站,它将允许用户将存储在他们的在线配置文件(“数据提要”)中的信息集中在一个地方。
我想知道-从安全性的角度来看,在我的数据库中存储用户名/密码信息的接受方式是什么?
通常,我会从密码中得到一个咸散值,并将其存储起来,但在这种情况下显然行不通,因为“数据提要”网站需要一个实际的密码。
将凭证存储在明文中并不是一种选择,因为这将是一个巨大的安全风险。
不将密码存储在数据库中,要求用户在每个会话开始时输入密码,然后将它们保存在会话内存中似乎也不是一个可行的选择,因为用户多次输入相同的密码太麻烦了。
到目前为止,唯一的选择似乎是以某种方式加密密码,但我不知道这种选择的最佳设计模式是什么。
或者有办法解决这个问题,我甚至没有考虑过.
你有什么推荐的?
发布于 2013-06-20 09:07:24
由于您正在有效地提供(有限的)在线密码管理器服务,您可以查看脱机密码管理器如何为其用户存储密码。
我这种功能的餐巾纸设计是使用对称加密将密码存储在数据库中,其中密钥要么由用户提供,要么来自用户提供的密码。这样,用户只需在会话开始时提供一个密码,而不考虑以这种方式解锁的数据提要的数量。
发布于 2013-06-20 09:36:36
我认为您正在寻找的是所谓的单点登录:
资料来源:维基百科
多个相关但独立的软件系统的访问控制特性。使用此属性,用户一次登录并获得对所有系统的访问权,而不会被提示再次在每个系统上登录。相反,单点注销是一种属性,一个单独的注销操作就终止了对多个软件系统的访问。
实现单点登录的挑战是,您必须为所有系统似乎使用的每种独特类型的身份验证机制提供实现细节。在OOP应用程序中,通常会编写身份验证提供程序,它们知道如何检索凭据和与外部系统的接口,到系统启动和执行“握手”的地方,然后在会话的其余部分保留此信任。
单面散列像盐化的文摘是行不通的,但你已经知道了。强双向加密是必要的,但您将需要一个密钥来执行此操作。将加密的凭据存储在另一台计算机上的数据库中,并锁定服务器防火墙只公开所需的端口。以一种模糊、不明显的方式保持应用程序服务器上的密钥。将密钥保存在单独的机器上,而不是存放数据库和加密凭据的机器上,可以降低如果单个计算机受到破坏的风险。您可以想到的任何其他步骤都会进一步混淆,这将有助于安全性。
编辑:用户Bart Van Ingen关于密钥的建议是理想的情况,用户在登录时提供密钥,免除您在自己的系统上维护密钥/密钥的责任。
发布于 2013-06-20 09:35:16
通常的方法是使用单向散列(当然,当我在这里说“散列”时,您应该把“加盐”)存储在数据库中。然后,当用户输入密码时,也会散列(使用相同的散列函数)并比较散列。
但是,我不建议您构建自己的安全系统。原因是安全性很难,你不会比那些已经构建了安全系统的人更了解它(你问这个问题的事实也证实了这一点),你不应该认为你能做得比他们更好。
您的web服务器软件提供安全系统吗?您的操作系统提供安全系统吗?如果是这样的话,如果可以的话,那就用这些来代替滚动你自己的。它们是经过试验和测试的,它们是由安全专家设计的,它们是为了满足安全认证的要求而设计的,不管你怎么想,你都不能自己写一个更好的。
如果这不是一个选项,那就使用像OpenID,Google之类的东西。只需使用已经被证明有效并且已经解决了bug(更不用说安全风险)的东西。
https://softwareengineering.stackexchange.com/questions/202111
复制相似问题