为桌面应用程序提供“管理员密码”的可能替代方法有哪些?


10

我目前正在管理和重构已经在我公司使用了十多年的软件。此应用程序的元素之一是一种管理员或高级用户模式,它提供诸如一些附加/内部输入之类的功能以及关闭输入限制的功能。

从历史上看,通过将一个专门命名的文件放置在Windows系统目录中的特定位置(这两个文件都已硬编码到应用程序中)中来打开该模式,即使该文件为空,该文件也被命名为“ something.DLL”。 ASCII文件而不是dll。

因此,我最近添加了一些代码和一些模式形式,允许用户输入管理员密码以启用此功能。这是一个设置的密码,而不是特定于用户的。输入正确的密码后,它会在应用程序的根目录中创建一个“密钥文件”,从而起到类似的作用,以便该程序可以在管理员模式下启动(如果存在该文件)。

现在,该软件主要用于的部门经理不太喜欢这个主意。他认为,如果我们只有一个简单的预设密码,它将很容易“滚蛋”,他不希望没有经验的用户访问这些额外功能。

所以我的问题是,还有什么其他方法可以提供这种访问,这种访问会更加安全?在维护和管理该软件时,几乎只有我一个人,所以几乎没有完全内置或自动化的任何内容都无济于事(例如发送对“许可证密钥”的请求或类似的请求)。

注意:此应用程序是用VB.NET(.NET 4.0)编写的,当前我计划在完成新版本后使用单击一次部署。


1
有人必须决定哪些用户“没有经验”,哪些不是。谁做出这个决定?谁必须将这些决定纳入系统?
布朗

Answers:


13

如果您有Active Directory,则可以测试Active Directory组中的成员身份:

public bool IsInADGroup(string ADGroupName)
    {
        bool result = false;
        List<string> myGroups = new List<string>();

        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, SystemInformation.UserDomainName))
        {
            using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, SystemInformation.UserName).GetGroups(pc))
            {
                src.ToList().ForEach(sr => myGroups.Add(sr.SamAccountName));
            }
        }
        result = myGroups.Contains(ADGroupName);
        return result;
    }

这是一个很好的答案,对于这个项目和其他项目,我一定会牢记。但是,真正的问题是该程序在我们公司之外的用户。我们为姊妹公司和一些外部第三方用户提供此服务。我实际上是在考虑这一点,最好是对我们网络之外的人完全禁用这些功能,并将您的建议用于内部目的。
安东尼

5

经理对密码泄露是正确的。这不是问题,而是何时。

由于某些用户无法使用Active Directory,因此您可以创建带有Windows登录名列表的签名文本文件,允许超级用户访问。这假设人们没有共享计算机或登录名。

用户名只会放在易于分发的文本文件中,该文件会放在应用程序的文件夹中。重要的部分是对用户名列表进行签名。保持非常简单。每行一个用户名,并将哈希放在最后一行。在程序二进制文件中嵌入某种密钥,并使用用户名对其进行哈希处理。私钥将防止人们修改文件,然后自己计算哈希值(可能一开始很难理解)。

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

当然,这需要某人充当授权用户列表的管理员。管理员应具有一个由您编写的程序(由您编写!)来生成文件和哈希。如果没有其他问题,它可能只是获取用户名的文本文件并添加哈希。

为了彻底了解,已被撤消访问权限的某人可以获取仍然有其登录名的文件副本。每当他们想要访问时,他们都可以将副本放置到位。不过,可能不必担心。


3

由于没有Active Directory选项,因此我将哈希当前日期。首先使用熵最大的元素(每月的天),最后使用熵最小的元素(年)。如果需要,请添加特定于域的盐(客户ID,公司名称等,因为它是在公司外部使用的)。这应该每天产生一个完全不同的密码,这对于最终用户来说几乎是不可能的,对于使用该软件的不同公司来说,密码也可能不同。

从本质上讲,这是一个鸡与蛋的问题,因为该软件需要能够在不打电话回家的情况下对用户进行身份验证。因此,使用一个真正模糊的破解机制来制造一个鸡蛋:尽管通过模糊性实现的安全性并不是真正的安全性,但这是您为问题提供的最佳参数。

这也比将文本文件放置在某处更好:这比静态密码更好,因为一旦机密信息泄露,游戏就结束了。


0

使用访问控制列表

快速而肮脏的方法是从应用程序目录中删除所有权限(包括读取权限),然后为所有允许运行该应用程序的用户添加这些权限。当然,具有权限的用户也可以轻松地将应用程序目录复制到公共位置,但这不太可能偶然发生,而密码共享很容易偶然发生。

当然,这假定所涉及的计算机是安全的(希望具有活动目录)。


如果所涉及的计算机使用活动目录保护,则最好仅通过加入安全组来保护高级功能。可以根据需要将用户添加到组中,并且文件系统权限无关
-Kevin Kevin

@凯文:同意。我认为Dan的答案涵盖了这一点。
布莱恩(Brian)

0

我的偏好为@Dan建议-使用活动目录。如果这不可能,那么基于时间的密码生成器将很有用。在类似的情况下(很久以前),我曾为我工作的公司使用9999-MMDD。几年后确实没有解决。如果您把hhmm扔进去并混合了一点,在有人把猫放出袋子之前,您可能会得到一两年的时间。

您总是可以编写一个使用类似但更复杂的策略生成密码的程序。还要在使用的名称中添加一个机器名称。您的经理可以运行该程序以获取该机器的当前密码。将一些信息存储在文件中,这样,如果将其复制到另一台计算机上或登录了其他用户,则该信息将无效。然后由您的经理来确保程序的安全,如果猫掉了,那是他的错。

从cyrpto的角度来看,此方案被认为是弱且不可靠的,但足以解决您遇到的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.