IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【ONVIF】ONVIF密码加密方式解析 -> 正文阅读

[移动开发]【ONVIF】ONVIF密码加密方式解析

什么是ONVIF

ONVIF是一个国际通用的摄像头通信控制协议,一般主流的设备厂商都支持该协议

为什么要写这篇博客

今天在实现android版本ONVIF协议时,发现它的加密方式,是一个很好的学习案例

所以特地总结一下,供大家学习,加密方式属于通用知识,不仅适用于摄像头,也适合与客户端、服务端等领域

ONVIF的通信流程

  1. 客户端通过Http向摄像头发送一个xml字符串,该xml中包含了随机数,用户名,当前时间,加密后的密码
  2. 摄像头判断随机数是否使用过,如果已使用过,直接请求失败
  3. 摄像头判断时间与当前差距是否很大,如果相隔很久,直接请求失败
  4. 摄像头通过客户端提供的信息,和真实密码,校验加密后的密码是否正确,校验失败则请求失败
  5. 以上流程都通过,并且内容格式正确,则请求成功

密码加密和校验原理

这里我们把摄像头当作服务端,因为它内置了一个Http服务

  1. 客户端将nonce+time+password相加,生成一个sha1摘要字符串,作为加密后的密码
  2. 服务端也按照一样的方式,生成sha1摘要,对比摘要是否相同,相同则说明密码正确
  3. 服务端将nonce标记为已使用,下次遇到相同的nonce,直接请求失败
  4. 服务端校验time和当前时间是否相隔很久,如果相隔很久,直接请求失败
  5. 由于sha1是摘要算法,不可逆,因此即使报文泄漏也无法抓取真实密码
  6. 由于nonce是一次性的,因此抓取到sha1,也无法再次复用
  7. 由于服务端有错误次数限制,也无法通过暴力方式破解

密码加密实现代码


	package com.wp.android_onvif.onvifBean;
	
	import java.security.MessageDigest;
	import java.text.SimpleDateFormat;
	import java.util.*;
	
	//加密过程:
	//客户端将nonce+time+password拼装起来,生成一个sha1摘要字符串,作为加密后的密码
	//加密过程:
	//服务端也按照一样的方式,生成sha1摘要,对比是否相等
	//并将该nonce标记为已使用过,不允许再次使用
	//安全性原理:
	//由于sha1是摘要算法,不可逆的,因此即使报文泄漏也无法抓取真实密码
	//由于nonce是一次性的,因此抓取到sha1,也无法再次复用
	//由于服务端有错误次数限制,也无法通过暴力方式破解
	public class Digest {
	
	    public String nonce;
	    public String username;
	    public String password;
	    public String time;
	
	    public String encryptedNonce;
	    public String encryptedPassword;
	
	    public static Digest build(String username, String password) throws Throwable {
	        Digest digest = new Digest();
	        digest.nonce = new Random().nextInt() + "";
	        digest.username = username;
	        digest.password = password;
	        digest.time = digest.getUTCTime();
	        digest.encryptedNonce = android.util.Base64.encodeToString(digest.nonce.getBytes(), android.util.Base64.DEFAULT).trim();
	        digest.encryptedPassword = digest.getEncryptedPassword().trim();
	        return digest;
	    }
	
	    protected String getUTCTime() {
	        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
	        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-d'T'HH:mm:ss'Z'");
	        format.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
	        String utcTime = format.format(calendar.getTime());
	        return utcTime;
	    }
	
	    protected String getEncryptedPassword() throws Throwable {
	        String origin = nonce + time + password;
	        byte[] encrypted = sha1(origin);
	        String encoded = android.util.Base64.encodeToString(encrypted, android.util.Base64.DEFAULT);
	        return encoded;
	    }
	
	    protected byte[] sha1(String origin) throws Throwable {
	        MessageDigest SHA1 = MessageDigest.getInstance("SHA1");
	        SHA1.reset();
	        SHA1.update(origin.getBytes());
	        byte[] encrypted = SHA1.digest();
	        return encrypted;
	    }
	}



  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:04:20  更:2022-09-30 01:07:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 2:42:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码