mkm 0.3.1
mkm: ^0.3.1 copied to clipboard
Decentralized User Identity Authentication (Ming-Ke-Ming).
Ming Ke Ming (名可名) -- Account Module (Dart) #
This document introduces a common Account Module for decentralized user identity authentication.
Copyright © 2023 Albert Moky
Features #
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 |
---|---|
type | Meta Algorithm Version |
key | Public Key |
seed | Entity Name |
fingerprint | Signature to generate address |
ID #
The ID is used to identify an entity(user/group). It consists of 3 fields:
Field | Description |
---|---|
type | Entity type |
name | Same with meta.seed |
address | Unique Identification |
terminal | Login point, it's optional. |
The ID format is name@address[/terminal]
.
Usage #
Meta #
/* Meta(JsON) for hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj */
{
"version" : 0x01,
"key" : {
"algorithm" : "RSA",
"data" : "-----BEGIN PUBLIC KEY-----\nMIGJAoGBALB+vbUK48UU9rjlgnohQowME+3JtTb2hLPqtatVOW364/EKFq0/PSdnZVE9V2Zq+pbX7dj3nCS4pWnYf40ELH8wuDm0Tc4jQ70v4LgAcdy3JGTnWUGiCsY+0Z8kNzRkm3FJid592FL7ryzfvIzB9bjg8U2JqlyCVAyUYEnKv4lDAgMBAAE=\n-----END PUBLIC KEY-----",
"mode" : "ECB",
"padding" : "PKCS1",
"digest" : "SHA256"
},
"seed" : "hulk",
"fingerprint" : "jIPGWpWSbR/DQH6ol3t9DSFkYroVHQDvtbJErmFztMUP2DgRrRSNWuoKY5Y26qL38wfXJQXjYiWqNWKQmQe/gK8M8NkU7lRwm+2nh9wSBYV6Q4WXsCboKbnM0+HVn9Vdfp21hMMGrxTX1pBPRbi0567ZjNQC8ffdW2WvQSoec2I="
}
Meta Type
0x01
Default version0x02
BTC version0x03
Extended BTC version0x04
ETH version0x05
Extended ETH version
ID #
# ID examples
ID1 = "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj"; // Immortal Hulk
ID2 = "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk"; // Monkey King
ID Name
The Name field is a username, or just a random string for group:
- The length of name must more than 1 byte, less than 32 bytes;
- It should be composed by a-z, A-Z, 0-9, or charactors '_', '-', '.';
- It cannot contain key charactors('@', '/').
# Name examples
user_name = "Albert.Moky";
group_name = "Group-9527";
ID Address
The Address field was created with the Fingerprint in Meta and a Network ID:
public final class BTCAddress extends Address {
private static byte[] checkCode(byte[] data) {
byte[] sha256d = SHA256.digest(SHA256.digest(data));
byte[] cc = new byte[4];
System.arraycopy(sha256d, 0, cc, 0, 4);
return cc;
}
private static long userNumber(byte[] cc) {
return (long)(cc[3] & 0xFF) << 24 | (cc[2] & 0xFF) << 16 | (cc[1] & 0xFF) << 8 | (cc[0] & 0xFF);
}
static BTCAddress generate(byte[] fingerprint, NetworkType network) {
// 1. digest = ripemd160(sha256(fingerprint))
byte[] digest = RIPEMD160.digest(SHA256.digest(fingerprint));
// 2. head = network + digest
byte[] head = new byte[21];
head[0] = network.toByte();
System.arraycopy(digest, 0, head, 1, 20);
// 3. cc = sha256(sha256(head)).prefix(4)
byte[] cc = checkCode(head);
// 4. data = base58_encode(head + cc)
byte[] data = new byte[25];
System.arraycopy(head, 0, data, 0, 21);
System.arraycopy(cc,0, data, 21, 4);
return new BTCAddress(Base58.encode(data));
}
}
When you get a meta for the entity ID from the network, you must verify it with the consensus algorithm before accepting its public key.
(All data encode with BASE64 algorithm as default, excepts the address)