Docker系列之安全

Docker的安全
前言
一、Docker 容器与虚拟机的区别
       1. 隔离与共享
        2. 性能与损耗
二、Docker 存在的安全问题
       1.Docker 自身漏洞
       2.Docker 源码问题
三、 Docker 架构缺陷与安全机制
      1. 容器之间的局域网攻击
      2. DDoS 攻击耗尽资源
      3. 有漏洞的系统调用
      4. 共享root用户权限
四、Docker 安全基线标准​​​​​​​
      1. 内核级别
      2. 主机级别
      3. 网络级别
      4. 镜像级别
      5. 容器级别
      6. 其他设置
五、容器相关的常用安全配置方法
     1. 容器最小化
     2. Docker 远程 API 访问控制
六、限制流量流向
七、镜像安全
八、DockerClient 端与 DockerDaemon 的通信安全
九、避免Docker 容器中信息泄露

前言
容器的安全性问题的根源在于容器和宿主机共享内核。如果容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃。与虚拟机是不同的,虚拟机并没有与主机共享内核,虚拟机崩溃一般不会导致宿主机崩溃。
一、Docker 容器与虚拟机的区别

1. 隔离与共享
虚拟机通过添加 Hypervisor 层,虚拟出网卡、内存、CPU 等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。
而Docker容器则是通过隔离的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制,最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核、文件系统、硬件等资源。

2. 性能与损耗
与虚拟机相比,容器资源损耗要少。同样的宿主机下,能够建立容器的数量要比虚拟机多。
但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor 层,这是极其困难的。
而 docker 容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。

 

不同点Docker容器   虚拟机
启动速度 秒级   分钟级
运行性能 接近原生(直接在内核中运行)50%左右损失
磁盘占用 MB  GB
数量    成百上千   一般几十台
隔离性   进程级别  系统级别(更彻底)
操作系统  主要支持Linux  几乎所有
封装程度  只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

​​​​​​​​​​​​​​
二、Docker 存在的安全问题

1.Docker 自身漏洞
作为一款应用 Docker 本身实现上会有代码缺陷。CVE 官方记录 Docker 历史版本共有超过 20 项漏洞,可参见 Docker 官方网站。
黑客常用的攻击手段主要有代码执行、权限提升、信息泄露、权限绕过等。目前 Docker 版本更迭非常快,Docker 用户可将 Docker 升级为最新版本。
2.Docker 源码问题
Docker 提供了 Docker hub,可以让用户上传创建的镜像,以便其他用户下载,快速搭建环境。但同时也带来了一些安全问题。
例如下面三种方式:
(1)黑客上传恶意镜像

如果有黑客在制作的镜像中植入木马、后门等恶意软件,那么环境从一开始就已经不安全了,后续更没有什么安全可言。
(2)镜像使用有漏洞的软件

DockerHub上能下载的镜像里面,75%的镜像都安装了有漏洞的软件。所以下载镜像后,需要检查里面软件的版本信息,对应的版本是否存在漏洞,并及时更新打上补丁。
(3)中间人攻击篡改镜像

镜像在传输过程中可能被篡改,目前新版本的 Docker 已经提供了相应的校验机制来预防这个问题。
三、 Docker 架构缺陷与安全机制
Docker本身的架构与机制就可能产生问题,例如这样一种攻击场景,黑客已经控制了宿主机上的一些容器,或者获得了通过在公有云上建立容器的方式,然后对宿主机或其他容器发起攻击。
1. 容器之间的局域网攻击
主机上的容器之间可以构成局域网,因此针对局域网的ARP欺骗、端口扫描、广播风暴等攻击方式便可以用上。
所以,在一个主机上部署多个容器需要合理的配置网络安全,比如设置 iptables 规则。
2. DDoS 攻击耗尽资源
Cgroups 安全机制就是要防止此类攻击的,不要为单一的容器分配过多的资源即可避免此类问题。
3. 有漏洞的系统调用
Docker 与虚拟机的一个重要的区别就是 Docker 与宿主机共用一个操作系统内核。
一旦宿主内核存在可以越权或者提权漏洞,尽管Docker使用普通用户执行,在容器被入侵时,攻击者还可以利用内核漏洞跳到宿主机做更多的事情。
4. 共享root用户权限
如果以 root 用户权限运行容器(docker run --privileged),容器内的 root 用户也就拥有了宿主机的root权限。
四、Docker 安全基线标准
下面从内核、主机、网络、镜像、容器以及其它等 6 个方面总结 Docker 安全基线标准。
1. 内核级别
(1)及时更新内核。
(2)User NameSpace(容器内的 root 权限在容器之外处于非高权限状态)。
(3)Cgroups(对资源的配额和度量),设置CPU、内存、磁盘 IO等资源限制。
(4)通过启用SELinux/AppArmor/GRSEC(控制文件访问权限)适当的强化系统来增加额外的安全性。
(5)Capability(权限划分),比如划分指定的CPU给容器。
(6)Seccomp(限定系统调用),限制不必要的系统调用。
(7)禁止将容器的命名空间与宿主机进程命名空间共享,比如 host 网络模式。
2. 主机级别
(1)为容器创建独立分区,比如创建在分布式文件系统上。
(2)仅运行必要的服务,注意尽量避免在容器中运行 ssh 服务 。
(3)禁止将宿主机上敏感目录映射到容器,-v创建数据卷时需要注意。
(4)对 Docker 守护进程、相关文件和目录进行审计,防止有病毒或木马文件生成。
(5)设置适当的默认文件描述符数。(文件描述符:简称fd,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件描述符用于对应这个打开/新建的文件,文件描述符本质上就是一个非负整数,读写文件也是需要使用这个文件描述符来指定待读写的文件的。文件描述符是一个重要的系统资源,理论上系统内存多大就应该可以打开多少个文件描述符,但是实际情况是,内核会有系统级限制,以及用户级限制,不让某一个应用程序进程消耗掉所有的文件资源,可以使用ulimit -n 查看)
(6)用户权限为 root 的 Docker 相关文件的访问权限应该为 644 或者更低权限。
(7)周期性检查每个主机的容器清单,并清理不必要的容器。
3. 网络级别
(1)通过 iptables 设定规则实现禁止或允许容器之间网络流量。
(2)允许 Docker 修改 iptables。
(3)禁止将 Docker 绑定到其他已使用的 IP/Port 或者 Unix Socket。
(4)禁止在容器上映射特权端口。
(5)容器上只开放所需要的端口。
(6)禁止在容器上使用 host 网络模式。
(7)若宿主机有多个网卡,将容器进入流量绑定到特定的主机网卡上。
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork
docker run -itd --net mynetwork --ip 172.18.0.100 centos:7 /bin/bash
iptables -t nat -A POSTROUTING -s 172.18.0.100 -o ens36 -j SNAT --to-source 192.168.80.10

4. 镜像级别
(1)创建本地私有镜像仓库服务器。
(2)镜像中软件都为最新版本,建议根据实际情况使用对应版本,业务稳定优先。
(3)使用可信镜像文件,并通过安全通道下载。
(4)重新构建镜像而非对容器和镜像打补丁,销毁异常容器重新构建。
(5)合理管理镜像标签,及时移除不再使用的镜像。
(6)使用镜像扫描。
(7)使用镜像签名。
5. 容器级别
(1)容器最小化,操作系统镜像最小集。
(2)容器以单一主进程的方式运行。
(3)禁止 --privileged 标记使用特权容器。
(4)禁止在容器上运行 ssh 服务,尽量使用 docker exec 进入容器。
(5)以只读的方式挂载容器的根目录系统,-v 宿主机目录:容器目录:ro。
(6)明确定义属于容器的数据盘符。
(7)通过设置 on-failure 限制容器尝试重启的次数,容器反复重启容易丢失数据,–restart=on-failure:3。
(8)限制在容器中可用的进程数,docker run -m 限制内存的使用,以防止 fork炸弹。(fork炸弹,迅速增长子进程,耗尽系统进程数量)
6. 其他设置
(1)定期对宿主机系统及容器进行安全审计。
(2)使用最少资源和最低权限运行容器,此为 Docker 容器安全的核心思想。
(3)避免在同一宿主机上部署大量容器,维持在一个能够管理的数量。
(4)监控 Docker 容器的使用,性能以及其他各项指标,比如 zabbix。
(5)增加实时威胁检测和事件报警响应功能,比如 zabbix。
(6)使用中心和远程日志收集服务,比如 ELK 。
由于安全属于非常具体的技术,这里不再赘述,可直接参阅 Docker
官方文档,https://docs.docker.com/engine/security/
五、容器相关的常用安全配置方法
1. 容器最小化
如果仅在容器中运行必要的服务,像 SSH 等服务是不能轻易开启去连接容器的。通常使用以下方式来进入容器。
docker exec -it a661258f6bfe bash
2. Docker 远程 API 访问控制
Docker 的远程调用API 接口存在未授权访问漏洞,至少应限制外网访问。建议使用 Socket 方式访问。
(1)在宿主机上监听内网 ip 和 docker daemon 的方式启动
方法一:
docker -d -H uninx:///var/run/docker.sock -H tcp://192.168.80.10:2375
方法二:
//在 docker 服务配置文件指定
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.80.10:2375

(2)重启 Docker
systemctl daemon-reload
systemctl restart docker
netstat -natp | grep 2375

(3)在宿主机的 firewalld 上做 IP 访问控制,source address 指定的是客户端地址
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.80.15" port protocol="tcp" port="2375" accept"
firewall-cmd --reload

iptables -F

(4)在客户端上实现远程授权访问
docker -H tcp://192.168.80.10 images

六、限制流量流向
//使用防火墙过滤器限制 Docker 容器的源 IP 地址范围与外界通讯。
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.80.0/24" reject"

//生产环境中的大量问题是因为 Docker 容器端口外放引起的漏洞,除了操作系统账户权限控制上的问题,更在于对 Docker Daemon
的进程管理上存在隐患。
目前常用的 Docker 版本都支持 Docker Daemon 管理宿主机 iptables 的,而且一旦启动进程加上 -p host_port:guest_port 的端口映射,Docker Daemon 会直接增加对应的 FORWARD Chain 并且 -j ACCEPT,而默认的 DROP 规则是在 INPUT 链做的,对 docker 没法限制,这就留下了很严重的安全隐患。因此建议:
(1)不在有外网 ip 的机器上使用 Docker 服务。
(2)使用 k8s 等 docker 编排系统管理 Docker 容器。
(3)宿主机上 Docker daemon 启动命令加一个 --iptables=false,然后把常用 iptables 规则写进文件里,再用 iptables-restore 重定向输入去刷新规则。
七、镜像安全
一般情况下,要确保只从受信任的库中获取镜像,推荐使用 harbor 私有仓库。
如果公司使用的不是自己的镜像源,需要使用 Docker 镜像安全扫描工具 Clair,对下载的镜像进行检查。通过与通过与 CVE 数据库同步扫描镜像,验证镜像的 md5 等特征值,确认一致后再基于镜像进一步构建。一旦发现漏洞则通知用户处理, 或者直接阻止镜像继续构建。
八、DockerClient 端与 DockerDaemon 的通信安全
为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中间人攻击,c/s 两端应该通过 TLS 加密方式通讯。
通过在服务端上创建tls密钥证书,再下发给客户端,客户端通过私钥访问容器,这样就保证的docker通讯的安全性。
首先创建ca证书,ca证书只是一个官方认证的证书,接下来要创建server、client节点的证书。
此时创建证书有三步:
(1)设置私钥,确保安全加密
(2)使用私钥签名,确保身份真实不可抵赖
(3)使用ca证书制作证书

master    192.168.80.10    docker-ce
client    192.168.80.15    docker-ce
//首先创建一个存放目录
mkdir /tls
cd /tls/
//生成ca证书
(1)创建ca私钥
openssl genrsa -aes256 -out ca-key.pem 4096            #输入123123
----------------------------------------------------------------------------------------------------------
genrsa:使用RSA算法产生私钥
-aes256:使用256位密钥的AES算法对私钥进行加密,这样每次使用私钥文件都将输入密码,可省略
-out:输出文件的路径,若未指定输出文件,则为标准输出
4096:指定私钥长度,默认为1024。该项必须为命令行的最后一项参数
----------------------------------------------------------------------------------------------------------
(2)创建ca证书
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem            #输入123123
----------------------------------------------------------------------------------------------------------
req:执行证书签发命令
-new:新证书签发请求
-x509:生成x509格式证书,专用于创建私有CA时使用
-days:证书的有效时长,单位是天
-key:指定私钥路径
-sha256:证书摘要采用sha256算法
-subj:证书相关的用户信息(subject的缩写)
-out:输出文件的路径
----------------------------------------------------------------------------------------------------------
//用ca证书签发server端证书
(3)创建服务器私钥
openssl genrsa -out server-key.pem 4096
(4)生成证书签名请求文件(csr文件)
openssl req -new -key server-key.pem -sha256 -subj "/CN=*" -out server.csr
(5)使用ca证书与私钥证书签发服务端签名证书,输入123123
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
----------------------------------------------------------------------------------------------------------
x509:生成x509格式证书
-req:输入csr文件
-in:要输入的csr文件
-CA:指定ca证书的路径
-CAkey:指定ca证书的私钥路径
-CAcreateserial:表示创建证书序列号文件,创建的序列号文件默认名称为ca.srl
----------------------------------------------------------------------------------------------------------
//用ca证证书签发client端证书
(6)生成客户端私钥
openssl genrsa -out client-key.pem 4096
(7)生成证书签名请求文件
openssl req -new -key client-key.pem -subj "/CN=client" -out client.csr
(8)创建扩展配置文件,使秘钥适合客户端身份验证
echo extendedKeyUsage=clientAuth > extfile.cnf
(9)使用ca证书签发客户端签名证书,输入123123
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf
//删除两个证书签名请求文件和扩展配置文件
rm -rf ca.srl client.csr extfile.cnf server.csr
//配置docker服务配置文件
vim /lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
//重启docker服务
systemctl daemon-reload
systemctl restart docker
netstat -natp | grep 2376
setenforce 0
//将 /tls 目录中的 ca.pem、client-cert.pem、client-key.pem 三个文件复制到另一台主机
scp ca.pem root@192.168.80.10:/etc/docker/
scp cert.pem root@192.168.80.10:/etc/docker/
scp key.pem root@192.168.80.10:/etc/docker/
//修改服务端的主机名和 ip 映射
hostnamectl set-hostname master
su
vim /etc/hosts    
127.0.0.1   master
//本地验证
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images

//在客户端上操作
hostnamectl set-hostname client
su
vim /etc/hosts
192.168.80.10   master
cd /etc/docker/
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images

首先如果要想有一个CA机构签发的证书的话,会自己生成私钥,然后通过私钥证书签名请求(CSR) 让CA去签名,这个证书签名中会包含服务端的- -些信息(比如commonname、organization等) 还有公钥。
CA收到证书签名请求(CSR)之后,会生成一个证书,证书内容包括申请者的信息,CA的信息以及申请者公钥,然后会用CA的私钥进行加密,然后把证书给服务端。
当客户端想要和服务端进行ssL连接的时候要先要发个申请连接的请求。
然后服务端就会把通过CA签发的证书给客户端。
客户端用CA的证书去验证服务端的证书是否正确(一般CA证书会内置在操作系统中,这也是为什么第0步骤会用虚线表示)
客户端验证通过后会用证书中的公钥对数据进行加密保证安全。
注:
●这里只是说的单向SSL过程,如果是双向的话客户端也要有自己的证书
●验证证书通过后之后,客户端和服务端会协商一个对称加密进行通信,因为非对称加密太慢
了。(因为对称加密的过程对本文没影响,所以有兴趣的读者可以自行查找资料或者和我探讨交流)

九、避免Docker 容器中信息泄露
近几年 Github 上大量泄露个人或企业各种账号密码,出现这种问题一般都使用 dockerfile 或者 docker-compose 文件创建容器。
如果这些文件中存在账号密码等认证信息,一旦 Docker 容器对外开放,则这些宿主机上的敏感信息也会随之泄露。
因此可以通过以下方式检查容器创建模板的内容。
# check created users
grep authorized_keys $dockerfile

# check OS users
grep "etc/group" $dockerfile

# Check sudo users
grep "etc/sudoers.d" $dockerfile

# Check ssh key pair
grep ".ssh/.*id_rsa" $dockerfile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue_cli搭建过程项目创建

概述 vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速&am…

uni-app的showModal提示框,进行删除的二次确认,可自定义确定或取消操作

实现效果: 此处为删除的二次确认示例,点击删除按钮时出现该提示,该提示写在js script中。 实现方式: 通过uni.showModal进行提示,success为确认状态下的操作自定义,此处调用后端接口进行了删除操作&#…

如何成为专业的 .NET 开发人员

如今,网上有大量信息,找到正确的信息并非易事。当你开始编程之旅并希望获得全面的指南时,最好寻找一个可以指导你完成整个过程的指南。 本文将帮助您制定一份路线图,告诉您什么是重要的以及什么是需要学习的. 一.一切从软件基础…

【JavaScript】BOM编程

目录 一、BOM编程是什么 二、window对象的常用方法 1、弹窗API方法 2、计时器任务方法 三、window对象的属性对象常用方法 1、history网页浏览历史 2、location地址栏 3、数据存储属性对象 4、console控制台 一、BOM编程是什么 当我们使用浏览器打开一个网页窗口时,…

Volatility 内存取证【信安比赛快速入门】

一、练习基本命令使用 1、获取镜像信息 ./volatility -f Challenge.raw imageinfo 一般取第一个就可以了 2、查看用户 ./volatility -f Challenge.raw --profileWin7SP1x64 printkey -K "SAM\Domains\Account\Users\Names" 3、获取主机名 ./volatility -f Challenge…

Kafka入门-分区及压缩

一、生产者消息分区 Kafka的消息组织方式实际上是三级结构:主题-分区-消息。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中被保存多份。 分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为…

门店客流统计)

门店客流统计 代码部分效果 代码部分 import cv2 import numpy as np from tracker import * import cvzone import timebg_subtractor cv2.createBackgroundSubtractorMOG2(history200, varThreshold140)# Open a video capture video_capture cv2.VideoCapture(r"sto…

昇思25天学习打卡营第3天|数据集与数据变换

数据集 数据集(Dataset)操作shufflemapbatch 数据变换(Transforms)Vision TransformsText TransformsLambda Transforms 总结 数据集(Dataset) 数据是深度学习的基础,深度神经网络的效果对数据…

algorithm中常见算法

1、前言 C的<algorithm>库是C标准库中的一个重要组成部分&#xff0c;它提供了一系列的函数&#xff0c;用于执行各种常见的算法操作&#xff0c;比如排序、查找、替换、合并等。这些算法函数通常以模板函数的形式提供&#xff0c;可以用于任何符合特定条件的容器类型。 …

玩个游戏 找以下2个wordpress外贸主题的不同 你几找到几处

Aitken艾特肯wordpress外贸主题 适合中国产品出海的蓝色风格wordpress外贸主题&#xff0c;产品多图展示、可自定义显示产品详细参数。 https://www.jianzhanpress.com/?p7060 Ultra奥创工业装备公司wordpress主题 蓝色风格wordpress主题&#xff0c;适合装备制造、工业设备…

用友U8 Cloud smartweb2.showRPCLoadingTip.d XXE漏洞复现

0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 Cloud smartweb2.showRPCLoadingTip.d 接口处存在XML实体,攻击者可通过该漏…

Origin做聚类分析并利用聚类插件绘制热力图

1.聚类分析 1.1 K均值聚类 step1、首先进行归一化&#xff0c;具体步骤如图1-1所示&#xff1a; 图1-1 操作后得到归一化值如图1-2所示&#xff1a; 图1-2 step2、执行K均值聚类分析&#xff0c;如图1-3所示&#xff0c;选中聚类列&#xff0c;接着点击“统计”—“多变量分析…

手把手从零开始搭建远程访问服务

远程访问服务工具——FRP frp 是一个能够实现内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网的服务器来转发。 资源链接 根据自己服务型号和操作系统来选取对应的文件&#xff0c;不知道的…

VS2019中解决方案里的所有项目都是 <不同选项> 的解决方案

以上等等&#xff0c;全部是 <不同选项>。。。 这样的话&#xff0c;如何还原和查看原有的值呢&#xff0c;就这么丢失掉了吗&#xff1f; 不会&#xff0c;需要解决方案里配置一下。 解决&#xff1a; 解决方案右键属性 -> 配置属性 -> 配置 -> 将所有配置改…

三大办公软件实用小技巧 沈阳办公软件白领必修班

Word 学好办公软件能大大的提升我们的工作效率。下面让我们一起学习一下Word办公软件时几个实用小技巧&#xff01; 01.快速插入当前日期或时间 在使用Word办公软件进行文档的编辑处理时&#xff0c;如果需要在文章的末尾插入系统的当前日期或时间。通常情况下&#xff0c;我…

如何编写时区源文件

0、背景 ① 修改TZ环境变量改变时区不能立即生效。要求设置时区后立即生效&#xff0c;只能用修改/etc/localtime方式。 ② 原文作者 Bill Seymour&#xff0c;想要查看原文&#xff0c;点击官网地址https://www.iana.org/time-zones下载 zic 源码&#xff0c;源码目录中的 tz…

【TB作品】MSP430,G2533单片机,红外发射,红外接收,红外通信,IR发射

文章目录 题目红外NEC协议介绍基本概述数据帧结构位表示数据传输示例重复码&#xff08;Repeat Code&#xff09;实现细节发送端接收端 典型应用结论 最终效果代码 题目 遥控器 硬件&#xff1a;msp430g2553、oled显示器、ds18b20温度传感器、红外发射器、按键 软件功能&#…

MD5加密接口

签名算法 app_key和app_secret由对方系统提供 MD5_CALCULATE_HASH_FOR_CHAR&#xff08;中文加密与JAVA不一致&#xff09; 代码&#xff1a; *获取传输字段名的ASCII码&#xff0c;根据ASCII码对字段名进行排序SELECT * FROM zthr0051WHERE functionid iv_functionidINTO …

Vatee万腾平台:智慧时代的创新典范

在数字化浪潮席卷全球的今天&#xff0c;我们迎来了一个全新的智慧时代。在这个时代&#xff0c;科技与生活的融合变得日益紧密&#xff0c;为人们的生活带来了前所未有的便利与革新。其中&#xff0c;Vatee万腾平台凭借其卓越的创新能力和前瞻性的技术布局&#xff0c;成为了智…

如何为您的企业实施营销翻译

要为您的业务实施营销翻译&#xff0c;您需要执行以下步骤&#xff1a; 评估市场需求 你首先需要做的事情之一是确定你的产品或服务可以销售的地区或国家。这可以通过 看看在这些地区已经取得成功的竞争对手阅读行业的市场调查和预测&#xff0c;了解市场趋势和潜在机会评估…