精华内容
下载资源
问答
  • 信息隐藏的定义
    千次阅读
    2018-11-08 19:45:24

    为对象创建私用成员是任何面向对象语言中最基本和有用的特性之一。通过将一个方法或属性声明为私用的,可以让对象的实现细节对其他对象保密以降低对象之间的耦合程度,可以保持数据的完整性并对其修改方式加以约束。在代码有许多人参与设计的情况下,这也可以使代码更可靠、更易于调试。简而言之,封装是面向对象的设计的基石。
    尽管JavaScript是一种面向对象的语言,它并不具备用以将成员声明为公用或私用的任何内置机制。目前有几种办法可以用来创建具有公用、私用和特权方法的对象,它们各有优缺点。

    3.1 信息隐藏原则

    3.1.1 封装与信息隐藏

    可以把封装和信息隐藏视为同一个概念的两种表述。信息隐藏是目的,封装是达到这个目的的技术。
    封装可以被定义为对对象的内部数据表现形式和实现细节进行隐藏。要想访问封装过的对象中的数据,只有使用已定义的操作这一种办法。通过封装可以强制实施信息隐藏。许多面向对象语言都使用关键字来说明某些方法和属性应被隐藏。但在JavaScript中没有这样的关键字,我们将使用闭包的概念来创建只允许从对象内部访问的方法和属性。这比使用关键字的办法更复杂。

    3.1.2 接口扮演的角色

    在向其他对象隐藏信息的过程中接口是如何发挥作用的呢?
    接口提供了一份记载着可供公众访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变,这个关系的双方都是可替换的。大多数情况下,你将发现对可以使用的方法加以记载会很有好处。不是有了接口就万事大吉,你应该避免公开未定义于接口中的方法。否则其他对象可能会对那些并不属于接口的方法产生依赖,这是不安全的。因为这些方法随时都可能发生改变或被删除,从而导致整个系统失灵。
    一个理想的软件系统应该为所有类定义接口。这些类只向外界提供它们实现的接口中规定的方法,任何别的方法都留作自用。其所有属性都是私有的,外界只能通过接口中定义的存取操作与之打交道。但实际的系统很少能真正达到这样的境界。优质的代码应尽量向这个目标靠拢,但又不能过于刻板,把那些并不需要这些特性的简单项目复杂化。

    3.2 创建对象的基本模式

    JavaScript创建对象的基本模式有3种

    1. 门户大开型,这是最简单的一种,但它只能提供公用成员。
    2. 使用下划线表示私用方法或属性。
    3. 使用闭包来创建真正的私用成员,这些成员只能通过一些特权方法访问。

    以Book为例,该类满足这样的需求:存储关于一本书的数据,并实现一个以HTML形式显示这些数据的方法。
    你只负责创建这个Book类,别人会创建并使用其实例。它会被这样使用:

    // Book (isbn, title, author)
    var theHobbit = new Book('0-395-07122-4', 'The Hobbit', 'J. R. R. Tolkien');
    theHobbit.display();//通过创建HTML element显示数据
    

    3.2.1 门户大开型对象

    用一个函数来做其构造器,它的所有属性和方法都是公开的、可访问的。这些公用属性需要使用this关键字来创建。

    var Book = function(isbn, title, author) {
    	if(isbn == undefined) throw new Error('Book constructor requires an isbn.');
    	this.isbn = isbn;
    	this.title = title || 'No title specified';
    	this.author = author || 'No author specified';
    };
    Book.prototype.display = function () {
    	...
    }
    

    好像提供了ISBN就可以查到书籍了,可是这里有一个最大的问题,你无法检验ISBN数据的完整性,而不完整的ISBN数据有可能导致display方法失灵。如果Book对象在创建的时候没有什么问题,那么在display时也能正常工作才对,但是由于没有进行完整性检查,就不一定了。下面的版本强化了对ISBN的检查。

    var Book = function(isbn, title, author) {
    	if(!this.checkIsbn(isbn)) throw new Error('Book: Invalid ISBN.');
    	this.isbn = isbn;
    	this.title = title || 'No title specified';
    	this.author = author || 'No author specified';
    }
    Book.prototype = {
    	checkIsbn: function(isbn) {
    		if(isbn == undefined || typeof isbn != 'string'){
    			return false;
    		}
    		isbn = isbn.replace(/-/,'');
    		if(isbn.length != 10 && isbn.length !=13) {
    			return false;
    		}
    		var sum = 0;
    		if(isbn.length === 10) {//10位的ISBN
    			if(!isbn.match(/^\d{9}/)) {
    				return false;
    			}
    			for(var i = 0; i < 9; i++) {
    				sum += isbn.charAt(i) * (10-i);
    			}
    			var checksum = sum % 11;
    			if(checksum === 10) checksum = 'X';
    			if(isbn.charAt(9) != checksum) {
    				return false;
    			}
    		}
    		else {//13位的ISBN
    			if(!isbn.match(/^\d{12}/)) {
    				return false;
    			}
    			for(var i = 0; i < 12; i++) {
    				sum += isbn.charAt(i) * ((i % 2 === 0) ? 1 : 3);
    			}
    			var checksum = sum % 10;
    			if(isbn.charAt(12) != checksum) {
    				return false;
    			}		
    		}
    		return true;
    	},
    	display: function() {
    		...
    	}
    };
    

    checkIsbn保证ISBN是一个具有正确的位数和校验和的字符串。这样在创建对象的时候可以对ISBN的有效性进行检查,这可以确保display方法能正常工作。

    但问题又来了,即使在构造的时候能对ISBN进行检验,如果后续其他程序员把其他值赋给isbn,这时就检验不了了,

    theHobbit.isbn = '978-0261103283';
    theHobbit.display();
    

    为了保护内部数据,为每一个属性都提供了取值器和赋值器方法。

    • 取值器方法用于获取属性值,通常以getAttributeName这种形式命名;
    • 赋值器方法用于设置属性值,通常以setAttributeName这种形式命名。

    通过使用赋值器,你可以在把一个新值真正赋给属性之前进行各种检验。

    var Publication = new Interface('Publication', ['getIsbn', 'setIsbn', 'getTitle', 'setTitle', 'getAuthor', 'setAuthor', 'display']);
    
    var Book = function(isbn, title, author) {
    	this.setIsbn(isbn);
    	this.setTitle(title);
    	this.setAuthor(author);
    }
    
    Book.prototype = {
    	checkIsbn: function(isbn) {
    		...
    	},
    	getIsbn: function() {
    		return this.isbn;
    	},
    	setIsbn: function(isbn) {
    		if(!this.checkIsbn()) throw new Error('Book: Invalid ISBN.');
    		this.isbn = isbn;
    	},
    	getTitle: function() {
    		return this.title;
    	},
    	setTitle: function(title) {
    		this.title = title || 'No title specified.';
    	},
    	getAuthor: function() {
    		return this.author;
    	},
    	setAuthor: function(author) {
    		this.author = author || 'No author specified.';
    	},
    	display: function() {
    		...
    	}
    };
    

    这是使用门户大开型对象创建方式所能得到的最好结果。

    这里明确定义了接口、一些对数据具有保护作用的取值器和赋值器方法,以及一些有效性检验方法。

    这里还是有一个漏洞,虽然我们为设置属性提供了赋值器方法,但那些属性仍然是公开的,可以被直接设置的,而在这种方案中却无法阻止这种行为。

    不过这种方法易于使用,创建这样的对象不要求你深入理解作用域或调用链的概念。由于所有方法和属性都是公开的,派生子类和进行单元测试也很容易。唯一的弊端在于无法保护内部数据,而且取值器和赋值器也引入了额外的代码。

    3.2.2 用命名规范区别私用成员

    从本质上来说,这种模式与门户大开型对象创建模式如出一辙,只不过在一些方法和属性的名称前加了下划线以示其私用性而已。这种方法可以解决上一种方法带来的问题:无法阻止其他程序员无意中绕过的所有检验步骤。

    var Book = function(isbn, title, author) {
    	this.setIsbn(isbn);
    	this.setTitle(title);
    	this.setAuthor(author);
    }
    
    Book.prototype = {
    	checkIsbn: function(isbn) {
    		...
    	},
    	getIsbn: function() {
    		return this._isbn;
    	},
    	setIsbn: function(isbn) {
    		if(!this.checkIsbn()) throw new Error('Book: Invalid ISBN.');
    		this._isbn = isbn;
    	},
    	getTitle: function() {
    		return this._title;
    	},
    	setTitle: function(title) {
    		this._title = title || 'No title specified.';
    	},
    	getAuthor: function() {
    		return this._author;
    	},
    	setAuthor: function(author) {
    		this._author = author || 'No author specified.';
    	},
    	display: function() {
    		...
    	}
    };
    

    这种命名规范也可以应用于方法,例如checkIson方法应该是类私有的方法:

    	_checkIsbn: function(isbn) {
    		...
    	},
    

    下划线的这种用法是一个众所周知的命名规范,它表明一个属性或方法仅供对象内部使用,直接访问它或设置它可能会导致意想不到的后果。这有助于防止程序员对它的无意使用,却不能防止对它的有意使用。

    这并不是真正可以用来隐藏对象内部数据的解决方法,它主要适用于非敏感性的内部方法和属性。

    3.2.3 作用域、嵌套函数和闭包

    在讨论真正的私用性方法和属性的实现技术之前,我们先花点时间解释一下这种技术背后的原理。
    在JavaScript中,只有函数具有作用域。也就是说,在一个函数内部声明的变量在函数外部无法访问。私用属性就其本质而言就是希望在对象外部无法访问的变量,所以为实现这种拒访性而求助于作用域这个概念是合乎情理的。

    定义在一个函数中的变量在该函数的内嵌函数中是可以访问的:

    function foo() {
    	var a = 10;
    	function bar() {
    		a *= 2;
    	}
    	bar();
    	return a;
    }
    foo();//20
    

    一个简单的闭包例子:

    function foo() {
    	var a = 10;
    	function bar() {
    		a *= 2;
    		return a;
    	}
    	return bar;
    }
    var baz = foo();
    baz(); // 20
    baz(); // 40
    baz(); // 80
    

    可以看到,函数是在foo外部被调用,但它依然能够访问a,这是因为JavaScript中的作用域是词法性的。函数是运行在定义它们的作用域中,而不是运行在调用它们的作用域中。所以,bar被定义在foo的作用域中,就能访问foo中定义的变量,即使foo的执行已经结束。

    3.2.4 用闭包实现私用成员

    var Book = function (newIsbn, newTitle, newAuthor) {
    	// Private attributes.
    	var isbn, title, author;
    
    	// Private method.
    	function checkIsbn(isbn) {
    		...
    	}
    
    	// Privileged methods.
    	this.getIsbn = function () {
    		return isbn;
    	};
    	this.setIsbn = function (newIsbn) {
    		if(!checkIsbn(newIsbn)) throw new Error('Book: Invalid ISBN.');
    		isbn = newIsbn;
    	};
    
    	this.getTitle = function () {
    		return title;
    	};
    	this.setTitle = function (newTitle) {
    		title = newTitle || 'No title specified';
    	};
    
    	this.getAuthor = function () {
    		return author;
    	};
    	this.setAuthor = function (newAuthor) {
    		author = newAuthor || 'No author specified';
    	};
    
    	// Constructor code.
    	this.setIsbn(newIsbn);
    	this.setTitle(newTitle);
    	this.setAuthor(newAuthor);
    };
    
    // Public, non-privileged methods.
    Book.prototype = {
    	display: function() {
    		...
    	}
    }
    

    代码解读:

    • 使用var声明的变量或方法是私有的,因为没有用this关键字,这意味着它们只存在于Book构造器中
    • 要访问这些私有的变量和方法,需在Book中使用this关键字声明方法,这些方法被称为特权方法(privileged method),它们是公用的方法,因为声明在Book内部,所以在对象外部可以访问到私用属性和方法。
    • 任何不需要直接访问私用属性的方法都可以在Book.prototype中声明。
    • 每生成一个新的对象实例都将为每一个私用方法和特权方法生成一个新的副本。这会比其他做法更耗内存。
    • 不利于派生子类,因为所派生出的子类不能访问超类的任何私用属性或方法。相比之下,在大多数语言中,子类都能访问超类的所有私用属性和方法。故在JavaScript中用闭包实现私用成员导致的派生问题被称为“继承破坏封装”

    3.3 更多高级对象创建模式

    前面学习了创建对象的3种基本模式,下面再对一些高级一点的模式做一个简介。

    3.3.1 静态方法和属性

    静态成员是在类的层次上操作的,而不是在实例的层次上操作。每个静态成员都只有一份。
    下面是添加了静态属性和方法的Book类:

    var Book = (function() {
    	// Private static attributes.
    	var numOfBooks = 0;
    
    	// Private static method.
    	function checkIsbn(isbn) {
    		...
    	}
    
    	// Return the constructor.
    	return function (newIsbn, newTitle, newAuthor) {
    		// Private attributes.
    		var isbn, title, author;
    	
    		// Private method.
    		function checkIsbn(isbn) {
    			...
    		}
    	
    		// Privileged methods.
    		this.getIsbn = function () {
    			return isbn;
    		};
    		this.setIsbn = function (newIsbn) {
    			if(!checkIsbn(newIsbn)) throw new Error('Book: Invalid ISBN.');
    			isbn = newIsbn;
    		};
    	
    		this.getTitle = function () {
    			return title;
    		};
    		this.setTitle = function (newTitle) {
    			title = newTitle || 'No title specified';
    		};
    	
    		this.getAuthor = function () {
    			return author;
    		};
    		this.setAuthor = function (newAuthor) {
    			author = newAuthor || 'No author specified';
    		};
    	
    		// Constructor code.
    		numOfBooks++;
    		if(numOfBooks > 50) throw new Error('Book: Only 50 instances of Book can be created.');
    		this.setIsbn(newIsbn);
    		this.setTitle(newTitle);
    		this.setAuthor(newAuthor);	
    	}
    })();
    
    // 创建Public static method.
    Book.convertToTitleCase = function(inputString) {
    	...
    };
    
    // Public, non-privileged methods.
    Book.prototype = {
    	display: function() {
    		...
    	}
    }
    

    这里创建了一个闭包,将构造器从原来的普通函数变成了一个内嵌函数,并且作为返回值赋给变量Book。外层的函数只是用于创建一个可以用来存放静态私用成员的闭包,这些静态私用成员不会为Book的每一个实例都创建一个新的副本。
    如何判断一个私用方法是否应该被设计为静态方法?
    看它是否需要访问任何实例数据。如果它不需要,则设计为静态方法会更有效率,因为它只会被创建一份。

    3.3.2 常量

    常量是一些不能被修改的变量。在JavaScript中,可以通过创建只有取值器而没有赋值器的私有变量来模仿常量。

    var Class = (function() {
    	// Constants (created as private static attributes.).
    	var UPPER_BOUND	= 100;
    	// Constructor.
    	var ctor = function (constructorArgument) {
    		...
    	};
    	// Privileged static method.
    	ctor.getUPPER_BOUND = function() {
    		return UPPER_BOUND;
    	};
    	...
    	// Return the constructor
    	return ctor;
    })();
    

    如果需要使用许多常量,但你不想为每个常量都创建一个取值器方法,那么可以创建一个通用的取值器方法,如下:

    var Class = (function() {
    	// Constants (created as private static attributes.).
    	var constants ={
    		UPPER_BOUND: 100,
    		LOWER_BOUND: -100
    	};
    	// Constructor.
    	var ctor = function (constructorArgument) {
    		...
    	};
    	// Privileged static method.
    	ctor.getConstant = function(name) {
    		return constants[name];
    	};
    	...
    	// Return the constructor
    	return ctor;
    })();
    Class.getConstant('UPPER_BOUND');
    

    3.3.3 单体和对象工厂

    单体模式和工厂模式也使用闭包来创建受保护的变量空间,后面部分会详细讨论这两种模式。在此简单介绍一下:

    • 单体模式使用一个由外层函数返回的对象字面量来公开特权成员,而私用成员则被保护性地封装在外层函数的作用域中。它使用的技术是:外层函数在定义之后立即执行,其结果被赋给一个变量。本章的例子中外层函数返回的都是一个函数,而单体模式返回的则是一个对象字面量。
    • 对象工厂也可以使用闭包来创建具有私用成员的对象。其最简形式就是一个类构造。

    3.4 封装之利

    要是在创建对象时不用操心闭包和特权方法,事情就会简单得多。那么,不厌其烦的隐藏实现细节究竟有什么好处?
    封装保护了内部数据的完整性。通过将数据的访问途径设置为取值器和赋值器这两个方法,可以获得对取值和赋值的完全控制。这可以减少其他函数所需的错误检查代码的数量,并确保数据不会处于无效状态。
    封装提高了对象的可重用性,使其在必要的时候可以被替换。使用私用变量也有助于避免命名空间冲突。
    封装还使你可以大幅改动对象的内部细节,而不会影响到其他部分的代码。总的来说,代码的修改变得更轻松,如果对象的内部数据都是公开的话,你不可能完全清楚代码的修改会带来什么结果。

    3.5 封装之弊

    私用方法很难进行单元测试。因为他们及其内部变量都是私用的,在对象外部无法访问到它们。要么通过使用公用方法来提供访问途径(这样一来就葬送了使用私用方法所带来的大多数好处),要么设法在对象内部定义并执行所有测试单元。最好的解决办法是只对公用方法进行单元测试。这是一种广为接受的处理方式。
    使用封装意味着不得不与复杂的作用域链打交道,而这会使错误调试变得更加困难。有时候会很难区分来自不同作用域的大批同名变量。这个问题不是经过封装的对象所特有的,但实现私用方法和属性所需的闭包会让它变得更复杂。
    过度封装也是一个潜在的问题。
    最大的问题在于JavaScript中实现封装的困难。JavaScript本来就是一门与多数面向对象语言大相径庭的语言,而封装技术设计的调用链和定义后立即执行的匿名函数等概念更是加大了学习难度。此外,封装技术的应用还使不熟悉特定模式的人难以理解既有代码。注释和程序文档可以提供一些帮助,但并不能完全解决这个问题。

    3.6 小结

    本章讨论了信息隐藏的概念以及如何用封装这种手段来实现它。因为JavaScript没有对封装提供内置的支持,所以其实现必须依赖于一些其他技术。本书后面的多数章节都依赖于这些基本技术,因此你得好好品味一下本节的内容。只要理解了JavaScript中作用域的特点,你就能模仿出各种面向对象的技术。

    更多相关内容
  • 基于CSS类选择器重新定义的网页信息隐藏算法。
  • 多媒体信息隐藏_导论_黄继武,中山大学计算机学院
  • C++ 封装 & 信息隐藏

    千次阅读 多人点赞 2021-05-02 14:02:39
    C++ 封装 & 信息隐藏简介

    概述

    封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念. 这样能避免受到外界干扰和误用.
    在这里插入图片描述
    数据隐藏包括数据封装和数据抽象两部分. 数据封装是一种把数据和操作数据的函数捆绑在一起的机制. 数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制.
    在这里插入图片描述

    类的公用接口

    C++ 通过类来实现封装性, 把数据和与这些数据有关的操作封装在一个类中. 在声明了一个类以后, 用户主要是通过调用公用的成员函数来实现类提供的功能, 称为消息传递.

    公用成员函数是用户使用类的公用接口 (public interface), 或者说是类的对外接口. 在类外不能直接访问私有数据成员, 但可以通过调用公用成员函数来引用甚至修改私有数据成员.

    在这里插入图片描述

    类的私有实现

    用户不必关系这些功能实现的细节, 而只需要知道调用哪个函数会得到什么结果, 实现什么功能即可. 通过成员函数对数据成员进行操作称为类的实现. 实现的细节对用户是隐蔽的. (信息隐藏)

    类中被操作的数据是私有的, 实现的细节对用户是隐蔽的. 这称为私有实现. (private implementation)
    在这里插入图片描述
    类的公用接口与私有实现的分离形成了信息隐蔽. 将接口与实现分离是软件工程的一个最基本的原则.

    优点:

    1. 如果想扩充累的功能, 只需要修改本类中有关的数据成员和它有关的成员函数. 程序中类外的部分可以不必修改
    2. 如果在编译时发现类中的数据读写有错, 不必检查整个程序. 只需检查本类中访问这些数据的少数成员函数

    方法与消息

    方法 (method) 指类的成员函数在面向对象程序理论中被称为方法, 是指对数据的操作. 一个 “方法” 对应一种操作. 只有被声明为公用的方法才能被外界所激活.

    消息指对公用函数的调用. 外界是通过发 “消息” 来激活有关方法的. 调用对象的成员函数, 就是向对象发出的一个 “消息”. 通知它执行其中的方法.

    面向对象的特点:

    1. 封装性: 各个对象间相对独立
    2. 抽象性: 类是对象的抽象, 对象是类的实例
    3. 继承性: 解决重用问题
    4. 多态性: 由继承产生的相关的不同的类. 其对象对同一消息会做出不同的响应
    展开全文
  • 利用MATLAB实现WAV音频的LSB信息隐藏

    千次阅读 2020-12-10 23:35:36
    近年来,虽然数字音频信息隐藏技术的研究工作发展很快,出现了一些代表算法,但是与图像信息隐藏算法相比,数字音频信息隐藏技术面临着更大的挑战,因为人类听觉系统对随机噪声十分敏感,使得可以嵌入的数据量非常...

    0. 背景

    音频信息隐藏技术就是将秘密数据直接嵌入音频载体中,但不影响原载体的使用价值,也不容易被人的知觉系统觉察或注意到。

    音频信息隐藏技术作为信息隐藏技术的一个重要分支,受到越来越多的关注。

    近年来,虽然数字音频信息隐藏技术的研究工作发展很快,出现了一些代表算法,但是与图像信息隐藏算法相比,数字音频信息隐藏技术面临着更大的挑战,因为人类听觉系统对随机噪声十分敏感,使得可以嵌入的数据量非常有限。

    为了能够简明扼要地对音频信息隐藏技术进行说明,本文对WAV音频的LSB这种时域信息隐藏算法进行了研究。

    1. LSB算法原理简介

    LSB全称为:Least Significant Bit,即最不重要位。LSB方法是一种最简单的数据嵌入方法。任何秘密数据都可以看做是一串二进制位流,而音频文件的每一个采样数据也是用二进制数来表示的。这样,可以将每一个采样值的最不重要位(大多数情况下为最低位),用代表秘密数据的二进制位替换,以达到在音频信号中编码进秘密数据的目的。
    下图即为利用LSB算法进行信息隐藏的过程。

    在这里插入图片描述

    提取隐藏的信息时的过程图如下图所示。
    在这里插入图片描述
    由图可知,如果有人截获了含有隐藏信息的音频采样数据,并且此人知道这段音频里藏有信息,且他知道被替换位为最低位,那么这个人就破解了这个秘密数据了。
    因此对于LSB算法来说,密钥就是秘密数据的替换位的位置信息,如果想加大对秘密数据攻击的难度,可以用一段伪随机序列来控制嵌入秘密二进制位的位置。那么这段伪随机序列就可以作为密钥了。

    2. 信息隐藏代码实现(随机序列)

    下面,为了简化代码,易于读者理解,秘密数据采取的是一串随机生成的序列,并且采用的是二进制的最低位替换方法。

    clc;
    clear;
    fid = fopen('music_new.wav', 'r');
    oa = fread(fid, inf, 'uint8');
    fclose(fid);
    
    n = length(oa) - 44;
    d = randsrc(1, n, [1 0]);
    M = oa;
    for i = 45 : 45 + n - 1  
        M(i) = bitset(M(i), 1, d(i - 44));
    end
    
    fid = fopen('music_new_secret.wav', 'wb');
    fwrite(fid, M, 'uint8');
    fclose(fid);
    
    figure;
    [y1,Fs] = audioread('music_new.wav');
    x1 = (0:length(y1) - 1)/Fs;
    subplot(2, 1, 1);
    plot(x1, y1);
    axis([0 max(x1) -1 1]);
    xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
    
    [y2,Fs] = audioread('music_new_secret.wav');
    x2 = (0:length(y2)-1)/Fs;
    subplot(2, 1, 2);
    plot(x2, y2);
    axis([0 max(x2) -1 1]);
    xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
    
    
    figure;
    subplot(2, 1, 1); plot(x1, y1); axis([0 0.6 -0.05 0.05]);
    xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
    
    subplot(2, 1, 2); plot(x2, y2); axis([0 0.6 -0.05 0.05]);
    xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
    
    • 这里解释一下第7行代码,为什么要减去44,同时也是解释了第10行代码,为什么要从45开始。
      因为我们是在wav格式的音频文件中进行信息隐藏,而wav格式的音频文件中,从文件头到数据前面一共有44字节的文件格式说明,因此在进行信息隐藏时,要跳过这44位。

    • 再解释一下第8行代码。第8行代码采用了MATLAB的生成指定范围的随机数函数,生成的随机数是1行n列的行向量,这个行向量的内容只有0和1。即,随机生成的这个向量d就是用来模拟一段秘密数据。

    • 第7行到第12行代码就是LSB算法的实现。首先第7行定义秘密数据的长度(这里取了能加密的最长的长度)。第8行生成了秘密数据d。第9行将原始音频的采样数据oa赋值给M,利用M存储含有隐藏信息的音频采样数据。第10行到第12行的代码,利用bitset函数,将M从第45个元素开始的每一位的最低位用秘密数据d的对应位替换掉,完成秘密数据的隐藏。

    在给出程序运行图之前,需要说明的是,这个音频是一首歌曲的前奏,并且,我们给的秘密信息的长度遍布了整个时域。对于这个时长为29秒的音频,它最多能够存储的秘密信息长度是2557800bit,换算后为319725Byte,约等于312KB。
    在这里插入图片描述
    下图是程序运行后输出的图片,第一张图是原始音频时域波形图,第二张图是含有隐藏信息的音频时域波形图。

    在这里插入图片描述
    从上面的对比图中难以看出差异,我们将其放大,将横轴的显示范围更改为0-0.6秒。这样便能够明显地看出差异。
    在这里插入图片描述

    3. 提取隐藏信息代码实现(随机序列)

    fid = fopen('music_new_secret.wav', 'r');
    oa = fread(fid, inf, 'uint8');
    
    m = oa;
    n = length(oa) - 44;
    for i = 1 : n
        w(i) = bitget(m(44 + i), 1);
    end
    fclose(fid);
    
    rate = length(find(w ~= d)) / length(d);
    
    • 提取隐藏信息的实现部分是在程序的第4至第8行。第4行代码将含有隐藏信息的音频采样数据赋值给m。第5行代码定义了待提取的秘密数据的长度(这个长度要和秘密数据d的长度保持一致,如果不一致,最终将会得到有缺失的秘密数据或者是多余的乱码,至少这个长度不能大于音频采样数据的长度-44)。第6行至第8行利用bitget函数,将m从第45个元素开始的每一位的最低位提取出来,存储到w中,最终,w就是秘密数据。
    • 第11行代码计算了一下误码率,因为本程序在提取秘密数据前没有对含有隐藏信息的音频做任何处理,因此这里得到的误码率rate为0。

    4. 二值图像作为秘密数据

    从第2节和第3节中,应该已经知道了信息隐藏以及信息提取的原理了。
    接下来,我们把一副二值图像当做秘密数据来进行隐藏。

    4.1 图像信息隐藏的代码实现

    首先给出待隐藏的图片,如下图所示。
    在这里插入图片描述
    下面为图像信息隐藏的代码。

    clc;
    clear;
    fid = fopen('music_new.wav', 'rb');
    oa = fread(fid, inf, 'uint8');
    fclose(fid);
    
    n = length(oa) - 44;
    io = imread('school.bmp');
    [row col] = size(io);
    wi = io(:);
    if row * col > n
        error('音频载体太小,请更换载体');
    end
    info_hd_audio = oa;
    for k = 1 : row * col
        info_hd_audio(44 + k) = bitset(info_hd_audio(44 + k), 1, wi(k));
    end
    
    fid = fopen('music_new_secret.wav', 'wb');
    fwrite(fid, info_hd_audio, 'uint8');
    fclose(fid);
    
    figure;
    [y1, Fs] = audioread('music_new.wav');
    x1 = (0:length(y1) - 1) / Fs;
    subplot(2, 1, 1);
    plot(x1, y1);
    axis([0 max(x1) -1 1]);
    xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
    
    [y2, Fs] = audioread('music_new_secret.wav');
    x2 = (0:length(y2) - 1) / Fs;
    subplot(2, 1, 2);
    plot(x2, y2);
    axis([0 max(x2) -1 1]);
    xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
    
    
    figure;
    subplot(2, 1, 1); plot(x1, y1); axis([0 0.6 -0.05 0.05]);
    xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
    
    subplot(2, 1, 2); plot(x2, y2); axis([0 0.6 -0.05 0.05]);
    xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
    

    代码的第11行到第13行是用来判断音频载体的大小是否足够用来隐藏待隐藏的图片。原理是:将原始音频采样数据oa减去44(wav文件的格式说明)后赋值给n,n即为这个音频最多能隐藏的信息的大小(单位为bit),再将二值图像的总的像素个数(row * col)与n作比较,如果像素个数小于等于n,那么程序继续执行,否则,载体不足以隐藏这个二值图像。

    除此之外,此代码的核心原理与隐藏信息为随机序列的代码(第2节)一致,因此不做过多介绍。

    下图是程序运行后输出的图片,第一张图是原始音频时域波形图,第二张图是含有隐藏信息的音频时域波形图。

    在这里插入图片描述
    从上面的对比图中难以看出差异,我们将其放大,将横轴的显示范围更改为0-0.6秒。这样便能够明显地看出差异。
    在这里插入图片描述

    4.2 对含有图像的音频进行攻击(压缩)的代码实现

    clc;
    clear;
    [y,Fs] = audioread('music_new_secret.wav');
    x = (0:length(y) - 1) / Fs;
    y1 = y * 0.8;
    
    subplot(2, 1, 1);
    plot(x, y);
    axis([0 max(x) -1 1]);
    xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
    
    subplot(2, 1, 2);
    plot(x, y1);
    axis([0 max(x) -1 1]);
    xlabel('Time / (s)');ylabel('Amplitude');title('attacked audio');
    
    audiowrite('music_new_secret_attacked.wav', y1, Fs);
    

    对嵌入图像的音频进行压缩攻击测试。代码的第5行即是对音频的幅值进行压缩,压缩的倍数为0.8。

    下图是程序运行后输出的图片,第一张图是含有图像的音频时域波形图,第二张图是幅值压缩0.8倍后的含有图像的音频时域波形图。
    在这里插入图片描述

    4.3 提取隐藏图像的代码实现

    clc;
    clear;
    orig_pic = imread('school.bmp');
    
    
    fid = fopen('music_new_secret.wav', 'r');
    oa1 = fread(fid, inf, 'uint8');
    fclose(fid);
    n1 = 40000;
    for i = 1 : n1
        w1(i) = bitget(oa1(44 + i), 1);
    end
    w1 = w1';
    m1 = reshape(w1, 200, 200);
    figure;
    subplot(1, 2, 1);imshow(orig_pic);title('original picture');
    subplot(1, 2, 2);imshow(m1);title('not attacked extracted picture');
    imwrite(m1, 'school_extract.bmp', 'bmp');
    
    
    fid = fopen('music_new_secret_attacked.wav', 'r');
    oa2 = fread(fid, inf, 'uint8');
    fclose(fid)
    n2 = 40000;
    for i = 1 : n2
        w2(i) = bitget(oa2(44 + i), 1);
    end
    w2 = w2';
    m2 = reshape(w2, 200, 200);
    figure;
    subplot(1, 2, 1);imshow(orig_pic);title('original picture');
    subplot(1, 2, 2);imshow(m2);title('attacked extracted picture');
    imwrite(m2, 'school_extract_attacked.bmp', 'bmp');
    
    
    

    代码运行后输出两张图片,第一张图片是原图片由未被攻击的含有图像的音频中提取到的图片的对比图,如下图所示。
    在这里插入图片描述
    第二张图片是原图片由被攻击的含有图像的音频中提取到的图片的对比图,如下图所示。
    在这里插入图片描述
    由此可见,LSB算法的鲁棒性很差。

    4.4 更改载体音频重做一次实验

    上面做过的所有实验,采用的载体音频都是同一段音频,即一段长达29秒的歌曲前奏。

    接下来,我将载体音频改为本人录制的一段录音。录音的环境为空旷环境,内容为口播“一、二、三”。

    用到的所有代码与上面的代码都是一样的,仅仅是读取的音频文件不同。因此直接给出结果图。

    下图是图像信息隐藏的代码运行后输出的图片,第一张图是原始音频时域波形图,第二张图是含有隐藏信息的音频时域波形图。
    在这里插入图片描述
    从上面的对比图中难以看出差异,我们将其放大,将横轴的显示范围更改为0-0.6秒。这样便能够明显地看出差异。
    在这里插入图片描述
    下图是对含有图像的音频进行攻击(压缩)的代码运行后输出的图片,第一张图是含有图像的音频时域波形图,第二张图是幅值压缩0.8倍后的含有图像的音频时域波形图。
    在这里插入图片描述
    最后,提取隐藏图像的代码运行后输出两张图片,第一张图片是原图片由未被攻击的含有图像的音频中提取到的图片的对比图,如下图所示。
    在这里插入图片描述
    第二张图片是原图片由被攻击的含有图像的音频中提取到的图片的对比图,如下图所示。
    在这里插入图片描述
    由此可见,LSB算法的鲁棒性很差。

    5. LSB算法的特点

    LSB算法的特点是:

    • 本身简单易实现,音频信号里可编码的数据量大 。
    • 采用流加密方式分别对数据本身和嵌入过程进行加密,其安全性完全依赖于密钥,如果选择伪随机性能好的密钥产生机制,则可以做到“一次一密”。
    • 信息嵌入和提取算法简单,速度快。
    • 对信道干扰及数据操作的抵抗力很差,事实上,信道干扰、数据压缩、滤波、重采样、时域缩放等都会破坏编码信息。

    6. 其他音频信息隐藏算法

    • 回声隐藏算法
    • 相位隐藏算法
    • 傅氏变换域算法
    • 离散余弦变换域算法
    • 小波变换域算法
    展开全文
  • 对隐藏密钥的概念进行定义定义其为包括算法选择密钥K1、图像载体选择密钥...通过分析K1,K2的具体意义以及度量K3的计算复杂度,对基于图像信息隐藏系统的抗提取性进行了评价,对安全性领域的研究具有一定的指导意义。
  • 医疗供应链通信网络产生关键...另一方面,信息隐藏技术(Information Hiding Techniques, IHT)利用各种先进的方法来隐藏敏感信息,使其不被恶意节点披露。此外,在区块链的支持下,IHT可以带来更高的安全性和所需的隐

    摘要
    医疗供应链通信网络产生关键信息和数据。特别是在新冠肺炎时代,医疗服务提供者之间正在共享有关医疗供应链的内部个人和私人信息。近年来,由于医疗供应链通信网络缺乏安全措施,多次发生网络攻击事件。由于计算能力和各种恶意使用的算法,网络攻击变得更便宜、更容易,在这个时代,安全性和数据隐私要求更严格、更高的措施。另一方面,信息隐藏技术(Information Hiding Techniques, IHT)利用各种先进的方法来隐藏敏感信息,使其不被恶意节点披露。此外,在区块链的支持下,IHT可以带来更高的安全性和所需的隐私级别。本文提出了利用信息隐藏技术实现区块链和智能合约,以增强智能医疗供应链通信网络等关键系统中数据通信的安全性和私密性。结果表明了该框架使用超级账本的智能合约的可行性和所期望的安全级别。
    刊载期刊综合评价期刊等级
    MDPI-SensorsQ1SCIE

    导论

    关键物联网解决了对时间和数据至关重要的系统,这些系统要求更高的安全级别,并处理高度机密的信息。智能医疗供应链通信网络生成各种私人医疗数据,包括关于患者及其病史的个人信息,这使其成为关键的物联网系统的一部分。此外,医疗保健提供者彼此之间交流有关其供应的敏感信息,特别是在COVID - 19时代,医院有义务共享其储备的医疗用品,并遵循疫苗的供应链信息。在电子健康记录(EHR)系统之后,根据健康信息交换法案(HIE),鼓励医疗保健提供者彼此分享他们的大部分病人信息,以帮助改善医院提供的服务。患者健康信息(PHI)和供应链信息面临数据泄露和被盗的高风险。网络罪犯可以很容易地将目标锁定在通信渠道或包含数百万患者个性化数据和历史记录的数据库上。2014年,社区卫生系统(CHS)成为“心脏出血”攻击的目标,使450多万患者的数据和信息暴露损失惨重。医疗保健数据大多存储在本地数据库或基于云的数据库中,在这两种情况下,它们都需要针对任何可能的攻击提供更高的保护。不过,医院和医疗保健提供商在技术支持和安全选项上的投资似乎要少得多。更不用说移动医疗系统的快速发展,患者可以通过平板电脑或智能手机直接访问自己的数据,2015年中国移动医疗市场规模达到29亿元的峰值,这表明对移动医疗的高度依赖,以及将其部署到患者访问EHR等关键数据的情况。此外,患者自己也可以通过不受保护的通道和不加密的方式来泄露他们的数据。
    包括医疗保健提供商在内的关键物联网系统必须在保持所需数据通信速度的同时提高其安全性,为了实现这一目标,多种技术已经研究了各种增强数据安全性和隐私性的技术,包括区块链、密集加密方法等。其中最有前途的方法是信息隐藏技术(IHT)。信息隐藏技术是将数据插入到另一个数据中,以迷惑窃听者和网络攻击者。大多数信息隐藏技术的应用都用于版权保护、在不安全的通信通道上保护数据以及数据操作检测。
    在本文中,我们部署了一种改进的隐写方法,包括以另一种形式的数据(如文本或图像)隐藏所需的信息。我们实现区块链,以及创建一个预先经过身份验证和诚实的医疗保健提供商集群,以在限制窃听者风险的同时安全地彼此通信。智能合约也被用来自动生成一个只有区块链集群的参与者才能知道的一次性密钥,以增强通信的私密性。在我们提议的框架中,需要通信的消息或数据应该用其他辅助文本消息加密,这些消息以消息块的形式对发送方和接收方都是无用的。

    本文的主要贡献可以总结如下:

    • 我们部署了一种改进版的隐写术技术,将需要通信的信息和信息加密成另一个辅助信息,以增强通信的医疗供应链信息的隐私性和安全性,防范任何可能的网络攻击。
    • 我们部署区块链技术来创建一个安全的、私有的预认证医疗保健提供商集群。只有包含在集群中的节点才能参与通信,查看接收到的消息,并解密所需的块,而忽略辅助块
    • 最后,在我们提出的框架中实现智能合约,自动生成一次性密钥,并在相关方之间安全地分发密钥。密匙随着每次新的通信初始化而改变,消除了网络攻击者拥有密匙解密信息的风险,从而增强了智能医疗等关键系统的安全性和私密性。

    本文的其余部分组织如下: 第二部分详细介绍了区块链、IIoT系统、信息隐藏技术等已部署技术的背景研究。在第3节中,我们提出了基于区块链的IHT框架,并使用一种方法来解释我们的概念。而第4节以广泛的系统分析和结果支持我们提出的框架。最后,我们在第5节总结了这项工作。

    相关研究动向

    网络的最新发展和计算算法的快速速度使得恶意节点更容易使用勒索软件和其他网络攻击攻击工业物联网系统,从而瘫痪工业物联网网络和智能保理。在本节中,我们首先讨论了本文的关键技术,包括区块链技术、IIoT系统和信息隐藏技术。

    背景

    为了为关键的物联网提供安全的数据通信,可以使用几种技术和解决方案,我们在相关的工作部分讨论了一些可能的解决方案。然而,在本文中,我们提出了将区块链与物联网安全系统融合,在经典信道上实现多层私有安全通信。为此,在本节中,我们将定义已部署的技术

    区块链

    区块链是一种去中心化技术,它使用公钥加密来提供身份认证,并记录P2P网络中每个身份的每一笔交易,一旦交易完成,就不可撤销。网络中的每个节点记录其所在的分布式网络的所有交易信息,并按时间顺序打包成块。每个新区块都被打上时间戳,并按照严格的时间顺序进行,区块连接在一个不可逆的链中。区块链中的每个块都包含了前一个块的哈希值,如果网络攻击者想要篡改区块链中的信息,则需要篡改该块之后的所有新块。区块链采用单向哈希算法,可以很容易地跟踪区块链中的任何黑客和篡改数据信息的企图。区块链系统中的节点处于分散、分布式的P2P网络中,广播消息到达节点的时间不同。攻击者可以利用这一延迟在更快的单播通信中向邻近节点传递假消息,区块链系统提供了一种共识机制来避免这一问题。我们希望共识机制能够为分布式网络中的所有节点提供足够的可信性。网络中的每个节点都可以向其他节点发布信息。当网络中其他节点收到一个通过共识机制认证的节点发出的广播时,我们认为该消息是可信的、未伪造的信息,并将该信息打包成一个新的块,添加到当前的区块链链中。分散系统中的共识节点是自利的,其利益最大化是它们参与数据验证或记账的根本目标。区块链系统对完成共识机制的节点进行奖励,确保网络中的每个节点都愿意参与共识机制下的数据验证。公共区块链是一个最普遍的区块链,网络中的任何节点都可以访问并参与到共识机制中。在公共的区块链中,只要节点完成了共识机制的算法要求,就可以将其记录的数据添加到区块链中,获得相应的经济奖励。基于公共区块链的网络可以被看作是完全去中心化的,因此在网络中有更多的邪恶节点。公共区块链通过加密经济学确保数据的可靠性和安全性,通常使用加密验证结合共识机制(如工作证明或所有权证明)来确保可信访问。

    关键物联网系统

    物联网面临着一些挑战,如无法证明自身清白的集中管理结构;随着物联网设备的几何增长,未来的集中式结构无法承受如此庞大的数据连接。此外,物联网在很大程度上是运营商和企业内部的自组织网络。当涉及到多个运营商和同行之间的合作时,建立信用的成本很高。区块链多中心、弱集中的特点将降低集中式架构的高运行成本、信息加密、安全通信的特点将有助于保护隐私和身份权限管理和多边共识有助于识别非法节点并及时防止恶意节点访问,依靠链式结构将有助于建立一个卡可以追溯到丝毫电子证据的存在,分布式架构和点对点特性有助于打破物联网中存在的多个信息孤岛的束缚,促进信息的横向流动和多方协作。
    物联网系统(IoT System)是一种全球性的分布式网络系统,是指设备之间通过Internet进行连接和通信的网络技术。拥有物联网技术的设备有时会通过传感器收集数据,并与其他设备共享,以创造有价值的数据和结果。可以满足的代表性物联网技术有智能家居、健康监测和室内定位。工业物联网是物联网的一个子类,指的是在工业领域使用的物联网技术。该技术应用范围广,如工厂、电厂等,用于智能物流、远程维护、智能工厂等。由于是在工业现场使用,整体规模较大,所以存在传感器规模,其移动性较弱。
    工业物联网使用物联网的基本技术。在工业物联网中,有线/无线设备被大规模连接和使用,这包括传感器和移动通信或Wi-Fi网络。每个设备通过传感器与用户通信,然后通过网络将此通信信息传输到云。数据存储在用户附近的地方称为边,因为数据通过这个地方在网络上共享,所以称为边网络和边计算。云/边缘计算的简化结构是一张图片。与云计算需要从网络到云的数据相比,数据存储和提供在中间的边缘,可以更快地响应用户。

    信息隐藏技术(IHT)

    先进的安全方法和解决方案,如密码学和数据隐藏,以保护关键信息免受网络威胁。密码学的密钥用法是将纯文本转换成没有密钥就无法理解或破译的密文。
    另一方面,信息隐藏技术将关键信息和数据隐藏在另一种形式的数据中,如文本或图像,确保文档不受水印的影响。信息隐藏技术和密码技术都可以用来保护信息。然而,它们并不十分相似。信息隐藏主要有两大类,最著名的是隐写术和水印。隐写术用于以其他数据的不同形式隐藏数据,例如媒体或文本。而水印则被定义为数据隐藏的过程。

    物联网和医疗供应链安全的现有解决方案

    微型、低成本传感器和高带宽无线网络的出现,意味着现在即使是最小的设备也可以通过一定程度的数字智能连接起来。他们被监视和跟踪,他们的状态数据被共享,他们与其他设备通信。然后可以收集和分析所有这些数据,以提高业务流程的效率。工业物联网不应与消费者物联网相混淆,但消费者物联网的核心概念与工业物联网相同,利用传感器和自动化来提高效率。如果将物联网在工业行业中的应用抽象起来,可以归纳为四个层次:数据采集与显示、基础数据分析与管理、深度数据分析与应用、工业控制。表1总结了定量研究的要点。
    在这里插入图片描述
    在这里插入图片描述
    Sengupta等人[14]根据物联网的四个层次,梳理出了安全威胁和相应的解决方案,以及工业物联网中针对不同目标的各种网络攻击和基于区块链的解决方案。工业物联网的安全目标可以大致分为基础设施安全、认证与信任协议、认证方式、安全的数据管理系统、传统的攻击防范策略。
    工业物联网更加注重企业之间有限而具体的信息的收集与共享。在传统的供应链中,新订单通过传真或快递邮件发送给供应商。与工业物联网相结合,供应链可以部署为资源交互的免提网络,其中供应链中的每个传感器都是自动化的,为供应链中涉及产品生产和分销的一系列流程提供自动化。
    Wen et al.[15]提出,为了保证传感器采集数据时数据不泄露,将通过智能合约在网络中实时存储IIoT设备的监控和记录,将IIoT设备升级到区块链。
    Iqbal等人提出了工业物联网和区块链如何在工业过程中协同工作,以实时解决安全问题。它还设计了IIoT和区块链的安全需求,并描述了如何将IIoT集成到区块链中用于智能工业应用。DEMATEL方法被用于计算工业物联网在行业中面临的经济挑战,并通过区块链因素来解决基础设施设计和部署的成本。
    Zhao et al.[17]将区块链节点分为full node (FN)和light node (LN)。FN可以下载和检查所有的块和事务,并可以作为挖掘节点为区块链创建块。由于资源的限制,LN可以在区块链上存储和处理部分数据。在工业物联网中,LN参与节点之间传播的新交易,并可以被添加到区块链的一个块中。该框架在很大程度上结合了工业物联网的可伸缩性需求和海量数据处理的运行模型。
    Yu等人的[18]研究表明,为了满足智能工厂数据的安全存储、访问控制、信息更新和删除以及恶意用户跟踪和注销的需求,作者设计了基于区块链的工业互联网数据共享机制。通过使用区块链支持身份认证和可追溯性,增强了智能工厂数据在云中的安全存储和共享。该机制具有密钥量小、运行效率高、能抵抗合谋密钥攻击等优点。
    Wu等人[19]提出利用区块链结合边缘计算解决现有工业物联网的可扩展性和数据安全问题。边缘计算为区块链提供了新的节点部署选项。区块链部署在边缘计算节点上,便于数据对接,传输路径可控,缓解带宽压力,提高实时传输,整合运营商开发能力,提升IIoT整体运营效率。此外,区块链可以促进不同边缘节点之间的协调与同步,帮助建立边缘计算系统和防伪存储支撑资源的完整性保障,促进终端、数据、能力的开放共享,为垂直行业提供可信服务。
    Liu等人提出了基于区块链的工业物联网系统的性能优化框架,以优化可伸缩性/吞吐量,同时考虑系统去中心化、安全性和延迟。为了应对工业物联网系统的动态性和复杂性特点,采用DRL进行深度强化学习,有效地处理海量数据。该框架可在确保工业物联网安全的同时提高运营效率。根据所提出的区块链系统性能定量测量系统,对每个区块生产者和共识算法进行评估,并通过DRL技术调整区块大小和区块间隔,使区块链系统的链上交易吞吐量最大化。
    Guan等[21]将能源交易模型分为两层,即BC-ETS,这是一个基于区块链的能源交易解决方案,在保护隐私的同时兼顾电力供需。此外,为了适应能源互联网中底层物联网设备相对较弱的计算能力,提出了基于诚信的公平的证明机制设计大大提高了系统的可用性。BC-ETS不仅满足安全要求,还为能源交易解决方案提供高性能。
    Ghadge等人[24]定义了传统的供应链风险,总结了组织如何在供应链中管理网络风险。从网络风险类型;网络传播风险;网络风险渗透点;网络安全挑战和缓解措施,使用基于连接的聚类来识别和验证指导并告知分析。数据挖掘技术被用来为全面的、可复制的和透明的审查建立模型。基于数据挖掘的互补聚类分析为供应链网络风险的第一个SLR的实施提供了透明度和严密性。
    Helo和Hao[25]开发了一个基于区块链的物流监控系统(BLMS)的原型。在这个BLMS中,通过区块链解决方案收集和共享逻辑数据。该系统的功能使客户和物流运营商与所有其他合作伙伴能够在整个生态系统中跟踪和跟踪他们的数据,并从系统中获取他们自己的数据信息。强调了区块链应用在供应链系统中的高可用性和安全性。
    Bhaskar et al.[26]指出,当前的COVID-19大流行暴露了各机构的供应链和应对能力。全球医疗供应链系统需要大规模、开放和创新的方法,在紧急情况和长期需求中缓冲系统,并确保基本卫生保健供应的连续性和卫生保健系统的弹性。可以使用区块链等技术作为驱动因素,进一步提高运营效率。
    Musamih et al.[27]研究了药品供应链中药品追溯的挑战,并强调了其重要性,特别是对防伪药品而言。他们在基于区块链的平台药物供应链上开发并评估了一种以去中心化方式跟踪和跟踪药物的解决方案。他们提出的解决方案利用区块链技术的加密基础,实现供应链和以太坊区块链智能合约事件的防篡改记录,从而实现所有参与利益相关者可访问的事件的自动记录。主要目标是交易数据的完整性、可用性和不可否认性,这在复杂的多方环境(如药品供应链)中至关重要。
    Carmody等人的[28]解决了在医疗保健技术的各个软件组件中被利用的漏洞。在医疗保健技术中包含第三方软件组件的风险可以部分地通过使用软件材料清单(software Bill of Materials, SBOM)来管理。SBOM提供了一种透明的机制来确保软件产品供应链的安全,可以更快地识别和修复漏洞,从而达到减少攻击可行性的目的。SBOM有潜力使医疗技术的所有供应链利益相关者受益,而不会显著增加软件生产成本。
    Garcia-Villarreal等人[29]调查了现有的供应链管理文献,并对关键成功因素(CSF)的工作和医疗技术的部门重点进行了分类。分为(1)销售和运营计划,(2)产品开发过程,(3)质量和合规,(4)采购策略,(5)客户关系管理,(6)生产系统。本研究的结果表明,这些CSF的组合可使原始设备制造商在医疗技术领域的表现更好。强调供应链管理成功的突出因素,这些因素在以往的研究中尚未得到充分认识,特别是:质量和合规、产品开发过程和生产系统。供应链改进不是要实施孤立的项目,而是要谨慎地选择适当和有针对性的措施,以更有效地分配资源
    Pandey et al.[30]指出,网络物理系统(CPS)漏洞对网络安全的影响主要集中在CPS漏洞上。基于信息流向上和向下的供应链,作者试图确定全球供应链中的网络安全风险。从战略角度对这些网络安全风险进行了进一步的分类。提出了全球供应链网络安全风险和网络攻击的概念模型。这些风险可以通过实证研究进一步验证和放大。从管理的角度来看,该框架可以作为一个决策过程,同时考虑全球化供应链所有阶段的不同网络安全风险。

    提出的基于区块链的IHT关键物联网安全框架

    本文的主要贡献包括物联网设备层和云层之间数据通信的绝对安全。在这种情况下,我们认为医疗物联网设备是一个关键环境。医疗物联网保存敏感数据,包括患者个人信息,如姓名、病史等。此外,该数据还保存了医院和实验室的研究信息和数据,如药物发现数据。这些数据需要在云层中计算和处理。因此,医疗物联网层与云层之间的通信需要高度安全。

    概述

    如图1所示,他提出基于区块链的IHT框架可以分为四个主要层:(1)医疗物联网设备层,(2)边缘层,(3)雾层,(4)云层。在本节中,我们将详细讨论每一层的角色。
    在这里插入图片描述
    医疗物联网设备层:医疗物联网设备层产生各种异构信息,具有较高的安全性。对于本案例研究,我们选择保护的数据类型是医院和实验室研究数据,例如药物发现数据和患者信息。医院是一般医院,医学实验室专门在云服务器上处理大量数据,以找到他们想要的结果,例如,药物发现实验室可能会使用患者的个人病史和信息来进行实验。这些信息通常通过经典通道和基本加密方法从实验室传输到云服务器。在边缘层,我们实现了一个私有的区块链分类帐,用于身份验证和安全的集群选择。Base station扮演着区块链管理器的角色,它必须验证身份、认证用户,并将诚实用户注册到分类帐中,以实现未来更快的身份验证机制。设备用户和其各自的云服务器也必须注册到区块链,他们同意一个唯一的哈希密钥,哈希密钥将存储到区块链进一步加密。我们将在下一节中详细讨论这个阶段。雾层在设备用户和云服务器之间产生智能合约。智能合约部署前面讨论的哈希密钥,以加密信息。此外,秘密信息和辅助比特也被加密,以在网络攻击时迷惑攻击者,从而使攻击者无法区分真实信息和辅助编码信息。在云层中有几个分布式云服务器。它们的作用是在使用之前商定的散列密钥解密后处理接收到的信息。哈希键随着每一轮通信而改变,使其成为一次性哈希,从而增强了数据的安全性和私密性。

    拟议系统的方法

    在我们提出的框架中,我们考虑了一个新的节点(医院、实验室)请求加入基于区块链的系统,并与其他节点共享和接收信息的场景。在这个场景中,我们将案例研究分为三个主要阶段。
    第一个是选择一个安全集群,只有经过预先认证和验证的医疗保健提供商节点才能加入安全网络,共享信息并相互通信,这一阶段是使用区块链私有账本和PBFT算法实现的,该算法使用之前认证的和诚实的节点来验证和验证新的节点。第二阶段是密钥哈希和注册阶段,在此阶段中,前一阶段的所有预认证节点都必须就一个密钥达成一致,以便在通信期间使用该密钥、对其进行哈希并在彼此之间安全地传播该密钥。请注意,每次通信会话初始化时,密钥都会发生变化,这提供了类似于一次性传递算法的更高安全级别。最后一个阶段是智能合约阶段,预先约定的密钥哈希被存储在智能合约中,并在每次新的通信会话中自动执行,智能合约还负责在每次消息中自动修改密钥,使在经典通道上执行密钥哈希和通信加密更加容易和高度安全。为了解释上述步骤,我们考虑一个新的节点,例如一家医院,请求加入基于区块链的安全系统。首先,医院初始化PBFT算法,如果网络达到联盟状态,医院将加入基于区块链的安全网络,否则,初始化中止。在第一阶段完成后,新加入节点中的用户设备必须创建一个安全密钥来加密与其他节点通信的数据。必须计算生成的初始密钥,输出是一个将在智能合约中注册的安全哈希密钥。为了提高数据的安全性,所传递的信息包括原始信息、辅助信息和在网络攻击时迷惑窃听者的秘密信息。消息被分成多个段,并使用智能合约中注册的一次性哈希密钥进行加密,然后通过区块链网络发送。
    在这里插入图片描述

    这些阶段的细节可以在下面的小节中描述。图2描述了提议框架的所有主要阶段的方法,包括集群注册、哈希键计算和基于智能合约的一次性哈希(One-Time hash, OTH)。该方法的细节在算法1、2和3中进行了解释,并分别进行了讨论。

    集群预选阶段

    经过验证和认证的医疗保健提供商可以发送请求并加入基于区块链的通信系统。区块链作为一种分布式的、安全的、有密码保证的分布式账本技术,无论是非证伪的还是修改的分布式账本技术,都不能作为节点验证和认证的手段。对于本研究,我们部署区块链来验证医疗保健提供商,并创建一个安全的通信网络通道;部署的联合算法是拜占庭容错(BFT)的一个增强版本。部署一个私有区块链,其中检查和验证请求的节点被认为是政府的主要医疗中心。算法1和算法2描述了所需的步骤。
    在这里插入图片描述
    诚实客户的选择可以解释为:当医疗保健提供商想要从安全通信中获益时,它必须首先向验证中心(Validation Center, VC)发送请求。在这个算法中,VC可以是管理其他客户的政府医疗机构;在该算法中,CA被指定为根的角色。
    在这里插入图片描述
    风险投资检查医疗保健提供者的身份;如果它是真实的,VC就充当头HC0的角色,并开始通信请求。必须提到的传感器节点被认为是诚实的,不容易受到网络攻击,因此只有真正的数据交流,作为这项工作,未来的范围的情况下传感器容易受到各种攻击和传达消息欺骗应当考虑和研究。收到来自HC0的请求的节点继续转发它,并计算其内存中的消息数量。
    当消息数超过f + 1轮后,通信提交状态,标记结果发送给HC0。函数Stamp用于最后的验证。通信继续,直到达到2f + 1轮。使用Stamp函数,可以比较HC0和HCk的结果。如果结果一致,则将医疗保健提供者添加到区块链网络,如果不一致,则省略请求。
    遵循算法1和算法2,我们确保只有诚实的客户端才能成为系统的一部分,从而为智能医疗通信提供所需的保护。因此,只有诚实且经过验证的客户才能使用该系统。

    哈希密钥注册阶段

    在开始通信阶段之前,设备用户和其各自的云服务器必须在通信开始时使用一个共享哈希密钥来加密数据,为此,算法3描述了哈希密钥注册的阶段。
    将哈希密钥注册到区块链后,将在通信阶段使用它对消息进行加密。每次初始化通信时,由于Nr(轮数)的变化,哈希密钥也会发生变化,从而创建一个新的安全哈希密钥,仅由物联网设备及其各自的云层共享。
    在这里,我们部署了一个智能合约来执行哈希加密和加密消息。物联网设备或医疗保健提供商发送的数据可以表示为如下所示
    M e s s a g e = O r i g i n a l M e s s a g e + A u x i l a r y M e s s a g e + S e c r e t M e s s a g e Message = Original Message + Auxilary Message + Secret Message Message=OriginalMessage+AuxilaryMessage+SecretMessage
    原始信息生成数据,由云服务器进行计算和处理,辅助信息是一串比特信息,以噪声形式发送,以便在网络攻击成功时迷惑窃听者。辅助字符串和秘密消息不能被云服务器解密,而且使用设备的私钥进行加密,因此云服务器可以忽略它们。但是,如果攻击者成功访问了系统并查看了消息,那么它将作为辅助工具而被混淆消息是没有意义的。智能合约将使用在前一阶段商定的哈希密钥执行加密阶段。
    在这里插入图片描述

    分析与讨论

    为了评估第一步(基于区块链的集群选择),我们使用了Network Simulator-3 (ns-3),它依靠c++实现智慧城市网络模型,使用Python实现网络拓扑。部署IBM Hyperledger来实现区块链和智能合约。模拟是在一台运行在Ubuntu Linux下、拥有16gb内存的intel core-i7计算机上进行的。

    分析

    为了证明我们提出的基于区块链的体系结构的有效性,我们考虑了三个主要的网络性能指标;与经典算法相比,PBFT算法可以提高故障对等体的延迟、网络执行的一般延迟以及网络吞吐量。与传统的PBFT算法相比,区块链算法的执行效果更好。
    在这里插入图片描述

    如图3所示,在四个故障对等点的情况下,我们使用GO-Ethereum在NS-3上运行模拟,为数据生成私有通信网络。实验结果证明了该体系结构采用区块链技术的可行性。与传统的BFT算法相比,提出的解决方案记录了低延迟和高吞吐量。
    此外,在以太坊上实现智能合约的最大延迟为60秒,这对于智能医疗通信等关键系统来说并不理想。智能医疗通信需要发送方和接收方之间快速高效的数据传输,因为如果出现更多的延迟,可能会危及患者的生命。为此,我们实现了在IBM Hyperledger结构上自动生成新哈希键的智能合约。
    Hyperledger Fabric是一个基于Linux基金会开发企业级应用程序的开源项目。智能合约允许OTH自动生成。
    哈希值在每轮通信后根据轮数变化,从而保证更高的安全级别,并限制窃听者或网络攻击者找到相应哈希值的机会。在这种情况下,生成的哈希键场景只有基于区块链的集群中的参与者才知道。原始消息是唯一使用生成的智能合约哈希加密的段,而辅助段是使用发送方选择的方法加密的,以迷惑攻击者。一旦段被接收到,接收方将对其应用智能合约OTH,使用OTH解密密钥成功解密的段即为包含原始消息的段,其余的段均被忽略。基于我们的模拟,图4描述了使用以太坊和Hyperledger fabric的执行时间结果,并显示基于Hyperledger fabric的智能合约对于关键系统(如智能医疗)更快、更可行。
    在这里插入图片描述
    此外,该框架的实施保证了医疗供应链系统五个基本方面的实现,其中包括一致性,即医疗供应链系统由于不同组件和参与者之间的快速和安全的数据通信而保持一致和实时更新。安全是拟议框架的另一个主要关键要求,通信数据应受到保护,并确保不受任何可能的网络攻击。该解决方案通过使用区块链和基于哈希的一次性智能合约来确保信息的安全性。第三个方面是可用性,系统必须能够随时进行数据通信和信息检索。这可以通过使用分散的区块链网络实现,在该网络中,信息容易出现单点故障。另一方面,完整性也是要考虑的另一个参数。系统的完整性是通过使用一次性的基于散列的智能合约来保证的,其中加密密钥会随着每一轮通信而自动更改。最后,该框架保持了医疗供应链数据和信息的透明度,可以跟踪和注册到区块链网络,并在所有参与节点之间共享。

    讨论&开放性研究

    提出的框架部署了一种信息隐藏技术,该技术使用辅助消息在关键环境(如智能医疗系统)中隐藏原始消息。该消息被分成多个段,并使用智能合约生成的一次性哈希进行加密。此外,为了增强系统的安全性和私密性,我们使用了一个基于区块链的私有集群。集群的作用是选择诚实的医疗保健提供商,使用BFT算法的改进版本对其进行验证和身份验证。一个集群中的医疗保健提供者能够彼此之间通信患者信息和数据,控制通信的集群头被认为是一个政府中心。医疗保健提供商然后生成初始密钥并将其注册到区块链中。使用初始密钥,智能合约可以在每个通信阶段计算一个新的哈希密钥并自动执行它。发送方创建一个包含原始消息和附加辅助消息的段列表,只有原始消息段使用预先商定的OTH加密,而其他段使用发送方选择的方法加密。消息通过区块链发送给接收方,接收方依次将OTH解密密钥应用到接收的段中。含有原始报文的段将被相应解密,而辅助报文将被忽略。这种方法不仅可以应用于通信阶段,还可以在本地或基于云的数据库中存储数据。将原始数据隐藏在无用的文本或图像中是非常安全的,因为不同的片段被加密,攻击者在没有正确的密钥的情况下需要更长的时间来破译。
    其他现有的先进技术可以与该框架合并,以增强医疗供应链的安全性和隐私性。Niu等人[38]讨论了针对长时间观察攻击的位置隐私保护方法。他们提出的名为Eclipse的框架在位置隐私和系统的可用性和可用性之间建立了平衡。虽然他们的论文中没有提到,但提出的解决方案可以有效地在医疗供应链服务中实施,提高安全性和隐私水平。另一方面,与大多数相关工作不同的是,Jin et al.[39]提出了一种新颖的移动众感系统框架,可以自动选择提供可靠数据的工人。在我们提出的框架中,这种方法也可以用于诚实节点的选择阶段。最后,Jia等人使用区块链实现了一个名为PROCESS的在线隐私保护链上证书状态。该方法可以与我们的框架相结合,对验证中心的证书进行验证,从而提高了系统的安全性。
    这项工作的局限性在于加密和解密阶段;这两个阶段没有详细讨论,因为我们在论文中提出了一个总体概述。作为未来的工作,我们打算详细描述加密和解密阶段并在多个和各种系统中测试所提议的框架,如智能工厂和智能家庭。关键系统需要更高更严格的安全措施,通过该解决方案,我们可以提高智能系统和基于云的数据库的安全性和私密性。

    总结

    信息隐藏技术(Information Hiding Techniques, IHT)产生了多种先进的方法,通过多种技术来隐藏敏感信息,使其不被恶意节点披露。IHT对于保护通信信息、数据文件甚至公司之间电子合同的隐私和真实性非常有用。此外,在区块链的支持下,基于区块链的IHT可以为关键网络需求带来更高的安全性和隐私级别。区块链是一个去中心化的分布式账本,承诺不篡改区块。为了提高智能医疗等关键系统中数据通信的安全性和私密性,本文提出了基于区块链和智能合约的信息隐藏技术的实现。部署区块链是为了创建一个由诚实的医疗保健提供商组成的安全私有集群进行通信,而智能合约用于自动生成用于加密目的的OTH。在信息隐藏技术方面,我们使用包含原始信息的段隐藏在辅助信息中;只有原始消息使用OTH加密,而辅助消息使用发送方选择的各种加密技术加密,可以被接收方忽略。与传统的技术相比,我们的方案证明了更低的执行时间,并承诺更高的安全措施。作为未来的工作,我们将结合其他关键系统的真实场景详细描述OTH的加解密技术。

    参考文献(本文出现的部分)

    1. Sengupta, J.; Ruj, S.; Das Bit, S. A Comprehensive Survey on Attacks, Security Issues and Blockchain Solutions for IoT and IIoT. J. Netw. Comput. Appl. 2020, 149, 102481. [CrossRef]
    2. Wen, Q.; Gao, Y.; Chen, Z.; Wu, D. A Blockchain-based Data Sharing Scheme in The Supply Chain by IIoT. In Proceedings of the 2019 IEEE International Conference on Industrial Cyber Physical Systems (ICPS), Taipei, Taiwan, 6–9 May 2019; IEEE: Piscataway, NJ, USA, 2019; pp. 695–700.
    3. Iqbal, A.; Amir, M.; Kumar, V.; Alam, A.; Umair, M. Integration of next generation IIoT with Blockchain for the development of smart industries. Emerg. Sci. J. 2020, 4, 1–17. [CrossRef]
    4. Zhao, S.; Li, S.; Yao, Y. Blockchain Enabled Industrial Internet of Things Technology. IEEE Trans. Comput. Soc. Syst. 2019, 6, 1442–1453. [CrossRef]
    5. Yu, K.-P.; Tan, L.; Aloqaily, M.; Yang, H.; Jararweh, Y. Blockchain-Enhanced Data Sharing With Traceable and Direct Revocation in IIoT. IEEE Trans. Ind. Inform. 2021, 17, 7669–7678. [CrossRef]
    6. Wu, Y.; Dai, H.-N.; Wang, H. Convergence of Blockchain and Edge Computing for Secure and Scalable IIoT Critical Infrastructures in Industry 4.0. IEEE Internet Things J. 2021, 8, 2300–2317. [CrossRef]
    7. Liu, M.; Yu, F.R.; Teng, Y.; Leung, V.C.M.; Song, M. Performance Optimization for Blockchain-Enabled Industrial Internet of Things (IIoT) Systems: A Deep Reinforcement Learning Approach. IEEE Trans. Ind. Informa. 2019, 15, 3559–3570. [CrossRef]
    8. Guan, Z.; Lu, X. Towards secure and efficient energy trading in IIoT-enabled energy internet: A blockchain approach. Future Gener. Comput. Syst. 2020, 110, 686–695. [CrossRef]
    9. Panchal, A.C.; Khadse, V.M.; Mahalle, P.N. Security Issues in IIoT: A Comprehensive Survey of Attacks on IIoT and Its Countermeasures. In Proceedings of the 2018 IEEE Global Conference on Wireless Computing and Networking (GCWCN), Lonavala, India, 23–24 November 2018; IEEE: Piscataway, NJ, USA, 2018; pp. 124–130.
    10. Mabkhot, M.M.; Al-Ahmari, A.M.; Salah, B.; Alkhalefah, H. Requirements of the Smart Factory System: A Survey and Perspective. Machines 2018, 6, 23. [CrossRef]
    11. Ghadge, A.; Weiß, M.; Caldwell, N.; Wilding, R. Managing cyber risk in supply chains: A review and research agenda. Supply Chain Manag. Int. J. 2019, 25, 223–240. [CrossRef]
    12. Helo, P.; Hao, Y. Blockchains in operations and supply chains: A model and reference implementation. Comput. Ind. Eng. 2019, 136, 242–251. [CrossRef]
    13. Bhaskar, S.; Tan, J.; Bogers, M.L.A.M.; Minssen, T.; Badaruddin, H.; Israeli-Korn, S.; Chesbrough, H. At the Epicenter of COVID-19–the Tragic Failure of the Global Supply Chain for Medical Supplies. Front. Public Health 2020, 8, 562882. [CrossRef]
    14. Musamih, A.; Salah, K.; Jayaraman, R.; Arshad, J.; Debe, M.; Al-Hammadi, Y.; Ellahham, S. A Blockchain-Based Approach for Drug Traceability in Healthcare Supply Chain. IEEE Access 2021, 9, 9728–9743. [CrossRef]
    15. Carmody, S.; Coravos, A.; Fahs, G.; Hatch, A.; Medina, J.; Woods, B.; Corman, J. Building resilient medical technology supply chains with a software bill of materials. NPJ Digit. Med. 2021, 4, 1–6. [CrossRef]
    16. García-Villarreal, E.; Bhamra, R.; Schoenheit, M. Critical success factors of medical technology supply chains. Prod. Plan. Control 2019, 30, 716–735. [CrossRef]
    17. Pandey, S.; Singh, R.; Gunasekaran, A.; Kaushik, A. Cyber security risks in globalized supply chains: Conceptual framework. J. Glob. Oper. Strateg. Sourc. 2020, 13, 103–128. [CrossRef]

    -38. Niu, B.; Chen, Y.; Wang, Z.; Li, F.; Wang, B.; Li, H. Eclipse: Preserving Differential Location Privacy Against Long-Term Observation Attacks. IEEE Trans. Mob. Comput. 2020, 21, 125–138. [CrossRef]
    -39. Jin, H.; Su, L.; Xiao, H.; Nahrstedt, K. Incentive Mechanism for Privacy-Aware Data Aggregation in Mobile Crowd Sensing Systems. IEEE/ACM Trans. Netw. 2018, 26, 2019–2032. [CrossRef]
    -40. Jia, M.; He, K.; Chen, J.; Du, R.; Chen, W.; Tian, Z.; Ji, S. PROCESS: Privacy-Preserving On-Chain Certificate Status Service. In Proceedings of the IEEE INFOCOM 2021-IEEE Conference on Computer Communications, Vancouver, BC, Canada, 10–13 May 2021;pp. 1–10.


    版权声明:本人论文译本,当节选或参照部分内容时应注明出处。
    原文链接:【MDPI-Sensors】https://www.mdpi.com/authors/promoting

    Received: 21 December 2021
    Accepted: 8 February 2022
    Published: 10 February 2022

    展开全文
  • JPEG图像的可逆信息隐藏算法研究

    千次阅读 2020-07-19 15:12:32
    对于上述问题,传统上通过加密技术和信息隐藏技术来缓解。加密技术由于乱码的存在容易吸引拦截者的注意,从而想方设法对其破解。而传统的信息隐藏技术经常导致载体不可逆转的失真,意味着载体在提取秘密信息之后将不能...
  • Java实现 LeetCode 831 隐藏个人信息(暴力)

    千次阅读 多人点赞 2020-05-10 22:40:27
    831. 隐藏个人信息 给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码 。 我们将隐藏它的隐私信息,通过如下规则: 电子邮箱 定义名称 name 是长度大于等于 2 (length ≥ 2),并且只包含...
  • 信息隐藏——LSB隐写分析

    千次阅读 2020-06-24 21:37:59
    LSB隐写分析 【实验目的】: 了解并实现常见的LSB隐写分析法。 【实验内容】: ■实现针对LSB隐写的卡方隐写分析算法...秘密信息在嵌入之前往往经过加密,可以看作是0、1 随机分布的比特流,而且值为0与1的可能性都是1
  • 我们在上一章节中已经学习了DataTables在BootStrap框架中的使用方式和初始化。 Bootstrap框架—-DataTables列表示例 最终效果如图: Bootstrap是自动适配移动端的,在...就是在移动端情况下隐藏部分列,点击展...
  • 如何定义范围

    千次阅读 2021-01-11 19:25:18
    展开全部范围定义62616964757a686964616fe4b893e5b19e31333363386662范围定义(Scope Definition)目录[隐藏]1 什么是范围定义2 范围定义的目的3 范围定义的结构4 范围定义的依据5 范围定义的方法什么是范围定义工程...
  • 以本人浅显的经验,把信息隐藏按照程度的不同分成(1)不可见不可用(2)可见不可用(3)可见可用。1 不可见不可用就是说模块内部的变量、结构体、类定义对外部而已完全隐藏,外部对此一无所知。常用的实现方法就是...
  • person.c实现了对这个结构struct person分配内存,释放内存,和获取对象信息的函数。其中person_private.h只被person.c包含。 person.h // person.h #ifndef __PERSON_H__ #define __PERSON_H__ ...
  • 机器学习(概述一)——定义

    万次阅读 2019-05-28 16:18:17
    :一般指从大量的数据中通过算法搜索隐藏于其中的信息的过程。通常通过统计、检索、机器学习、模式匹配等诸多方法来实现这个过程。简单来说: 面对大量数据,不知有什么信息,没什么方向目的 机器学习 :是数据...
  • 现在尝试着在模型里面添加一层隐藏层吧!数据还是手写字体的数据,先看看拥有一层隐藏层的神经网络(多层感知机也叫)示意图吧!  Boom!博主懒得网上找图了,直接动手……原谅我笨拙的字体和手法……接下去我们看看...
  • C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别答案:7信息版本:手机版解决时间 2018-12-14 06:44已解决2018-12-13 14:23C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别最佳答案2018-...
  • Python类的定义和使用

    万次阅读 多人点赞 2022-05-03 10:37:08
    优秀是一种属性,只要我们这类努力学习的人才能调用,带大家一起学习类的定义与使用(一起努力,咱们顶峰相见)
  • 主要就是实现了数字水印的嵌入提取和在不同攻击如旋转剪切噪声等下的提取效果差异的比对1 DCT变换的原理2 DCT变换的特点 在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后...,只反映了图像某一部分的信息...
  • Android 眼睛 显示隐藏密码(ImageView)

    万次阅读 多人点赞 2022-06-20 19:21:54
    Android 眼睛 显示隐藏密码(ImageView) 在前端中我们知道用javascript就可以可以很容易实现,那么在Android中怎么实现这个功能呢?
  • 831. 隐藏个人信息

    千次阅读 2019-06-17 08:15:25
    我们将隐藏它的隐私信息,通过如下规则: <u>1. 电子邮箱</u> 定义名称 <name> 是长度大于等于 2 (length ≥ 2),并且只包含小写字母 a-z 和大写字母 A-Z 的字符串。 电子邮箱地址由名称 &...
  • MySQL 8.0 新特性之隐藏字段

    千次阅读 2021-02-17 21:41:47
    MySQL 8.0.23 版本增加了一个新的功能:隐藏字段...本文给大家介绍一下 MySQL 隐藏字段的相关概念和具体实现,包括如何创建隐藏字段和查询隐藏字段、如何查看隐藏字段相关的字典信息以及二进制日志对隐藏字段的处理。
  • 给每项表单项添加一个自己的id名,并用v-model绑定相对应的数据,利用v-if根据上一个表单项的数据值来进行显示或隐藏 <!-- 类别展示隐藏 --> <el-form-item id="classShowOrHide" v-model="showClass" ...
  • python中定义结构体的方法

    千次阅读 2020-12-05 10:44:16
    python中定义结构体的方法Python中没有专门定义结构体的方法,但可以使用class标记定义类来代替结构体,其成员可以在构造函数__init__中定义,具体方法如下。代码如下:class item:def __init__(self):self.name = ''...
  • Java学习-类的隐藏机制(封装性)

    千次阅读 2020-08-08 18:16:47
    Java学习-类的隐藏机制(封装性)1、封装的含义2、类的setXXX 和 getXXX3、this关键字4、总结![在这里插入图片描述](https://img-blog.csdnimg.cn/20200808174303429.png?x-oss-process=image/watermark,type_ZmFuZ3...
  • typescript学习之路(三) —— ts定义类的方法(包含es5以及es6的定义类)
  • (渗透测试后期)Linux进程隐藏详解

    千次阅读 2022-03-27 17:33:26
    文章目录(渗透测试后期)Linux进程隐藏详解前言Linux进程基础Linux进程侦查手段Linux进程隐藏手段一、基于用户态的进程隐藏方法1:小隐隐于/proc/pid——劫持readdir系统调用额外:加载至arm方法2:小隐隐于/proc/...
  • Div和Span标签显示与隐藏

    千次阅读 2021-06-11 06:43:52
    本实例中,学习jQuery的知识,显示与隐藏网页上的div或是span标签。实际环境中,也许是根据某些条件进行,符合条件时,对某个或是某个div或是span标签时行显示与隐藏。主要是学习jQuery的函数与语法,在网页中放置一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 430,924
精华内容 172,369
热门标签
关键字:

信息隐藏的定义