信息安全是IM最重要的问题之一,tim将信息安全分为 用户资料信息安全与通讯数据信息安全,并对这两部分数据做了不同的处理,特别是用户资料安全方面,tim内置用户账户信息,用户登录后,tim会将用户登录账号换算为tim内置的账号进行数据传输,tim本身不会保留用户登录账号信息。以下是详细说明:
来源《tim实践系列》
用户信息安全
用户信息包括用户登录账号,登录密码,用户个人资料等信息等;登录账号通常是邮箱,手机号等个人通讯账号,属于用户私密信息,在没有用户授权的情况下,在数据传输过程中,应该避免被窃取到。类似QQ,微信等APP的做法是,通过QQ号,微信号标识用户个人微信或QQ,该做法的特点是,用户需要记住QQ号或微信号;如果用户手机号绑定,则手机号被记录在系统中;对一般商业系统来说,记录用户手机号等登录账号是没有问题的。但是对于IM引擎来说,或者对于通信云平台来说,它们本身只是一种信息通信服务,应该可以不记录用户登录信息,个人认为,im引擎应该独立于其他业务之外,尽可能不记录有安全隐患的敏感信息。
基于账号安全考虑,tim实现了一套用户系统,用户既可以使用自己熟悉的账号进行注册登录,账号信息又不会被记录到tim中,达到信息安全的效果。tim记录的用户信息如下所示:
说明:
如上数据截图,每一行为一个用户的信息。所以tim的用户信息是安全的,也没有被泄露的风险。如乱码部分,则是加密后的用户个人资料,通常来说,虽然tim提供记录修改个人资料的功能,但是个人建议 开发者对用户个人资料应该在自己的业务系统中提供接口进行增删改查,用户资料数据记录到业务数据库中,最好不记录到tim中,因为个人资料本身与IM没有直接的关联性。
注意:如果开发者外接自己的业务数据库,如mysql,Oracle等, 则tim的账号系统完全按照开发者配置的业务数据库返回的数据传输,不会转换或修改。接入自己的业务数据库,用户通信时,使用的是 执行登录SQL返回的标识,该标识可以是字符串,也可以是整数,比如 sql返回用户id号,或直接返回用户登录账号等。
以下是java程序示例
使用内置账号时:
tc.Register("13398765432", "123456", "github.com");
//tim会返回内置账户信息 ,如返回账号: NGhMpCbk2wQ
tc.Login("13398765432", "123456", "github.com", "ios-20-plus", MOBILE, null);
//登录成功后,tim也会返回账号 NGhMpCbk2wQ
//发信给其他账户,使用内置账号。比如发送给 GhpCk2M4Pa用户
tc.MessageToUser("GhpCk2M4Pa", "hello,我是jerry", (short) 0, (short) 0, null, null);
注意:使用外接数据库时,由于外接数据库,账号信息都不是tim生成的,所以是不支持注册接口的;使用tim的注册接口,数据将被记录到tldb中。
//外接数据库,直接用户已经存在从账户登录
tc.Login("13398765432", "123456", "github.com", "ios-20-plus", MOBILE, null);
//登录成功,比如执行登录sql,返回登录账号 13398765432
//发信给其他账户,
tc.MessageToUser("13898765430", "hello,我是jerry", (short) 0, (short) 0, null, null);
通讯数据安全
通讯数据安全这一点无需解释,聊天内容必须加密存储,减少泄密的风险。tim的通讯数据是比较安全的,有几方面的特点:
- tim的通讯数据是被特殊数据结构序列化的字节数组,需要反序列化才能获得原始数据
- 序列化后的数据进行加密,需要解密才能获得序列化数据
- 加密后的数据与用户之间的关系时通过两次换算关联的,单从数据库的数据上,无法将通讯数据与用户对应起来
- 用户账户与内置账户的换算是通过系统配置种子数据换算的,没有种子数据,无法获得登录账号与内置账号的对应关系。
需要多层条件同时达成的情况下,才有可能获取用户的通讯数据, 因此tim的通讯数据是比较安全的。
数据如图:
所以使用tim搭建的通讯服务平台,对于接入的其他业务来说,信息是安全可控的。
有任何问题或建议请Email:donnie4w@gmail.com或 https://tlnet.top/contact 发信给我,谢谢!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。