欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

在这里插入图片描述

前言

在现代移动应用开发中,安全性是不可妥协的底线。

  • JWT (JSON Web Token): 用户登录鉴权的标配。
  • JWS (JSON Web Signature): 确保数据在传输过程中未被篡改。
  • JWE (JSON Web Encryption): 对敏感载荷进行加密传输。

虽然有很多库能解析 JWT(比如 dart_jsonwebtoken),但如果你需要更完整的 JOSE (Javascript Object Signing and Encryption) 标准支持,包括复杂的密钥管理(JWK)、多种加密算法(RSA, ECDSA, AES-GCM),那么 jose package 是目前 Dart 生态中最强大的选择。

对于 OpenHarmony 应用,尤其是金融、政务类高安全级别的应用,jose 提供了纯 Dart 的加密实现,不依赖 OpenSSL FFI,适配性极佳。

一、核心功能

jose 库实现了 RFC 7515 (JWS), RFC 7516 (JWE), RFC 7517 (JWK) 等一系列标准。

  1. JsonWebKey (JWK): 生成、解析 PEM/JSON 格式的公私钥。
  2. JsonWebSignature (JWS): 签名与验签。
  3. JsonWebEncryption (JWE): 加密与解密。
  4. JsonWebToken (JWT): 基于 JWS/JWE 的 Token 封装。

签名

验证

加密

解密

载荷

JWS

有效数据

JWE

原始数据

JWK (RSA/EC)

二、集成与用法详解

2.1 添加依赖

dependencies:
  jose: ^0.3.5

2.2 JWT 签名与验证 (Sign & Verify)

import 'package:jose/jose.dart';

void main() async {
  // 1. 创建密钥 (这里用 HMAC 对称密钥)
  var jwk = JsonWebKey.fromJson({
    'kty': 'oct',
    'k': '...secret-key-base64...'
  });

  // 2. 创建 Claims
  var claims = JsonWebTokenClaims.fromJson({
    'sub': '1234567890',
    'name': '张三',
    'iat': 1516239022
  });

  // 3. 构建并签名 JWT
  var builder = JsonWebSignatureBuilder()
    ..jsonContent = claims.toJson()
    ..addRecipient(jwk, algorithm: 'HS256');

  var jws = builder.build();
  var token = jws.toCompactSerialization();
  print('Token: $token');

  // 4. 验证与解析
  var receivedjws = JsonWebSignature.fromCompactSerialization(token);
  var payload = receivedjws.unverifiedPayload;
  
  // 验证签名
  var store = JsonWebKeyStore()..addKey(jwk);
  if (await receivedjws.verify(store)) {
    print('Verified: ${payload.jsonContent}');
  }
}

在这里插入图片描述

2.3 生成 RSA 密钥对

功能非常强大,可以在本地生成密钥对。

void generateKeys() {
  var keyPair = JsonWebKey.generate('RS256');
  print(keyPair.toJson()); // 包含公钥和私钥
}

在这里插入图片描述

三、OpenHarmony 适配与实战:端到端加密

在鸿蒙应用中,我们可能需要实现 E2EE (End-to-End Encryption),即数据在客户端加密,只有拥有私钥的接收方能解密,中间服务器无法窥探。

3.1 JWE 实战

import 'package:jose/jose.dart';

Future<String> encryptData(String data, JsonWebKey publicKey) async {
  var builder = JsonWebEncryptionBuilder()
    ..stringContent = data
    ..addRecipient(publicKey, algorithm: 'RSA-OAEP-256');
    
  var jwe = builder.build();
  return jwe.toCompactSerialization();
}

Future<String> decryptData(String token, JsonWebKey privateKey) async {
  var jwe = JsonWebEncryption.fromCompactSerialization(token);
  var store = JsonWebKeyStore()..addKey(privateKey);
  
  var payload = await jwe.getPayload(store);
  return payload.stringContent;
}

在这里插入图片描述

3.2 鸿蒙平台的安全性

使用纯 Dart 版 jose 的优势在于它不依赖系统底层的加密库(如 Android 的 KeyStore 或 iOS 的 CryptoKit),因此在鸿蒙上完全可用,且行为一致。

但要注意,私钥的存储是安全的关键。
在鸿蒙上,建议将生成的私钥存储在 flutter_secure_storage(适配鸿蒙版)或通过 MethodChannel 调用鸿蒙原生的 HUKS (通用密钥库系统) 来保存,不要明文存在 Shared Preferences 里。

四、高级特性:Certificate Chain

jose 还支持 X.509 证书链验证 (x5c header)。如果你正在对接银行级接口或基于证书的身份验证系统,这一点非常重要。

// 解析带证书的 JWK
var jwk = JsonWebKey.fromPem(pemString);
print(jwk.x5c); // 证书链

五、总结

jose 是 Dart 加密领域的重型武器。它比简单的 JWT 库复杂,但功能也强大得多。

对于 OpenHarmony 开发者:

  • 合规性:支持国际标准的加密算法,满足企业级安全合规要求。
  • 跨平台:一套代码解决 iOS, Android, OpenHarmony 三端的加密逻辑,无需维护三份原生代码。

最佳实践

  1. 密钥安全:绝对不要将私钥(Private Key)硬编码在 APP 源码中!应该使用鸿蒙的安全存储(如 KeyStore)或在运行时从后端安全获取。
  2. 验证算法:在 verify 时显式指定算法(如 ['HS256']),防止算法降级攻击。
  3. HTTPS:JWE/JWS 提供了数据层的安全,但传输层依然必须使用 HTTPS。

六、完整实战示例

import 'package:jose/jose.dart';
import 'dart:convert';

class JwtAuthService {
  // 模拟从安全存储读取的密钥 (JWK格式)
  // 在真实场景中,这个 Key 可能来自服务端下发或 KeyStore
  static final _jwkJson = {
    "kty": "oct",
    "k": "AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"
  };
  
  static final _keyStore = JsonWebKeyStore()..addKey(JsonWebKey.fromJson(_jwkJson));

  // 1. 生成 Token (客户端通常只做验证,但在 P2P 加密场景可能需要生成)
  Future<String> login(String userId) async {
    final claims = JsonWebTokenClaims.fromJson({
      'sub': userId,
      'iss': 'my_ohos_app',
      'exp': DateTime.now().add(Duration(hours: 1)).millisecondsSinceEpoch ~/ 1000,
      'role': 'admin' 
    });

    final builder = JsonWebSignatureBuilder()
      ..jsonContent = claims.toJson()
      ..addRecipient(JsonWebKey.fromJson(_jwkJson), algorithm: 'HS256');

    final jws = builder.build();
    return jws.toCompactSerialization();
  }

  // 2. 验证 Token (拦截器逻辑)
  Future<bool> verifyToken(String token) async {
    try {
      final jws = JsonWebSignature.fromCompactSerialization(token);
      
      // 验证签名有效性
      final payload = await jws.getPayload(_keyStore); // 签名错误会抛异常或返回 null
      
      if (payload == null) return false;
      
      // 验证过期时间 (exp)
      final claims = JsonWebTokenClaims.fromJson(jsonDecode(payload.stringContent));
      final exp = claims.expiry;
      if (exp != null && DateTime.now().isAfter(exp)) {
        print('Token 已过期');
        return false;
      }
      
      print('用户验证成功: ${claims.subject}');
      return true;
    } catch (e) {
      print('Token 无效: $e');
      return false;
    }
  }
}

void main() async {
  final service = JwtAuthService();
  
  // 模拟登录
  final token = await service.login('uid_123');
  print('Generated Token: $token');
  
  // 模拟验证
  final isValid = await service.verifyToken(token);
  print('Is Valid? $isValid');
}

在这里插入图片描述

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐