用本机做网站浏览网页制作是什么专业学的

张小明 2026/1/10 10:13:10
用本机做网站浏览,网页制作是什么专业学的,免费行情软件下载入口,网页设计的实验总结Android EntropyService 在 Android 系统中#xff0c;EntropyService#xff08;后更名为 EntropyMixer#xff09; 是保障随机数安全性的核心服务之一。 它通过维护内核熵池#xff08;Entropy Pool#xff09;#xff0c;解决了系统启动初期随机数可预测的问题#x…Android EntropyService在 Android 系统中EntropyService后更名为 EntropyMixer是保障随机数安全性的核心服务之一。它通过维护内核熵池Entropy Pool解决了系统启动初期随机数可预测的问题为加密、安全认证等场景提供高质量随机数。本文将从Framework 层Java 实现和C 层Native 依赖深入解析其源码逻辑。什么是熵池Linux 内核维护一个熵池内存中的随机数据池收集硬件中断、设备噪声等不可预测的“熵源”生成/dev/random阻塞式熵不足时等待和/dev/urandom非阻塞式熵不足时复用已有数据设备文件。但系统启动初期熵池为空直接生成的随机数易被预测。EntropyService 的核心作用通过持久化熵数据、补充设备信息确保熵池始终有足够的“随机性”。Framework 层实现1 服务注册SystemServer 中启动EntropyService 是 SystemServer 启动的核心服务之一在SystemServer.java的startOtherServices()方法中注册// frameworks/base/services/java/com/android/server/SystemServer.javaServiceManager.addService(entropy,newEntropyMixer(context));2 构造函数核心逻辑入口EntropyMixer的构造函数定义了服务的核心参数和初始化流程// frameworks/base/services/core/java/com/android/server/EntropyMixer.javapublicEntropyMixer(Contextcontext){// 默认参数熵数据文件、随机设备、硬件随机设备this(context,getSystemDir()/entropy.dat,/dev/urandom,/dev/hw_random);}publicEntropyMixer(Contextcontext,StringentropyFile,StringrandomDevice,StringhwRandomDevice){this.randomDevicerandomDevice;// 对应 /dev/urandomthis.hwRandomDevicehwRandomDevice;// 硬件随机源如 /dev/hw_randomthis.entropyFileentropyFile;// 持久化熵数据的文件/data/system/entropy.dat// 核心初始化流程loadInitialEntropy();// 1. 加载历史熵数据到熵池addDeviceSpecificEntropy();// 2. 补充设备信息到熵池addHwRandomEntropy();// 3. 补充硬件随机源到熵池writeEntropy();// 4. 持久化当前熵池数据scheduleEntropyWriter();// 5. 定时更新熵数据registerShutdownReceiver();// 6. 注册关机/重启广播触发持久化}3 核心方法解析1loadInitialEntropy()加载历史熵数据系统启动时将/data/system/entropy.dat中的历史熵数据写入/dev/urandom填充空熵池privatevoidloadInitialEntropy(){try{// 将文件数据写入随机设备RandomBlock.fromFile(entropyFile).toFile(randomDevice,false);Slog.i(TAG,Loaded initial entropy from entropyFile);}catch(IOExceptione){Slog.w(TAG,Failed to load initial entropy,e);}}2addDeviceSpecificEntropy()补充设备信息向熵池写入设备唯一信息如序列号、硬件型号等增加随机性privatevoidaddDeviceSpecificEntropy(){try(BufferedWriteroutnewBufferedWriter(newOutputStreamWriter(newFileOutputStream(randomDevice)))){// 写入固定字符串、启动时间、设备属性等out.write(All Your Randomness Are Belong To Us\n);out.write(System.currentTimeMillis()\n);out.write(System.nanoTime()\n);out.write(SystemProperties.get(ro.serialno)\n);out.write(SystemProperties.get(ro.hardware)\n);// ... 其他设备属性out.flush();}catch(IOExceptione){Slog.w(TAG,Failed to add device entropy,e);}}3addHwRandomEntropy()补充硬件随机源若设备支持硬件随机数生成器如/dev/hw_random将其数据写入熵池privatevoidaddHwRandomEntropy(){try{RandomBlock.fromFile(hwRandomDevice).toFile(randomDevice,false);Slog.i(TAG,Added HW RNG output to entropy pool);}catch(FileNotFoundExceptionignored){// 无硬件随机源时忽略}catch(IOExceptione){Slog.w(TAG,Failed to add HW RNG entropy,e);}}4writeEntropy()与scheduleEntropyWriter()持久化与定时更新writeEntropy()读取/dev/urandom的数据写入entropy.dat持久化scheduleEntropyWriter()通过 Handler 每 3 小时触发一次持久化privatevoidwriteEntropy(){try{RandomBlock.fromFile(randomDevice).toFile(entropyFile,true);Slog.i(TAG,Wrote entropy to entropyFile);}catch(IOExceptione){Slog.w(TAG,Failed to write entropy,e);}}privatevoidscheduleEntropyWriter(){mHandler.removeMessages(ENTROPY_WHAT);// 3小时后触发mHandler.sendEmptyMessageDelayed(ENTROPY_WHAT,3*60*60*1000);}privatefinalHandlermHandlernewHandler(){OverridepublicvoidhandleMessage(Messagemsg){if(msg.whatENTROPY_WHAT){addHwRandomEntropy();writeEntropy();scheduleEntropyWriter();// 循环定时}}};C 层依赖EntropyService 本身是 Java 实现但依赖Linux 内核的随机数设备和Native 层的文件操作通过 JNI 调用。1 内核随机数设备/dev/random与/dev/urandom这两个设备由 Linux 内核的random.c实现位于kernel/drivers/char/random.c核心逻辑收集“熵源”如中断时间、磁盘 I/O 延迟到熵池提供read()接口/dev/random阻塞/dev/urandom非阻塞EntropyService 本质是通过读写这些设备文件与内核熵池交互。2 Native 层文件操作RandomBlock 的底层实现RandomBlock是 EntropyMixer 中封装的文件操作工具类其底层通过JNI 调用 C 的文件读写函数如open()、read()、write()避免 Java I/O 的性能开销。例如RandomBlock.fromFile()的 Native 实现逻辑简化// 伪代码Native 层文件读取jbyteArrayRandomBlock_nativeRead(JNIEnv*env,jclass clazz,jstring path){constchar*cPathenv-GetStringUTFChars(path,nullptr);intfdopen(cPath,O_RDONLY);if(fd0){/* 错误处理 */}charbuffer[4096];ssize_t nread(fd,buffer,sizeof(buffer));close(fd);env-ReleaseStringUTFChars(path,cPath);jbyteArray resultenv-NewByteArray(n);env-SetByteArrayRegion(result,0,n,(jbyte*)buffer);returnresult;}3 硬件随机源的 Native 驱动若设备支持/dev/hw_random其驱动由硬件厂商用 C 实现位于kernel/drivers/char/hw_random/核心是向内核熵池注入硬件生成的随机数据// 硬件随机源驱动伪代码staticvoidhw_rng_fill_entropy(structhw_rng*rng){u8 buffer[256];intnrng-read(rng,buffer,sizeof(buffer));// 硬件读取随机数if(n0){add_entropy_to_pool(buffer,n);// 注入内核熵池}}核心方法调用以下是从系统启动到服务运行/终止的全流程方法调用时序阶段1系统启动 → EntropyMixer初始化1. SystemServer.startOtherServices() ↓ 调用 2. EntropyMixer.init(Context) ↓ 构造函数内依次触发 3. loadInitialEntropy() 加载entropy.dat到熵池 ↓ 完成后 4. addDeviceSpecificEntropy() 补充设备信息到熵池 ↓ 完成后 5. addHwRandomEntropy() 补充硬件随机源到熵池 ↓ 完成后 6. writeEntropy() 首次持久化当前熵池到entropy.dat ↓ 完成后 7. scheduleEntropyWriter() 启动3小时周期的定时任务 ↓ 完成后 8. registerShutdownReceiver() 注册关机/重启广播接收器阶段2定时任务执行每3小时1. mHandler接收ENTROPY_WHAT消息 ↓ 处理消息时触发 2. addHwRandomEntropy() 再次补充硬件随机源 ↓ 完成后 3. writeEntropy() 更新持久化的entropy.dat ↓ 完成后 4. scheduleEntropyWriter() 重新调度下一次定时任务阶段3系统关机/重启1. 系统发送关机/重启广播 ↓ 广播接收器触发 2. writeEntropy() 最后一次持久化熵池数据从应用到内核熵池的全链路解析当 Android 系统应用需要生成随机数如加密密钥、安全令牌时并非直接“创造”随机数据而是通过多层组件协作最终从内核熵池获取高质量随机数。应用层随机数的“入口”APIAndroid 应用层生成随机数的常用方式有两种Java 标准库 API 和 Android 系统 API两者最终都会关联到内核熵池。1 Java 标准库java.security.SecureRandom这是应用层最常用的安全随机数生成器默认绑定系统熵池// 应用层代码示例SecureRandomsecureRandomnewSecureRandom();byte[]randomBytesnewbyte[16];// 生成16字节128位随机数secureRandom.nextBytes(randomBytes);2 Android 系统 APIandroid.os.Build.VERSION.SDK_INT 26新增的StrongBox针对高安全场景如密钥存储Android 9 提供StrongBox底层直接调用硬件/内核级随机源// 应用层代码示例需硬件支持KeyGeneratorkeyGenKeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,AndroidKeyStore);keyGen.init(newKeyGenParameterSpec.Builder(my_key,KeyProperties.PURPOSE_ENCRYPT|KeyProperties.PURPOSE_DECRYPT).setIsStrongBoxBacked(true)// 强制使用StrongBox.build());SecretKeykeykeyGen.generateKey();// 密钥随机数来自StrongBox关联的熵池Framework 层应用层调用的随机数 API会先进入 Android Framework 层的安全框架完成策略校验、熵源绑定等逻辑。1SecureRandom的 Framework 层实现SecureRandom的实际逻辑由sun.security.provider.SecureRandomJDK 底层和 Android 定制的android.security.SecureRandom共同实现第一步SecureRandom初始化时会加载随机数算法如SHA1PRNG第二步算法初始化需要“种子”Seed而种子默认从系统熵池获取通过/dev/urandom。Framework 层对SecureRandom的增强// Android 定制的 SecureRandom 逻辑简化publicclassSecureRandomextendsjava.security.SecureRandom{OverrideprotectedvoidengineSetSeed(byte[]seed){// 强制将种子补充到内核熵池避免弱种子NativeCrypto.RAND_seed(seed);super.engineSetSeed(seed);}}2 Framework 到 Native 层的过渡JNI 调用Framework 层的随机数逻辑通过JNIJava Native Interface调用 Native 层的 OpenSSL/系统库最终关联到内核设备文件。例如SecureRandom的nextBytes()会触发 JNI 调用// Framework 层 SecureRandom 的 JNI 绑定privatenativevoidnextBytes(byte[]bytes);对应的 Native 实现位于libandroid_runtime.so// Native 层代码简化staticvoidSecureRandom_nextBytes(JNIEnv*env,jobject obj,jbyteArray bytes){jbyte*bufenv-GetByteArrayElements(bytes,nullptr);intlenenv-GetArrayLength(bytes);// 调用 OpenSSL 的 RAND_bytes而 RAND_bytes 会读取 /dev/urandomif(RAND_bytes((unsignedchar*)buf,len)!1){env-ThrowNew(env-FindClass(java/security/NoSuchAlgorithmException),RAND_bytes failed);}env-ReleaseByteArrayElements(bytes,buf,0);}Native 层Native 层通过系统库如 OpenSSL、Bionic libc直接操作内核提供的随机数设备文件/dev/random//dev/urandom是连接 Framework 与内核的关键层。1 OpenSSL 的 RAND 模块Android 系统中的 OpenSSL 被定制为默认从/dev/urandom获取随机数// OpenSSL RAND 模块的实现简化intRAND_bytes(unsignedchar*buf,intnum){intfdopen(/dev/urandom,O_RDONLY);if(fd0)return0;ssize_t nread(fd,buf,num);// 从内核熵池读数据close(fd);return(nnum)?1:0;}2 Bionic libc 的getrandom()系统调用Android 5.0 支持getrandom()系统调用替代直接读写设备文件它直接从内核熵池获取数据// Native 层使用 getrandom() 的示例#includesys/random.hssize_tgetrandom(void*buf,size_t buflen,unsignedintflags);// 调用示例charrandom_buf[16];getrandom(random_buf,sizeof(random_buf),0);// 直接从内核熵池读内核层所有随机数的最终来源是Linux 内核的熵池由kernel/drivers/char/random.c实现负责收集“熵源”并生成随机数据。1 熵池的构成内核熵池是一个256字节的内存池通过收集以下“不可预测”的熵源填充硬件中断的时间差磁盘/网络 I/O 的延迟键盘输入、触摸屏操作的时间EntropyServiceEntropyMixer补充的持久化数据、设备信息、硬件随机源。2/dev/urandom与/dev/random的区别/dev/urandom非阻塞当熵池不足时复用已有数据并通过加密算法增强随机性Android 应用默认使用/dev/random阻塞直到熵池有足够新熵源仅用于极高安全场景。3 EntropyService 对内核熵池的作用如前文所述EntropyService 会在系统启动时加载历史熵数据、补充设备/硬件熵源确保内核熵池在启动初期就有足够的随机性避免应用层获取弱随机数。全链路总结应用层代码 ↓ 调用 Framework 层SecureRandom / StrongBox ↓ JNI 调用 Native 层OpenSSL / getrandom() ↓ 系统调用 / 文件读写 内核层/dev/urandom → 熵池 ↓ 读取熵池数据 返回随机数到应用层总结系统启动EntropyMixer 从entropy.dat加载历史熵数据填充内核熵池补充熵源写入设备信息、硬件随机数据增强随机性持久化将当前熵池数据写入entropy.dat并每 3 小时更新关机/重启通过广播触发持久化确保下次启动时有足够熵数据。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

展会网站模板怎样制作一个app软件

为什么顶级团队都在用Kotaemon做知识问答系统? 在企业AI落地的浪潮中,一个看似简单却极具挑战的问题反复浮现:如何让大模型“说真话、有依据、可信任”?尤其是在金融、医疗、法务等高合规要求的领域,幻觉频出、来源不明…

张小明 2026/1/4 6:01:53 网站建设

网站佣金怎么做会计分录今天的新闻

动漫商城 目录 基于springboot vue动漫商城系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue动漫商城系统 一、前言 博主介绍:✌️大…

张小明 2026/1/4 7:18:04 网站建设

15年做那个网站致富下什么软件做网站

基于Yolov2深度学习网络的驾驶员打电话行为预警系统matlab仿真开车打电话这事有多危险不用我多说了吧?今儿咱们就用Matlab整个能实时监测司机打电话的预警系统。YOLOv2这货速度快准头还行,正适合车载设备这种需要实时处理的情况。先上段数据预处理的代码…

张小明 2026/1/6 22:10:54 网站建设

在线玩网页游戏h5网站大全前端是啥

Office界面定制终极指南:用免费开源工具打造高效办公空间 【免费下载链接】office-custom-ui-editor 项目地址: https://gitcode.com/gh_mirrors/of/office-custom-ui-editor 想要提升办公效率?office-custom-ui-editor这款免费开源工具能够让你…

张小明 2026/1/8 19:54:14 网站建设

.net 网站开发实例品质好

还在为123云盘的下载限制烦恼吗?想体验高级功能却不想付费?今天分享的这个增强脚本能帮你解决所有问题!就像给浏览器安装了一个超级插件,瞬间提升你的云盘体验。123云盘增强脚本是一款基于浏览器扩展的专业工具,能够优…

张小明 2026/1/9 12:53:36 网站建设

设计开发网站国内互联网公司排名2021

从零开始搭建Arduino开发环境:Win7/Win10系统保姆级实操指南 你是不是刚买了块Arduino Uno,插上电脑却发现“端口灰色不可选”?或者点击上传程序时弹出一串英文错误:“ stk500_recv(): programmer is not responding ”&#x…

张小明 2026/1/8 6:12:20 网站建设