Flutter geolocator包安全问题:基于java.security.SecureRandom的解决方案咨询
针对Flutter geolocator弱随机数安全问题的答复
关于其他定位包的随机数实现情况
目前主流Flutter定位生态内,没有默认全场景使用java.security.SecureRandom生成随机数的公开插件,常用包的实际实现状态:
location:和旧版geolocator逻辑高度相似,仅在最新版本中将权限请求码的生成逻辑切换为SecureRandom,位置流标识、临时参数生成等边缘场景仍在调用java.util.Random,未完全满足密码学安全随机数要求。- 高德、百度等国内厂商的官方定位Flutter插件:核心定位逻辑封装在闭源SDK内,公开的Dart桥接层代码未发现弱随机数调用,但SDK内部的随机数实现无法通过公开代码审计,需要求厂商出具对应的安全合规自证材料才能确认是否符合测试要求。
- 纯Dart层实现的定位辅助工具包(含坐标转换、轨迹纠偏、位置模拟类包):默认调用Dart内置
Random()构造方法生成随机数时,在Android端最终映射的就是java.util.Random,属于弱随机数;只有显式调用Random.secure()构造的实例,才会映射到系统层强随机数生成器。
不建议为了这个问题盲目替换定位依赖,大部分第三方定位插件的Android端桥接代码写法同源,换包后大概率还是会触发同样的安全告警,修复现有依赖的成本最低。
geolocator问题的修复方案
官方修复路径
旧版geolocator的Android端实现中,java.util.Random仅在两个非核心敏感场景调用:一是生成定位权限申请的临时请求码,二是生成位置事件流的临时通道标识,两处随机数均不参与敏感数据加密、鉴权逻辑,但确实不符合安全测试的强制规范。官方在12.0.0正式版本中已经完成整改,全量将随机数生成逻辑替换为java.security.SecureRandom,如果项目没有版本锁定限制,直接将geolocator升级到12.0.0及以上版本,重新打包后即可通过该项安全检测。
低版本自定义适配方案
如果项目因为兼容性原因无法升级到最新版,不需要fork远程仓库提交PR,通过本地依赖覆盖的方式即可快速修复:
- 从pub仓库下载当前项目使用版本对应的
geolocator_android平台包源码,放到项目本地的plugins/目录下,在pubspec.yaml中替换远程依赖为本地路径依赖。 - 在Android源码目录下全局搜索
java.util.Random的调用点,将实例化代码替换为SecureRandom实现,参考代码:// 注释原弱随机数初始化代码 // import java.util.Random; // private final Random mRandom = new Random(); // 替换为强随机数实现 import java.security.SecureRandom; private final SecureRandom mRandom = new SecureRandom(); - 不需要修改后续的
nextInt()、nextLong()等随机数调用逻辑,SecureRandom是Random的子类,原有方法签名完全兼容,修改后直接构建打包即可。 - 构建完成后反编译APK做二次校验,确认geolocator相关代码中不存在
java.util.Random的调用,即可满足安全测试要求。
内容的提问来源于stack exchange,提问作者Maher Parkar
相关产品推荐
相关产品推荐

