Solaris 开发者安全性指南

在 GSS-API 中比较名称

请考虑以下情况:服务器从客户机收到一个名称,并且需要在访问控制列表中查找该名称。 访问控制列表(即 ACL)是指具有特定访问权限的主体的列表。 下面是一种用于进行查找的方法:

  1. 使用 gss_import_name() 以 GSS-API 内部格式导入客户机名称(如果该名称尚未导入)。

    在某些情况下,服务器将以内部格式接收名称,因此可不必执行该步骤。 例如,服务器可能会查找客户机本身的名称。 在启动上下文的过程中,客户机本身的名称以内部格式进行传递。

  2. 使用 gss_import_name() 将每个名称导入到 ACL 中。

  3. 使用 gss_compare_name() 将所导入的每个 ACL 名称与所导入的客户机名称进行比较。

此过程如下图所示。 在本示例中,假设步骤 1 是必需的。

图 4–4 比较名称(慢速)

该图说明如何使用 gss_compare_name 函数比较客户机的内部名称。

如果只有少数名称,则可以接受使用上述单独比较名称的方法。 如果有大量名称,则使用 gss_canonicalize_name() 函数会更高效。 此方法会执行以下步骤:

  1. 使用 gss_import_name() 导入客户机的名称(如果该名称尚未导入)。

    和上述比较名称的方法一样,如果名称已经采用内部格式,则不必执行此步骤。

  2. 使用 gss_canonicalize_name() 生成机制名称版本的客户机名称。

  3. 使用 gss_export_name() 生成所导出的名称,这是连续字符串形式的客户机名称。

  4. 使用 memcmp() 对所导出的客户机名称与 ACL 中的每个名称进行快速比较,该函数的开销较低。

此过程如下图所示。 同样,再次假设服务器需要导入从客户机收到的名称。

图 4–5 比较名称(快速)

该图说明如何使用 memcmp 函数比较客户机的内部名称。

由于 gss_export_name() 需要使用机制名称 (mechanism name, MN),因此 必须首先针对客户机名称运行 gss_canonicalize_name()

有关更多信息,请参见 gss_export_name(3GSS)gss_import_name(3GSS)gss_canonicalize_name(3GSS)