Skip to main content

A common identity module

Project description

Ming Ke Ming (名可名) -- Identity Module

license Version

This document introduces a common Identity Module for decentralized user identity authentication.

Copyright © 2018 Albert Moky

0. Meta

The Meta was generated by your private key, it can be used to build a new ID for entity, or verify the ID/PK pair.

It consists of 4 fields:

Field Description
version Meta Algorithm Version
seed Entity Name
key Public Key
fingerprint Signature to generate address

0.0. Version

Now it's value always equal to 0x01.

0.1. Seed

A string as same as ID.name for generate the fingerprint.

0.2. Key

A public key (PK) was binded to an ID by the Meta Algorithm.

0.3. Fingerprint

THe fingerprint field was generated by your private key and seed:

fingerprint = private_key.sign(seed.encode('utf-8'))

1. ID

The ID is used to identify an entity(account/group). It consists of 3 fields and 2 extended properties:

Field Description
name Same with meta.seed
address Unique Identification
terminal Login point, it's optional.
type Network type
number Search Number

The ID format is name@address[/terminal].

1.0. Type

The network type of a person is 8, and group is 16:

class NetworkID(IntEnum):
    # Person Account
    Main = 0x08         # 0000 1000 (Person)

    # Virtual Groups
    Group = 0x10        # 0001 0000 (Multi-Persons)
    Polylogue = 0x10    # 0001 0000 (Multi-Persons Chat, N < 100)
    Chatroom = 0x30     # 0011 0000 (Multi-Persons Chat, N >= 100)

    # Network
    Provider = 0x76     # 0111 0110 (Service Provider)
    Station = 0x88      # 1000 1000 (Server Node)

1.1. Name

The Name field is a username, or just a random string for group:

  1. The length of name must more than 1 byte, less than 32 bytes;
  2. It should be composed by a-z, A-Z, 0-9, or charactors '_', '-', '.';
  3. It cannot contain key charactors('@', '/').
# Name examples
user_name  = "Albert.Moky"
group_name = "Group-9527"

1.2. Address

The Address field was created with the Fingerprint in Meta and a Network ID:

@classmethod
def new(cls, fingerprint: bytes=None, network: NetworkID=0x08, version: chr=0x01):
    """ Create address with fingerprint and network ID """
    if version == 0x01 and fingerprint and network:
        prefix = chr(network).encode('utf-8')
        digest = ripemd160(sha256(fingerprint))
        code = sha256(sha256(prefix + digest))[:4]
        string = base58_encode(prefix + digest + code)
        return Address(string)
    else:
        raise AssertionError('Parameters error')

When you get a meta for the entity ID from the network, you must verify it with the consensus algorithm before accept its key.

"""
    Meta algorithm
        1. compare meta.seed with ID.name
        2. build address with meta, compare it with ID.address
        3. if matches, get public key from meta
"""

def match_identifier(self, identifier: ID) -> bool:
    """ Check ID with meta info """
    return identifier.name == self.seed and self.match_address(identifier.address)

def match_address(self, address: Address) -> bool:
    """ Check address with meta info """
    return self.build_address(address.network) == address

def build_identifier(self, network: NetworkID) -> ID:
    """ Build ID with meta info and network ID """
    return ID.new(seed=self.seed, fingerprint=self.fingerprint, network=network, version=self.version)

def build_address(self, network: NetworkID) -> Address:
    """ Build address with meta info and network ID """
    return Address.new(fingerprint=self.fingerprint, network=network, version=self.version)

1.3. Terminal

A resource identifier as Login Point.

1.4. Number

A Search Number is defined for easy remember. Its value is converted from the check code of the address. It's greater than 0 and smaller than 232 (4,294,967,296).

2. Samples

ID

# ID examples
ID1 = "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj"  # Immortal Hulk
ID2 = "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk"  # Monkey King

Meta

/* Meta(JsON) for hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj */
{
    version     : 0x01,
    seed        : "hulk",
    key         : {
        algorithm  : "RSA",
        data       : "-----BEGIN PUBLIC KEY-----\nMIGJAoGBALB+vbUK48UU9rjlgnohQowME+3JtTb2hLPqtatVOW364/EKFq0/PSdnZVE9V2Zq+pbX7dj3nCS4pWnYf40ELH8wuDm0Tc4jQ70v4LgAcdy3JGTnWUGiCsY+0Z8kNzRkm3FJid592FL7ryzfvIzB9bjg8U2JqlyCVAyUYEnKv4lDAgMBAAE=\n-----END PUBLIC KEY-----",
        // other parameters
        keySize    : 1024,
        encryption : "PKCS1",
        signature  : "PKCS1v15SHA256"
    },
    fingerprint : "jIPGWpWSbR/DQH6ol3t9DSFkYroVHQDvtbJErmFztMUP2DgRrRSNWuoKY5Y26qL38wfXJQXjYiWqNWKQmQe/gK8M8NkU7lRwm+2nh9wSBYV6Q4WXsCboKbnM0+HVn9Vdfp21hMMGrxTX1pBPRbi0567ZjNQC8ffdW2WvQSoec2I="
}

(All data encode with BASE64 algorithm as default, excepts the address)

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mkm-0.2.3.tar.gz (16.2 kB view hashes)

Uploaded Source

Built Distribution

mkm-0.2.3-py3-none-any.whl (22.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page