是否可以为我的电子申请创建产品密钥?

时间:2017-06-22 19:53:40

标签: electron serial-number product-key

我想构建桌面应用程序并能够发布产品密钥或序列号。在用户可以使用该应用程序之前,他将被要求输入产品密钥/序列号。

与Microsoft Office类似,提供XXXX-XXXX-XXXX-XXXX等密钥

我的想法是根据许可证销售应用程序,并为每个设备提供产品密钥似乎比帐户(用户名和密码)更专业。

所以我的问题是:

1)是否可以使用electron完成此操作?

2)你能告诉我我应该去序列号(如果可行的话)还是账号?还是有更好的选择?

3)如果你回答了第二个问题。请说明原因?

4 个答案:

答案 0 :(得分:10)

对于您的第一个问题,,您绝对可以实施产品密钥以授权Electron应用程序(我自己已经完成了几次)。对于您的第二个问题,我建议您使用具有关联许可的用户帐户,例如用户2可以执行X和Y,而用户2只能执行X。

那么为什么 - 提供用户帐户有什么优势呢?

首先,它消除了您和您​​的客户跟踪许可证密钥的需要(一个巨大的烦恼,特别是当他们丢失它们时),因为它们都可以在其用户帐户内幕后处理。他们所要做的就是登录(就像他们过去常做的那样!)然后您就可以查询与其用户帐户相关联的所有许可证。

也许最重要的是,通过实施用户帐户,您可以为您的客户提供自助服务许可证激活!即,由于他们的所有许可证(注意多个许可证,即每个用户多个许可证的可能性)现在与单个用户帐户相关联,因此您可能会提示他们例如当他们在无法识别的机器上启动您的应用程序时,购买新的许可证,或者轻松提供产品"附加组件"有关其他功能。

如果您不是特别热衷于编写自己的许可系统,我是一个名为Keygen的软件许可API的创始人,它可以帮助您快速启动和运行托管和编写自己的许可服务器。我为独立开发人员构建了Keygen,尤其是构建桌面应用程序的开发人员。我最初在编写了我的第一个Electron应用程序之后创建了这项服务,并且意识到(令人惊讶的是)当时没有这样的服务,这对我来说相当令人沮丧。所以我为自己和其他开发者写了一个。

由于Keygen只是一个API(即您的应用程序无需软件包装),因此Keygen可以用于任何编程语言(因此我们不仅限于JavaScript)。以其最简单的形式,例如没有用户帐户,只有许可证密钥,使用Keygen验证许可证密钥就像点击单个API端点一样简单,

curl -X POST https://api.keygen.sh/v1/accounts/dc7ac1f74ce0/licenses/actions/validate-key \
  -H 'Content-Type: application/vnd.api+json' \
  -H 'Accept: application/vnd.api+json' \
  -d '{
        "meta": {
          "key": "B8A5-91D7-CB9A-DAE4-4F6E-1128"
        }
      }'

就像我上面提到的,除了许可管理之外,Keygen还提供API端点来管理用户帐户(我建议再次使用它作为一个更好的用户体验),允许您将许可与用户关联,以及跟踪他们使用您的应用程序的计算机,如果您希望为每个用户实施多个许可证(例如功能许可证),机器锁定许可证或者您只想知道每个用户拥有多少台计算机,这非常有用。

我希望能回答您的问题,并为您提供一些见解。很高兴回答您的任何其他问题,因为我已经为Electron应用程序实现了几次许可。 :)

答案 1 :(得分:1)

  1. 是的但是关于软件注册机制,它很难,它也需要大量的测试。
  2. 如果90%的用户拥有互联网访问权限,您一定要使用用户帐户或某些OAUTH 2.0即插即用功能(使用facebook / gmail /登录等)
  3. 我使用crypto和fs模块从头开始构建了一个软件许可架构,这是一个非常的旅程(年)!
  4. 不建议从头开始为您的软件建立良好的注册机制,因为源代码相对暴露,电子使其变得更难。

    话虽如此,如果你真的想这样,bcrypt擅长这个(哈希),你需要一个唯一的用户标识符来哈希,你还需要某种持久性(最好是文件),你可以存储用户许可证,您需要通过散列哈希值来隐藏用于散列的盐,或者将其中的一小部分存储在单独的文件中。

    这将为许可提供一个良好的起点,但它远未完全安全。

    希望它有所帮助!

答案 2 :(得分:1)

是的,它是可能的。

我自己想要这个功能,我找到了相关的解决方案,例如 paid video tutorials、在线解决方案 [with Keygen] 和其他随机黑客,但我想要一些离线 strong> 和 免费,所以我创建了自己的存储库供自己/其他人使用。这是它的工作原理。

概述

  1. 安装secure-electron-license-keys-cli。 (即npm i -g secure-electron-license-keys-cli)。
  2. 通过运行 secure-electron-license-keys-cli 创建许可证密钥。这会生成 public.keyprivate.keylicense.data
  3. 确保 private.key 安全,但将 public.keylicense.data 放在您的 Electron 应用的根目录中。
  4. 安装secure-electron-license-keys。 (即npm i secure-electron-license-keys)。
  5. 在您的 ma​​in.js 文件中,查看此示例代码并添加必要的绑定。
const {
    app,
    BrowserWindow,
    ipcMain,
} = require("electron");
const SecureElectronLicenseKeys = require("secure-electron-license-keys");
const path = require("path");
const fs = require("fs");
const crypto = require("crypto");

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win;

async function createWindow() {

    // Create the browser window.
    win = new BrowserWindow({
        width: 800,
        height: 600,
        title: "App title",
        webPreferences: {
            preload: path.join(
                __dirname,
                "preload.js"
            )
        },
    });

    // Setup bindings for offline license verification
    SecureElectronLicenseKeys.mainBindings(ipcMain, win, fs, crypto, {
        root: process.cwd(),
        version: app.getVersion(),
    });

    // Load app
    win.loadURL("index.html");

    // Emitted when the window is closed.
    win.on("closed", () => {
        // Dereference the window object, usually you would store windows
        // in an array if your app supports multi windows, this is the time
        // when you should delete the corresponding element.
        win = null;
    });
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", createWindow);

// Quit when all windows are closed.
app.on("window-all-closed", () => {
    // On macOS it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== "darwin") {
        app.quit();
    } else {
        SecureElectronLicenseKeys.clearMainBindings(ipcMain);
    }
});
  1. 在您的 preload.js 文件中,查看示例代码并添加支持代码。
const {
    contextBridge,
    ipcRenderer
} = require("electron");
const SecureElectronLicenseKeys = require("secure-electron-license-keys");

// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld("api", {
    licenseKeys: SecureElectronLicenseKeys.preloadBindings(ipcRenderer)
});
  1. 查看示例 React 组件如何验证许可证的有效性,并在您的应用内采取相应措施。
import React from "react";
import {
  validateLicenseRequest,
  validateLicenseResponse,
} from "secure-electron-license-keys";

class Component extends React.Component {
  constructor(props) {
    super(props);

    this.checkLicense = this.checkLicense.bind(this);
  }

  componentWillUnmount() {
    window.api.licenseKeys.clearRendererBindings();
  }

  componentDidMount() {
    // Set up binding to listen when the license key is
    // validated by the main process
    const _ = this;

    window.api.licenseKeys.onReceive(validateLicenseResponse, function (data) {
      console.log("License response:");
      console.log(data);
    });
  }

  // Fire event to check the validity of our license
  checkLicense(event) {
    window.api.licenseKeys.send(validateLicenseRequest);
  }

  render() {
    return (
      <div>
        <button onClick={this.checkLicense}>Check license</button>
      </div>
    );
  }
}

export default Component;

大功告成!

更多细节

为了进一步解释,许可证是通过来自客户端(即前端)页面的请求进行验证的。客户端通过此调用 (window.api.licenseKeys.send(validateLicenseRequest)) 向主(即后端)进程发送一个 IPC request

一旦后端进程收到此调用(因为我们使用此调用 (SecureElectronLicenseKeys.mainBindings) 设置它而被连接),库代码尝试使用 {{1} 解密 license.data }.无论成功与否,成功状态都会发送回客户端页面(通过 IPC)。

如何按版本限制许可证密钥

我所解释的内容非常有限,因为它不限制您可能提供给特定用户的应用程序版本。 public.key 包括您在生成许可证密钥以设置许可证的特定主要/次要/补丁/过期值时可能传递的标志。

如果您想允许最多 7 个主要版本,您可以运行命令来生成许可证文件,如下所示: secure-electron-license-keys-cli

如果您想允许主要版本最多为 7 并在 2022 年 12 月 31 日到期,您可以运行以下命令来生成许可证文件,如下所示: secure-electron-license-keys-cli --major "7"

如果您确实运行这些命令,您将需要更新您的客户端页面以与它们进行比较,即:

secure-electron-license-keys-cli --major "7" --expire "2022-12-31"

repository page 包含更多选项的详细信息,但这应该会为您提供要点您必须执行的操作。

限制

这并不完美,但可能会处理 90% 的用户。这并不能防止:

  • 有人反编译您的应用并制作自己的许可证以完全使用/删除许可证代码
  • 有人复制许可证并将其提供给他人

如果您要打包多个或自动化的 .exe,还需要考虑如何运行此库,因为这些许可证文件需要包含在源代码中。我会把它留给你的创造力来解决。

额外资源/免责声明

我构建了此问题中提到的所有 secure-electron-* 存储库,并且我还维护了 secure-electron-template,其中已将许可证密钥的设置预烘焙到解决方案中,如果你需要一些交钥匙的东西。

答案 3 :(得分:0)

有很多服务可帮助您将基于许可证密钥的软件许可添加到您的应用中。为了确保您的客户不会重复使用密钥,您将需要强大的设备指纹算法。

您可以尝试Cryptlex。它提供了具有高级设备指纹算法的非常强大的许可解决方案。您可以在Node.js上查看Github示例,为您的电子应用添加许可。