mkm-objc 0.4.3

mkm-objc 0.4.3

John Chen 维护。



mkm-objc 0.4.3

  • 作者:
  • dim

Ming Ke Ming (名可名) -- 账户模块 (Objective-C)

license Version PRs Welcome Platform

文档 介绍了一个通用的 账户模块 用于分散式用户身份认证。

版权所有 © 2018-2019 Albert Moky

0. 元数据

元数据 由您的 私钥 生成,可用于构建实体的新 ID 或验证 ID/PK 对。

它包含 4 个字段

字段 描述
version 元数据算法版本
seed 实体名称
key 公钥
fingerprint 生成地址的签名

0.0. 版本

  • 0x01 默认版本
  • 0x02 BTC 版本
  • 0x03 扩展 BTC 版本
  • 0x04 ETH 版本
  • 0x05 扩展 ETH 版本

0.1. 种子

ID.name相同的字符串,用于生成指纹。

0.2. 键

通过 元算法,将一个 公钥 (PK) 绑定到一个 ID 上。

0.3. 指纹

“指纹”字段是由您的私钥种子生成的。

data = [seed dataUsingEncoding:NSUTF8StringEncoding];
fingerprint = [privateKey sign:data];

1. ID

ID 用来标识一个 实体(用户/组)。它由 3 个字段和 2 个扩展属性组成。

字段 描述
名称 与 meta.seed 相同
地址 唯一识别码
终端 登录点,为可选。
类型 网络类型
编号 搜索编号

ID 格式为 name@address[终端]

1.0. 类型

某人的网络类型为 8,组为 16

typedef NS_ENUM(UInt8, MKMNetworkID) {
    /**
     *  Person Account
     */
    MKMNetwork_Main    = 0x08, // 0000 1000 (Person)
    
    /**
     *  Virtual Groups
     */
    MKMNetwork_Group   = 0x10, // 0001 0000 (Multi-Persons)
    MKMNetwork_Polylogue = 0x10, // 0001 0000 (Multi-Persons Chat, N < 100)
    MKMNetwork_Chatroom  = 0x30, // 0011 0000 (Multi-Persons Chat, N >= 100)

    /**
     *  Network
     */
    MKMNetwork_Provider  = 0x76, // 0111 0110 (Service Provider)
    MKMNetwork_Station   = 0x88, // 1000 1000 (Server Node)
    
    /**
     *  Internet of Things
     */
    MKMNetwork_Thing   = 0x80, // 1000 0000 (IoT)
    MKMNetwork_Robot   = 0xC8, // 1100 1000
};
typedef UInt8 MKMNetworkType;

1.1. 名称

“名称”字段是用户名,或为分组随机字符串。

  1. 名称长度必须大于1字节,小于32字节;
  2. 应由a-z、A-Z、0-9或字符'_'、'-'、'.'组成;
  3. 不能包含关键字字符('@', '/')。
# Name examples
user_name  = @"Albert.Moky";
group_name = @"Group-9527";

1.2. 地址

地址字段是在Meta中与指纹网络ID创建的。

static inline NSData * check_code(NSData *data) {
    assert([data length] == 21);
    data = [[data sha256] sha256];
    return [data subdataWithRange:NSMakeRange(0, 4)];
}

static inline UInt32 user_number(NSData *cc) {
    assert([cc length] == 4);
    UInt32 number;
    memcpy(&number, [cc bytes], sizeof(UInt32));
    return number;
}

@implementation MKMAddressBTC

/**
 *  BTC address algorithm:
 *      digest     = ripemd160(sha256(fingerprint));
 *      check_code = sha256(sha256(network + digest)).prefix(4);
 *      addr       = base58_encode(network + digest + check_code);
 */
- (instancetype)initWithData:(NSData *)key
                     network:(MKMNetworkType)type {
    NSString *string = nil;
    UInt32 code = 0;
    NSMutableData *data;
    
    // 1. hash = ripemd160(sha256(CT))
    NSData *hash = [[key sha256] ripemd160];
    // 2. _h = network + hash
    data = [[NSMutableData alloc] initWithBytes:&type length:1];
    [data appendData:hash];
    // 3. cc = sha256(sha256(_h)).prefix(4)
    NSData *cc = check_code(data);
    code = user_number(cc);
    // 4. addr = base58_encode(_h + cc)
    [data appendData:cc];
    string = [data base58Encode];
    
    if (self = [super initWithString:string]) {
        self.network = type;
        self.code = code;
    }
    return self;
}

@end

当从网络获取实体ID的meta信息时,必须在接受其公钥之前使用一致性算法进行验证。

1.3. 终端

作为 登录点 的资源标识符。

1.4. 数字

为方便记忆,定义了 搜索数字。其值由地址的 校验码 转换而来。规定该值大于 0 小于 2^32 (4,294,967,296)

2. 样本

ID

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

元数据

/* 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="
}

(默认情况下,所有数据均使用 BASE64 算法进行编码,除非是 地址)