生成唯一硬件 ID 的可靠方法

2024-05-01

问题:我必须为每个联网客户端提供唯一的 ID,例如:

  • 一旦客户端软件安装在目标计算机上,它(ID)应该持续存在,并且如果在同一台计算机和相同的操作系统安装上重新安装软件,它应该继续存在,
  • 如果以大多数方式修改硬件配置(除了更改主板),它不应该改变
  • 当安装了客户端软件的硬盘驱动器被克隆到另一台具有相同硬件配置(或尽可能相似)的计算机时,客户端软件应该知道该更改。

一些解释和一些背景故事:

这个问题基本上是一个古老的问题,也涉及软件复制保护的主题,因为这里提到了该领域使用的一些机制。我现在应该明确的是,我并不是在寻找复制保护方案。请继续阅读。 :)

我正在开发一个应该在本地网络中工作的客户端服务器软件。我必须解决的问题之一是识别网络中的每个唯一客户端(不是什么大问题),以便我可以将某些属性应用于每个特定客户端,在特定的部署生命周期内保留和强制执行这些属性客户。

当我寻找解决方案时,我意识到以下几点:

  • Windows激活系统使用某种对硬件修改极其敏感的重型指纹识别机制,
  • 磁盘映像软件沿所有卷 ID(格式化时绑定到每个分区)以及安装过程中、首次运行期间或以任何其他方式自定义、唯一生成的 ID 进行复制,其本质上是严格的软件,并存储在注册表或位于硬盘驱动器上,因此很容易混淆两者。

解决此类问题的明显选择是找出 BIOS 标识符(不过,不能 100% 确定这在相同的主板型号中是否是唯一的),因为这是我唯一可以依赖的不重复、通过克隆传输的东西,并且无法更改(至少不能通过使用某些用户空间程序)。其他一切都会失败,因为要么不可靠(MAC 克隆,有​​人吗?),要么要求太高(对配置更改太敏感)。

我想问的子问题是,我在架构方面做得正确吗?也许有一个更好的工具来完成我必须完成的任务......

我想到的另一种方法类似于握手机制,其中服务器维护已连接客户端 ID 的内部查找表(甚至可以完全基于软件并且在任何给定时刻都不是唯一的),并告诉客户端如果连接时提供了重复的 ID,则在握手期间提供不同的 ID。不幸的是,这种方法并不能很好地满足在生命周期内将属性与特定客户端绑定的要求之一。


在我看来,你应该构建符合你的要求的唯一ID。该 ID 可以构造为hash(如 MD5、SHA1 或 SHA512)来自对您重要的信息(有关软件和硬件组件的一些信息)。

如果您使用私钥签署此类哈希并且您的软件在启动过程中进行验证,则可以使您的解决方案更加安全,该密钥(签名哈希值) 已签名(只有公钥必须与您的软件一起安装)。人们可以通过不同的在线服务来扩展这种解决方案,但企业客户可能会发现在线服务不太好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成唯一硬件 ID 的可靠方法 的相关文章

随机推荐

  • Java:通过 UserObject 字段递归搜索 TreeModel?

    我有一个使用 DefaultTreeModel 的 Jtree 每个单独的节点都包含一个包含各种字符串字段的 UserObject 我想通过递归遍历来查找并选择一个节点 直到找到 UserObject 与其字段之一匹配的 DefaultMu
  • 如何在bootstrap中使用垂直对齐

    简单的问题 如何使用 bootstrap 在一个列内垂直对齐一个列 这里的例子 我想垂直对齐child1a和child1b http bootply com 73666 http bootply com 73666 HTML div cla
  • GDB/bin/bash 无法在 Eclipse CDT 中执行应用程序?

    在 Mac OS X Mojave 上使用 Eclipse CDT 运行 GDB 时遇到困难 当我尝试调试项目时 GDB 表现得很混乱 我能够调试几次 但随后它在下一个调试会话开始时开始停止 并显示消息 配置 GDB 可执行文件是 User
  • 将数据持久保存在 Oracle 数据库的 docker 卷中

    我创建了用于存储我的应用程序数据库数据的卷 docker volume create dbvolume 然后我启动了带有 Oracle XE 11g 数据库映像和数据卷的 docker 容器 docker run name OracleXE
  • 如何在 Perl 中序列化数组引用数组?

    Perl 有很多用于序列化数据的模块 我不知道该选择哪一个 我需要将以下数据序列化为字符串 以便将其放入数据库中 my categories Education Higher Education Colleges Schooling Col
  • ng build 无法在“History”上执行“replaceState”:无法在原始“null”和 URL 的文档中创建带有 URL 的历史状态对象

    我使用的是 Google Chrome 版本 52 我希望能够通过访问 index html 在本地运行我的应用程序 而无需服务器 我能够访问我的应用程序的登陆页面 但是 当我尝试导航到另一个页面或单击任何按钮时 它无法工作 我尝试了很多方
  • Solr 4.0 中的 BaseTokenFilterFactory 去哪儿了?

    用于创建您自己的标记和字符过滤器的 Solr 文档说明如下 http wiki apache org solr AnalyzersTokenizersTokenFilters Specifying an Analyzer in the sc
  • 按 IN 值列表排序

    我在 PostgreSQL 8 3 中有一个简单的 SQL 查询 它捕获了一堆评论 我提供一个sorted的值列表IN构造在WHERE clause SELECT FROM comments WHERE comments id IN 1 3
  • Android 中的 Ping 应用程序

    我正在制作一个应用程序 它将实现 ping 命令的一些功能 问题是 我不知道在 ANDROID 中使用哪个 哪些库 有人对此有什么想法吗 我访问过这些 stackoverflow 链接 但它们并不是很有帮助 有没有办法让 Android 设
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • 为什么 django 强制所有模型类都在 models.py 中?

    我刚刚了解到 将模型类拆分为不同的文件会破坏 django 的许多内置功能 我有java背景 在那里 编写很长的类文件并不被认为是一种好的做法 但是 django 对所有模型类强制执行单个文件可能会导致程序员编写很长的 models py
  • 以编程方式在 Material-UI 中打开工具提示

    我需要能够向元素添加工具提示 以便它像正常一样运行 当元素悬停时打开 同时我需要能够以编程方式打开它 我知道它有openprop 允许这样做 但在这种情况下 我会将组件从不受控制切换到受控制 这是不可能的 我也无法总结 hover工具提示内
  • 在 WPF FlowDocument 中的指定位置插入超链接

    我想以编程方式将 WPF 超链接元素插入 FlowDocument 中 目标是创建一个工具栏按钮 该按钮将获取 RichTextBox 中的一系列文本并将其替换为超链接 它与您在网络上看到的用于在 wiki 或博客 或 StackOverf
  • SwiftUI 模态视图

    从任何类或结构中模态显示 SwiftUI 视图的最佳方式是什么 我使用 UIKit 中的 UIHostingController 有没有更好的方法只使用 SwiftUI 来做到这一点 带有用于呈现 SwiftUI 视图的按钮的 Conten
  • g++ 变量名有长度限制吗?

    看标题 简短回答 No 长答案 是的 它必须足够小才能适合内存 但否则就不行 不是真的 如果有一个内置的限制 我不相信有 那么它太大了 你真的很难达到它 事实上 你让我很好奇 所以我创建了以下 Python 程序来生成代码 usr bin
  • Xamarin HttpClient.GetStringAsync 不适用于 Xamarin.Droid

    我在 Xamarin 开发方面确实是个新手 我刚刚尝试使用 Xamarin Forms 使用共享代码开发 Android 和 iOS 应用程序 而我在这里尝试做的是使用 Plugin RestClient NuGet 包从 API 获取数据
  • 为什么 docker-compose ps 与 docker ps 不同?

    为什么 docker compose 创建的容器只能从 docker compose ps 访问 并且在杀死正在运行的容器后仍然存在 事实并非如此 docker ps只显示正在运行的容器 docker compose ps显示与当前撰写文件
  • 孤独的开发人员但有大量的 xhtml css jquery 工作?我应该使用版本控制系统吗?

    它对于单用户单台 PC 有用还是太过分了 我可以使用任何版本控制系统来节省时间并提高生产力吗 如果答案是肯定的 那么哪种免费版本控制系统最适合我以及如何节省时间 我在家和办公室工作 这两个地方我都可以上网 我想从这两个地方访问源代码 Upd
  • gitosis 要求输入密码

    我已经按照以下说明设置了 gitosis 服务器here http scie nti st 2007 11 14 hosting git repositories the easy and secure way 它对于初始用户来说效果很好
  • 生成唯一硬件 ID 的可靠方法

    问题 我必须为每个联网客户端提供唯一的 ID 例如 一旦客户端软件安装在目标计算机上 它 ID 应该持续存在 并且如果在同一台计算机和相同的操作系统安装上重新安装软件 它应该继续存在 如果以大多数方式修改硬件配置 除了更改主板 它不应该改变