Für sd.k. k. wird autorisiert

vv3.1

Für sd.k. k. wird autorisiert (v3)

Basis: widerstand gegen terroristenps-help/v3/doc/售卖方式与授权购买链路_v3.mdUnd das hilfszentrum_API_Oh, DOC (video iii). Ziel: Node/Python/Java das gleiche verhalten Von SDK im bezug auf die drei sprachen (wikinger, wan/python/java)

1. Wan - algorithmus (sprachübergreifende übereinstimmung)

Drei weitere sprachen für das gleiche gerät müssen erzeugt werden machineCode.

Lieutenant, fingerabdrücke.**Priorität.**Gültige werte sind in sämtlichen einheiten ungültig

fingerprint = 硬件序列号 → 系统机器 ID → hostname | os | arch(兜底)

Mit meiner landefähre fähre gemacht - priorität 1: hardware? - das ist - wir machen das mit meiner fähre - fähre fähre fähre dieselbe strecke?

System. Quelle. Mach den zugriff. Zugriff gewährt
Windows BIOS SerialNumber wmic bios get serialnumberDas ist eine PowerShell Get-CimInstance Win32_BIOS) Gewöhnlicher benutzer.
macOS Hardware ist eine festplatte system_profiler SPHardwareDataType Extraktion. Serial Number Gewöhnlicher benutzer.
Linux B) die seriennummer lesen /sys/class/dmi/id/product_serialherabstufung dmidecode -s system-serial-number) Sieht so aus.

Priorität 2: i.t. für die systemmaschine (erstellung in der installation)

System. Quelle. Mach den zugriff. Zugriff gewährt
Windows MachineGuid Anmeldeformular. HKLM\SOFTWARE\Microsoft\Cryptography Gewöhnlicher benutzer.
macOS IOPlatformUUID ioreg -d2 -c IOPlatformPlatformDevice Gewöhnlicher benutzer.
Linux machine-id lesen /etc/machine-idherabstufung /var/lib/dbus/machine-id) Alle benutzer.

Priorität 3: schachteln (hostname | os | Was wäre zu tun?

Hardware ist verfügbar, wenn sowohl die seriennummer als auch die systemid fehlgeschlagen sind

Felder. Node Python Java
hostname os.hostname() socket.gethostname() InetAddress.getLocalHost().getHostName()
os os.platform() sys.platform System.getProperty("os.name")
arch os.arch() platform.machine() System.getProperty("os.arch")

Bearbeitung in bearbeitung

  • Alle felder entfernen den leerstreifen am ende, und alle kleinschreibung:
  • Unkritische werte des filterersTo be filled by O.E.M. / None / 0 / Default / Not Available / Not Specified(annabelle).
  • Die fastenkombination ist vereint |Ganzheitlich. toLowerCase().
machineCode = 'M' + base64url( sha256( fingerprint ) ).slice(0, 32)

machineCode Mindestens 8 personen und das gesamte system ist exklusiv und sd.k. bildet einen internen lösch-stab.

2. Regeln zur autobiografie (spielsoftware/genergenera - selbstverständlich)

Zeichenkegel in einem festen gang gruppieren, abtrennen (keine notdown down werteedition Eine geisterleitungexpiryDays 0,licenseCode Leer (Leer) :

productUniqueCode \n machineCode \n edition \n expiryDays \n clientOrderId \n licenseCode \n timestamp

signature = base64url( HMAC-SHA256( licenseApiSecret, 签名串 ) );timestamp Millisekunden, plattform werden mit server zeigen ≤ fünf minuten (vor ab).

3. Die schnittstellen

Untertitel:https://www.powersoftware.app/frontApiWir sind startklar baseUrl Ist der in der tasche?

Interface. Route. Neue beschwerden! Für sd.k. eine methode.
Aktiviere jetzt. POST /license/activate ohne activate(licenseCode, machineCode)
Laborresultate. POST /license/verify ohne verify(licenseCode, machineCode, activationToken)
Machen sie sie los. POST /license/deactivate Software anloggen (browser-situation) deactivate(licenseCode, machineCode)
Die inneneinrichtung der software POST /license/software/generate Gezeichnet Von HMAC. generateForSoftware({...})
Software interne upgrade/gebühren POST /license/software/upgrade Gezeichnet Von HMAC. upgradeForSoftware({...})
Empfange die probe. POST /license/trial/claim ohne claimTrial(machineCode)

generateForSoftware / upgradeForSoftware Ein automatik. timestamp + signature;claimTrial Das produkt wird gebraucht, um erst zu bezahlen, wenn es gebraucht wird.

4. Lokale gutscheine und bestätigungen Von gültigkeit

  • In den staaten.Regal.:licenseCode,activationToken, in einem fall Von verify, später:{ valid, edition, expiryTime, trialExpiryTime } + zeitstempel trialExpiryTime ist der Snapshot der Testablaufzeit (ISO8601, null ohne Ursprung aus einer Testphase) und dient als Kulanzfenster für Funktionen höherer Editionen.
  • **Negativ. - negativ.**Entschlüsselbare, vollständig autorisierte informationen (keine funktion, nur verlangsamt).
  • Erlaubt prüfung des pflöhns 60s: überprüfen sie zunächst die pfünsterfunktionen als pfünder. Die lösung findet noch kein verfallsdatum. Falls ein programm überfällig ist Oder nicht läuft verify.
  • Die streichung/erstattung/aufwertung eines dienstleistungsbereichs führt zu einer aktiven deaktivierung (bereits auf der plattform erreicht), ohne dass sd.k. einen erkennung durchlaufen muss.

5.payling Von seiten abfangen und hacken

Zahlen sie das menü. Klicken sie dann:

  1. verifyCached(licenseCode, machineCode, activationToken) Ich kriege sie! Ich kriege sie!
  2. Ich kriege sie nicht! "kauft sie!",
  3. fälsche machineCodeSpringen sie auf die kaufseite productUniqueCodeDie er auch braucht.
https://www.powersoftware.app/product/license/purchase?productUniqueCode={productUniqueCode}&machineCode={machineCode}

(multilinguale stellen den pfad vor, z. B. mit sprachvornamen /en-US/product/license/purchase;productUniqueCode Regale einspeisen lassen.)

So wählt dickes einkaufsgelände:.appInternationaler stopp, v .cnNur ein paar verbindungen.

Im arc net gibt es zwei seiten, sd.k purchaseUrl() Passt! base Al: parameter und los:

powersoftware.appInternationaler sitz powersoftware.cnNur ein paar verbindungen.
Die zahlungsweise Ich bezahle den paytv Nur um eine zahlung zu leisten.
In land/währung Cloudleer dann stimmt es. Code, ich kriege den dollar. Permanent. country=CNDer yuan.
Sprache. (URL:) voreinstellung (url: Accept-Language Automatische kontrolle. Permanent. zh-CN
Anwender. International benutzer/übersee Nutzer vom chinesischen festland

Sd.k. standard. .appUnd keine automatischen entscheidungen. Das kunden-programm muss entscheiden, welche nachrichten gesendet werden base.

urteilsvermögen

Formel 1: sprache nach system (empfohlen)

import locale

def get_purchase_base():
    sys_lang = locale.getdefaultlocale()[0] or ""
    if sys_lang.startswith("zh"):
        return "https://www.powersoftware.cn"
    return "https://www.powersoftware.app"
function getPurchaseBase() {
    const lang = process.env.LANG || "";
    return lang.toLowerCase().startsWith("zh")
        ? "https://www.powersoftware.cn"
        : "https://www.powersoftware.app";
}
String getPurchaseBase() {
    return "zh".equals(Locale.getDefault().getLanguage())
        ? "https://www.powersoftware.cn"
        : "https://www.powersoftware.app";
}

Methode 2: benutzer festlegen Die schnittstelle stellt benutzeroptionen dar, die der nutzer selbst auswählen kann.

Weg 3: der harte code - nur tote software für den hausbenutzer base="https://www.powersoftware.cn".

Einzelheiten. 语言与国家逻辑 Das ist teil 2,40.

6. Fehler enthalten

codeNotFound,revoked,expired,machineLimit,tooManyAttempts,signatureInvalid,apiSecretMissing,productNotEnabled,trialNotEnabled,trialAlreadyPurchased,trialAlreadyPurchased,trialAlreadyPurchased,trialAlreadyPurchased,machineCodeInvalid,orderAlreadyUsed,editionRequired,productNotFound,trialFirstRequired,alreadyOwned Und nicht verlieren. Netzwerk/zeitverlust sind vereint NETWORK_ERROR.

7. Die masche

ps-sdk/
  node/     @mizhanchengxi/ps-license-sdk(ESM,零依赖)
  python/   ps-license-sdk(py3,零依赖)
  java/     com.powersoftware:sdk(Java 8+,JDK 自带 HTTP/加密)

Bietet alle drei taschen:machineCode(),sign(),LicenseClientDie sechste methode verifyCached + purchaseUrl(annabel)