当前位置: 首页 > news >正文

如何防护恶意网站建设网站的申请

如何防护恶意网站,建设网站的申请,做怎么样的网站好,uehtml wordpress一#xff0c; Gradle 、AGP(Android Gradle Plugin)、 buildTools分别是什么#xff0c;他们之间什么关系#xff1f; Gradle Gradle是基于JVM的构建工具。他本身使用jave写的#xff0c;gradle的脚本也就是build.gradle通常是用groovy语言。Android BuildTools Android S…一 Gradle 、AGP(Android Gradle Plugin)、 buildTools分别是什么他们之间什么关系 Gradle Gradle是基于JVM的构建工具。他本身使用jave写的gradle的脚本也就是build.gradle通常是用groovy语言。Android BuildTools Android SDK Build-Tools 是构建 Android apk、AAR文件等Android平台产物所需的一个 Android SDK 组件安装在 /build-tools/ 目录下。 ├── ⋮ ├── aapt2 ├── d8 ├── apksigner ├── zipalign ├── ⋮ AAPT2*:Android 资源打包工具是一种构建工具Android Studio 和 Android Gradle 插件使用它来编译和打包应用的。AAPT2 会解析资源、为资源编制索引并将资源编译为针对 Android 平台进行过优化的二进制格式。apksigner:工具为 APK 签名并确保 APK 的签名将在该 APK 支持的所有版本 Android 平台上成功通过验证。d8:Android Gradle 插件使用该工具来将项目的 Java 字节码编译为在 Android 设备上运行的 DEX 字节码。Zipalign:在将 APK 文件分发给最终用户之前先使用 zipalign 进行优化。 二在rootProject下的build.gradle中buildscript的 repositories和allprojects的repositories有什么区别 buildscript {repositories {jcenter()google()maven {url https://maven.google.com/name Google}}dependencies {classpath com.android.tools.build:gradle:2.3.3} } allprojects {repositories {jcenter()google()maven {url http://maven.xxxxxxxx/xxxxx}} } • buildscript里是gradle脚本执行所需依赖如上所示对应的是maven库和插件 。 • allprojects里是项目本身需要的依赖比如代码中某个类是打包到maven私有库中的那么在allprojects—repositories中需要配置maven私有库而不是buildscript中不然找不到。 三Kotlin携程 Dispatchers.Default和Dispatchers.IO的区别 Dispatchers.Default 提交任务此时线程池里所有任务都在忙碌于是尝试创建新的线程而又因为当前计算型的线程数8等于核心线程数此时不能创建新的线程因此该任务暂时无法被线程执行。Dispatchers.IO提交任务此时线程池里所有任务都在忙碌于是尝试创建新的线程而当前阻塞的任务数为1当前线程池所有线程个数为8因此计算型的线程数为 8-17小于核心线程数最后可以创建新的线程用以执行任务。这也是两者的最大差异因为对于计算型(非阻塞)的任务很占CPU即使分配再多的线程CPU没有空闲去执行这些线程也是白搭而对于IO型(阻塞)的任务不怎么占CPU因此可以多开几个线程充分利用CPU性能。 四App抓包和防抓包 使用Charles抓包需要做哪些操作: 电脑上需要安装证书。这个主要是让Charles充当中间人颁布自己的CA证书。手机上需要安装证书。这个是访问Charles获取手机证书然后安装即可。Android项目代码设置兼容。Google 推出更加严格的安全机制应用默认不信任用户证书手机里自己安装证书自己的app可以通过配置解决相当于信任证书的一种操作 防抓包的关键点 APP安全配置 添加配置文件 android:networkSecurityConfig“xml/network_security_config”需要给okhttpClient配置: 用X509TrustManager 来监听校验服务端证书有效性。遍历设备上信任的证书通过证书别名将用户证书别名中含有user字段过滤掉只将系统证书添加到验证列表中 关闭代理 charles 和 fiddler 都使用代理来进行抓包对网络客户端使用无代理模式即可防止抓包如 OkHttpClient.Builder() .proxy(Proxy.NO_PROXY) .build()通常情况下上述的办法有用但是无法防住使用 VPN 导流进行的抓包 使用VPN抓包的原理是先将手机请求导到VPN再对VPN的网络进行Charles的代理绕过了对App的代理。 证书校验(单向认证) 下载服务器端公钥证书 为了防止上面方案可能导致的“中间人攻击”可以下载服务器端公钥证书然后将公钥证书编译到Android应用中一般在assets文件夹保存由应用在交互过程中去验证证书的合法性。设置证书校验 通过OkHttp的API方法 sslSocketFactory(sslSocketFactory,trustManager) 设置SSL证书校验。设置域名合法性校验 通过OkHttp的API方法 hostnameVerifier(hostnameVerifier) 设置域名合法性校验。 APP安全配置双向认证 什么叫做双向认证: SSL/TLS 协议提供了双向认证的功能即除了 Client 需要校验 Server 的真实性Server 也需要校验 Client 的真实性。双向认证的原理 双向认证需要 Server 支持Client 必须内置一套公钥证书 私钥。在 SSL/TLS 握手过程中Server 端会向 Client 端请求证书Client 端必须将内置的公钥证书发给 ServerServer 验证公钥证书的真实性。 用于双向认证的公钥证书和私钥代表了 Client 端身份所以其是隐秘的一般都是用 .p12 或者 .bks 文件 密钥进行存放。代码层面如何做双向认证 双向校验就是自定义生成客户端证书保存在服务端和客户端当客户端发起请求时在服务端也校验客户端的证书合法性如果不是可信任的客户端发送的请求则拒绝响应。服务端根据自身使用语言和网络框架配置相应证书校验机制即可。 防止挂载抓包 什么是挂载 Xposed黑科技: Xposed JustTrustMe 可以破解绕过校验CA证书。那么这样CA证书的校验就形同虚设了对App的危险性也很大。App多开运行在多个环境上: 多开App的原理类似都是以新进程运行被多开的App并hook各类系统函数使被多开的App认为自己是一个正常的App在运行。 一种是从多开App中直接加载被多开的App如平行空间、VirtualApp等另一种是让用户新安装一个App但这个App本质上就是一个壳用来加载被多开的App。VirtualApp黑科技: 它破坏了Android 系统本身的隔离措施可以进行免root hook和其他黑科技操作你可以用这个做很多在原来APP里做不到事情于此同时Virtual App的安全威胁也不言而喻。 判断是否具有Xposed环境: 第一种方式获取当前设备所有运行的APP根据安装包名对应用进行检测判断是否有Xposed环境。第二种方式通过自造异常来检测堆栈信息判断异常堆栈中是否包含Xposed等字符串。第三种方式通过ClassLoader检查是否已经加载了XposedBridge类和XposedHelpers类来检测。第四种方式获取DEX加载列表判断其中是否包含XposedBridge.jar等字符串。第五种方式检测Xposed相关文件通过读取/proc/self/maps文件查找Xposed相关jar或者so文件来检测。 判断是否是双开环境: 第一种方式通过检测app私有目录多开后的应用路径会包含多开软件的包名。还有一种思路遍历应用列表如果出现同样的包名则被认为双开了。第二种方式如果同一uid下有两个进程对应的包名在/data/data下有两个私有目录则该应用被多开了。 判断了具有xposed或者多开环境怎么处理App: 目前使用VirtualApp挂载或者Xposed黑科技去hook前期可以先用埋点统计。测试学而思App发现挂载在VA上是推出App。 数据加解密 第一步获取请求的数据。主要是获取请求url和requestBody这一块需要对数据一块处理。第二步对请求数据进行加密。采用RC4加密数据。第三步根据不同的请求方式构造新的request。使用 key 和 result 生成新的 RequestBody 发起网络请求。 数据加解密证书锁定 证书锁定是Google官方比较推荐的一种校验方式 原理是在客户端中预先设置好证书信息握手时与服务端返回的证书进行比较以确保证书的真实性和有效性。如何实现证书锁定 一种通过network_security_config.xml配置 第一种方式配置文件 域名api.zuoyebang.cnxxx 38JpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhK90 9k1a0LRMXouZHRC8Ei4PyuldPDcf3UKgO/04cDM90K另一种通过代码设置 val pinners CertificatePinner.Builder() .add(“api.zuoyebang.cnxxx”, “sha256//89KpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRh00L”) .add(“api.zuoyebang.cnxxx”, “sha256//a8za0LRMXouZHRC8Ei4PyuldPDcf3UKgO/04cDM1o09”) .build() val builder OkHttpClient.Builder() builder.apply {     certificatePinner(pinners) } Sign签名:为了保证数据在通信时的安全性我们可以采用参数签名的方式来进行相关验证。 需要对请求参数进行签名验证签名方式如下key1value1key2value2key3value3secretyc 。对这个字符串进行md5一下服务端对sign校验 合法正确签名sign才可以获取数据。这样就解决了身份验证和防止参数篡改问题如果请求参数被人拿走没事他们永远也拿不到secret因为secret是不传递的。再也无法伪造合法的请求 五CPU 和 ABI 的关系 CPU 架构是 CPU 厂商定义的 CPU 规范目前主流的 CPU 架构分为两大类 复杂指令集CISC 例如 Intel 和 AMD 的 X86 架构精简指令集RISC 例如 IBM 的 PowerPC 架构、ARM 的 ARM 架构。 Android 支持 的 ABI ABI描述armeabi第 5 代、第 6 代的ARM 处理器基本退出历史舞台armeabiv-v7a第 7 代及以上的 ARM 处理器正在逐步退出历史舞台arm64-v8a第 8 代、64 位 ARM 处理器目前是主流x86 / x86_64一般是模拟器 Android构建64位apkndk.abiFilters 配置 android {...defaultConfig {...ndk {abiFilters armeabi-v7a,arm64-v8a}} }六你不一定知道的Android小知识 子线程未必不能更新UI Android的UI访问是没有加锁的多线程访问时并不安全。所以规定只能在UI线程中访问UI。 负责检查线程的就是 ViewRootImpl 的 checkThread() 方法然而 ViewRootImpl 的创建在 onResume() 回调之后。那么在 onResume() 之前子线程里也是可以更新 UI 的 。即使是 ViewRootImpl 创建后只要不调用 checkThread()子线程里更新也并不会报错。 代码 new 的 View 没有id Android布局文件中通过 id 的方式可以在 R文件 中生成对应的一个Int值用于在运行时保证资源唯一性但动态在代码中 new 的 View 没有 id 。如果你有需求使用它的id可以调用 View 的 generateViewId() 方法来生成 id(API17) 而非用随机数产生或手写一个具体的值。 View 的 getContext 返回的未必是Activity Activity中setContentView时一定是Activity;通过 new View、View.inflate、LayoutInflater.inflate 这几种方式添加View我们传参时传的是什么context, View中的就是什么Context.在5.0系统版本以下的手机且 Activity 是继承自 AppCompatActivity 的那么View的getConext方法返回的就不是Activity而是TintContextWrapper。 boolean 类型占几个字节 java中 boolean 表示的实际信息是一位1表示true0表示false。但是Java规范 数据类型文档 没有精确定义内存中布尔变量的实际大小。其大小与虚拟机相关可以肯定的是不会是 1 个 bit 。Java 虚拟机的建议如下 1.boolean 类型被编译成 int 类型来使用占 4 个 byte 。2.boolean 数组被编译成 byte 数组类型每个 boolean 数组成员占 1 个 byte 硬件加速不是哪里都能开关 硬件加速在Window级只能开不能关View级只能关不能开。Application 和 Activity 控制,在 AndroidManifest 文件中 Application 或 Activity 节点添加 android:hardwareAccelerated“true”Window控制 getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)View控制 view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);查询是否开启硬件加速 View.isHardwareAccelerated() Canvas.isHardwareAccelerated() 用 getVisibility() 判断用户是否能看见并不好 getVisibility()只判断它自身是否是显示状态。但是如果它的父级不可见呢用 isShown() 方法更合适些会先判断当前 View 的flag 然后循环拿到父View判断是不是可见。只要有一个是不可见的就返回false。 七Fragment getActivity()空指针 这种情况一般发生在在异步任务里调用getActivity()而Fragment已经onDetach()此时就会有空指针解决方案是在Fragment里使用 一个全局变量mActivity在onAttach()方法里赋值这样可能会引起内存泄漏但是异步任务没有停止的情况下本身就已经可能内存泄漏相比直接crash这种方式 显得更妥当一些。Fragment视图重叠 在类onCreate()的方法加载Fragment并且没有判断saveInstanceStatenull或if(findFragmentByTag(mFragmentTag) null)导致重复加载了同一个Fragment导致重叠。PSreplace情况下如果没有加入回退栈则不判断也不会造成重叠但建议还是统一判断下 八SurfaceView SurfaceView中包含一个Surface对象而Surface是可以在后台线程中绘制的,SurfaceView的性质决定了其比较适合一些场景需要界面迅速更新、对帧率要求较高的情况在绘制线程中必须先合法的获取 Surface 才能开始绘制内容 SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed() 之间的状态为合法的另外在Surface类型为SURFACE_TYPE_PUSH_BUFFERS时候是不合法的。 额外的绘制线程会消耗系统的资源在使用SurfaceView的时候要注意这点只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知ViewSurfaceHolder.Callback具有如下的接口 surfaceCreated(SurfaceHolder holder)当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作一般情况下都是在另外的线程来绘制界面所以不要在这个函数中绘Surface。surfaceChanged(SurfaceHolder holder, int format, int width,int height)当Surface的状态大小和格式发生变化的时候会调用该函数在surfaceCreated调用后该函数至少会被调用一次。surfaceDestroyed(SurfaceHolder holder)当Surface被摧毁前会调用该函数该函数被调用后就不能继续使用Surface了一般在该函数中来清理使用的资源。 通过SurfaceView的getHolder()函数可以获取SurfaceHolder对象Surface 就在SurfaceHolder对象内。虽然Surface保存了当前窗口的像素数据但是在使用过程中是不直接和Surface打交道的由SurfaceHolder的Canvas lockCanvas()或则Canvas lockCanvas(Rect dirty)函数来获取Canvas对象通过在Canvas上绘制内容来修改Surface中的数据。如果Surface不可编辑或则尚未创建调用该函数会返回null在unlockCanvas() 和 lockCanvas()中Surface的内容是不缓存的所以需要完全重绘Surface的内容为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect dirty)函数来指定一个dirty区域这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后SurfaceView会获取Surface的一个同步锁直到调用unlockCanvasAndPost(Canvas canvas)函数才释放该锁这里的同步机制保证在Surface绘制过程中不会被改变被摧毁、修改。当在Canvas中绘制完成后调用函数unlockCanvasAndPost(Canvas canvas)来通知系统Surface已经绘制完成这样系统会把绘制完的内容显示出来。为了充分利用不同平台的资源发挥平台的最优效果可以通SurfaceHolder的setType函数来设置绘制的类型目前接收如下的参数 SURFACE_TYPE_NORMAL用RAM缓存原生数据的普通SurfaceSURFACE_TYPE_HARDWARE适用于DMA(Direct memory access )引擎和硬件加速的SurfaceSURFACE_TYPE_GPU适用于GPU加速的SurfaceSURFACE_TYPE_PUSH_BUFFERS表明该Surface不包含原生数据Surface用到的数据由其他对象提供在Camera图像预览中就使用该类型的Surface有Camera负责提供给预览Surface数据这样图像预览会比较流畅。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了。 九 kotlin-compiler-embeddable 下载慢的问题 打开网址 https://mvnrepository.com/搜索kotlin-compiler-embeddable进入kotlin-compiler-embeddable点入所需jar包file后面下载所需jar包版本配置下载jar文件到.gradle文件中 文件路径:/Users/“用户名”/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.70/ 重启AS 十 java判断点在三角形内 java中在给定三角形的三个顶点和一个待判断的点的情况下我们可以使用一些数学知识来判断该点是否在三角形内。首先我们可以使用向量叉积的方法来进行判断。给定三角形顶点A、B、C以及待判断的点P。我们可以计算向量AP、BP和CP与向量AB、BC和CA的叉积分别表示为cross1、cross2和cross3。如果这三个叉积均为正数或者均为负数那么点P位于三角形ABC内部。如果至少有一个叉积为0则表示该点在三角形ABC上。其次我们还可以通过计算三个子三角形的面积之和与原三角形面积进行比较来判断。同样给定三角形顶点A、B、C以及待判断的点P。我们可以计算出子三角形ABP、BCP和CAP分别的面积并将它们加起来得到sum_areas。然后再计算出原三角形ABC的面积area。如果sum_areas等于area则表示该点位于三角形ABC内部如果sum_areas小于area则表示该点在三角形ABC外部。最后在Java中我们可以编写一个方法来实现上述算法并返回一个布尔值表示待判断的点是否在给定的三角形内。 public static boolean isPointInTriangle(Point A, Point B, Point C, Point P) {// 计算向量叉积double cross1 (P.x - A.x) * (B.y - A.y) - (P.y - A.y) * (B.x - A.x);double cross2 (P.x - B.x) * (C.y - B.y) - (P.y - B.y) * (C.x - B.x);double cross3 (P.x - C.x) * (A.y - C.y) - (P.y - C.y) * (A.x - C.x);// 判断是否在三角形内部if((cross1 0 cross2 0 cross3 0) || (cross1 0 cross2 0 cross3 0)) {return true;}// 判断是否在三角形上if(cross1 0 || cross2 0 || cross3 0){return true;}return false; }十一 RK 开发板源码编译 RK官网 https://www.rock-chips.com/ RK开发工具AndroidSDK网址 https://www.t-firefly.com/doc/download/page/id/3.html#other_144https://wiki.t-firefly.com/zh_CN/Firefly-RK3399/compile_android8.1_firmware.html RK开发板AndroidSDK和AndroidStudio的AndroidSDK区别 RK开发板AndroidSDK是指为RK系列开发板定制的Android开发工具包包含了开发板的驱动程序、库文件、示例代码等以便开发者可以在RK开发板上进行Android应用的开发和调试。而AndroidStudio的AndroidSDK是指Google官方提供的Android开发工具包包含了Android平台的API、工具和库文件等用于开发和调试Android应用。两者的区别主要在于适用对象和功能。RK开发板AndroidSDK主要针对RK系列开发板提供了特定的驱动和示例代码方便开发者在RK开发板上进行Android应用的开发和调试而AndroidStudio的* AndroidSDK适用于所有的Android设备提供了全面的Android开发工具和资源可用于开发和调试任何Android设备上的应用。总结来说RK开发板AndroidSDK是为RK系列开发板定制的Android开发工具包而AndroidStudio的AndroidSDK是Google官方提供的通用Android开发工具包。 十二 so库冲突解决 出现错误的问题日志 2 files found with path lib/arm64-v8a/libc_shared.so from inputs:- D:\AndroidProject\juaismapp\opencvsdk\build\intermediates\library_jni\debug\jni\arm64-v8a\libc_shared.so- D:\AndroidCache\.gradle\caches\transforms-3\74c11438533af106ed521e9aba5a6698\transformed\jetified-mmkv-1.0.22\jni\arm64-v8a\libc_shared.so If you are using jniLibs and CMake IMPORTED targets, see解决 这是以为opencv和mmkv里面都有 ibc_shared.so 库造成冲突我们只需在build.gradle中的android节点下将这些重复的so文件依次声明优先使用第一个即可 android {........packagingOptions {pickFirst lib/arm64-v8a/libc_shared.sopickFirst lib/armeabi-v7a/libc_shared.sopickFirst lib/x86/libc_shared.sopickFirst lib/x86_64/libc_shared.so} }
http://www.zqtcl.cn/news/197900/

相关文章:

  • 网站交互做的比较好的怎样营销网站建设
  • 电子商务网站设计代码凡科做的网站能被收录吗
  • 设计网站教程自动点击器永久免费版
  • 深圳 网站建设设计如何用公众号做网站
  • 免费微信网站制作北风淘淘网站开发
  • 建筑模型设计网站建设网站设计 分辨率
  • 网站规划包括哪些内容西部建设网站
  • 网站html静态化网站整体色彩的建设
  • 长春比较有名的做网站建设宁波网站建设联系电话查询
  • 建网站中企动力推荐网络营销外包总代理
  • 网站怎么续费网站内链检测
  • 织梦网站地图样式中国品牌网站
  • 上海金山区建设局网站临淄信息港发布信息
  • 保定外贸网站建设学生网站建设首页
  • 商城网站备案要求wordpress插件 手机版
  • 北京市网站备案查询石家庄建设信息网必须交费吗
  • 北京优化网站方法四川省建设局网站
  • 怎么做网站能快速赚钱重庆快速建站
  • 河南专业网站建设公司首选培训心得简短200字
  • 销售网站开发业务高端建网站多少钱
  • 几个做ppt的网站知乎青岛高品质网站制作
  • 网站seo插件wordpress模板中文版
  • 夹江移动网站建设手机网站微信登陆
  • 浏阳做网站网易企业邮箱注册官网
  • 东莞网站建设是什么意思自己怎么做企业网站建设
  • 免费的网站申请泰州网站整站优化
  • 毕业设计做企业门户网站过期域名网站
  • 网站建设和风险分析简单网页制作代码模板
  • 照片展示网站那个网站可以做攻略
  • 优秀网站设计赏析万网网站备案多久