Ming Ke Ming (名可名) -- Account Module (Java)
This document introduces a common Account Module for decentralized user identity authentication.
Copyright © 2018-2019 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
0x01
Default version0x02
BTC version0x03
Extended BTC version0x04
ETH version0x05
Extended ETH version
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:
data = seed.getBytes(Charset.forName("UTF-8"));
fingerprint = privateKey.sign(data);
1. ID
The ID is used to identify an entity(user/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
:
public enum NetworkType {
Main (0x08),
Group (0x10),
Polylogue (0x10),
Chatroom (0x30),
Provider (0x76),
Station (0x88),
Thing (0x80),
Robot (0xC8);
public final int value;
NetworkType(int value) {
this.value = value;
}
}
1.1. 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";
1.2. 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) {
byte[] digest = RIPEMD160.digest(SHA256.digest(fingerprint));
byte[] head = new byte[21];
head[0] = network.toByte();
System.arraycopy(digest, 0, head, 1, 20);
byte[] cc = checkCode(head);
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 accept its public key.
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";
ID2 = "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk";
Meta
{
"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="
}
(All data encode with BASE64 algorithm as default, excepts the address)