1:系统架构
1.1 业务全图
-
账户在管理后台进行管理,包含账号注册和编辑和删除功能,支持主子账号;
-
用户登录需要经过统一认证中心进行验证和鉴权,鉴权通过后在访问其他后台应用。
1.2 表结构设计
user(用户表):用户信息,包含密码、手机号等
role(角色表):自定义角色
privilege(权限表):三元组权限code等
user_role(用户角色映射表):用户和角色的绑定关系,用户可有多个角色
role_privilege(角色权限映射表):角色和权限的绑定关系,每个角色可以有多个权限点
3:设计要点
3.1 用户、角色和权限
用户体系设计中的“角色”和“权限”通常通过角色-权限(Role-Based Access Control, RBAC)模型来定义和管理。在RBAC模型中,权限被分配给角色,而用户则被分配到不同的角色中。这样,用户通过其所属的角色间接获得权限。
在这个模型中:
-
用户:系统中的个体,可以是人、系统进程或任何需要访问控制的实体。
-
角色:一组权限的集合,用于定义用户在系统中可以执行的操作。角色可以有不同的级别或类型,例如“管理员”、“编辑者”、“访客”等。
-
权限:定义了对系统资源的访问能力,例如读取、写入、修改、删除等。
角色和权限的关系通常是多对多的,即一个角色可以拥有多个权限,同时一个权限也可以被多个角色所拥有。用户和角色的关系也是多对多的,即一个用户可以拥有多个角色,同时一个角色也可以被多个用户所拥有。
3.2 信息安全
为确保系统的安全性,我们采用了多种的加密方式来保护数据的安全。
一、前后端密码传输采用 RSA公私钥加密
在前后端密码传输过程中,采用了 RSA 公钥加密和私钥解密的方式,前端使用公钥对密码进行加密处理,而后端则运用私钥进行解密操作。这种加密机制极大地保障了密码传输的安全性,有效防止密码在传输过程中被恶意窃取或篡改。
二、用户密码保存在数据库采用加盐后 SHA-256 加密
对于用户密码在数据库中的保存,采用了加盐后 SHA-256 加密的方式。这种方式具有诸多显著优势。
-
抗碰撞性:SHA-256 算法具有很强的抗碰撞性,即很难找到两个不同的输入产生相同的哈希值。这使得攻击者难以通过暴力破解等方式获取原始密钥。
-
加盐增加安全性:加盐是在原始数据(密钥)中添加随机的额外数据,然后再进行哈希运算。这样即使多个用户使用相同的密钥,经过加盐处理后,在数据库中的存储形式也会完全不同,大大增加了破解的难度。
-
保护数据库安全:如果数据库被攻击,攻击者也很难从哈希值中还原出原始密钥,从而有效保护了系统的整体安全。
public static String hashPassword(String password, String salt) {
try {
String combined = password + salt;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(combined.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static String generateSalt() {
Random random = new Random();
StringBuilder salt = new StringBuilder();
for (int i = 0; i < 16; i++) {
int randomNumber = random.nextInt(128);
salt.append((char) randomNumber);
}
return salt.toString();
}
三、手机号、邮箱等敏感信息采用 AES加密的方式存储在数据库
在存储名字、手机号、邮箱等用户敏感信息时,采用 AES(Advanced Encryption Standard)加密方式将其存储于数据库,与 RSA 加密方式相比,运算速度更快。虽然 RSA 加密也很安全,但对于大量敏感信息的存储和频繁的加密解密操作,AES 加密在性能和安全性的平衡上更具优势。