Tip:
Highlight text to annotate it
X
Hi,我是三星移动bada组的Jon.
欢迎观看bada安全介绍的第2部分。
这个视频是介绍bada的各种主题的系列视频中的一个视频,
这些视频能让你快速地了解bada. 可以要到developer.bada.com上访问我们的blog.
也可以到YouTube上观看第一部分和其它的视频。
在第一部分,我们介绍了bada的安全类,和教大家如何 利用公/私钥进行加密.
在第二部分,我们将介绍如何使用数字签名和哈希算法。
我们将继续沿用Alice和Bob的例子,进行安全模块的演示。
让我们开始数字的讲解,数字签名在bada中用来验证消息的发送者。
那么伪造消息简单吗?
Bob和Alice认为他们的消息是安全的,但是他们没有料想到会出现Eva,
Eva将会不择手段地去阅读他们的消息。Eva知道
如何拦截Alice和Bob之间的通信,并且可以伪装成发送者,
这就是通常的“中间人攻击”
那么“中间人攻击”是如何工作的呢?
Bob将他的公钥发送给Alice,但是Eve截获了这个密钥,
并将自己伪装成Bob,将自己的公钥发给了Alice。
Alice认为她将用Bob给她的公钥加密的消息发送给了Bob,
(但是实际上是Eve的公钥)
Eva截获了这条消息,用自己的私钥将它解密,获取消息原文。
在用Bob的公钥对消息进行加密。 将消息发送给Bob, 0:01:49.920,0:01:51.909. 这样看上去好像消息是从Alice哪里过来的一样。
那么Alice和Bob知道他么的消息被截获了吗?
Alice和Bob都不知道他们的消息被Eve截获了。
怎样使用数字签名呢?当Alice给Bob发送消息时,
她用她的私钥和数字签名进行签名,只有Alice知道她自己的私钥。
那么如果消息用Alice的公钥和签名通过了验证,这样消息
肯定是从Alice传过来的。 那么Eve还可以截获消息吗?
Eva还可以截获消息。但是Eve不能伪装成Alice或者Bob.
因为Eve发送的任何消息都将验证失败,她没有Alice的私钥。
数字签名在bada中是怎样实现的呢?
数字签名是由RsaSignature类来表示的,它属于Security::Crypto命名空间。
让我们来看一下代码。
在样例当中,AliceForm类中的SignMessage()函数负责
对发送给Bob的加密过的消息进行签名。在我们的样例当中, Alice's的签名非常简单。
当时在后面我们会看到,整个应用程序当中的签名会很复杂。
sigBuffer是ByteBuffer类的对象,包含了Alice的签名。
ByteBuffer的Flip()方法对缓存进行复位。这样缓存就可以使用了。
我们创建一个RsaSignature对象,调用SetPrivateKey方法将
签名和Alice的私钥联系起来。接着调用SignN()方法,
SignN()返回一个加密后的签名,和消息一起传送给Bob.
Bob怎样确认消息中包含有Alice的签名呢?
当Bob收到消息后,创建一个RsaSignature对象,
将Alice的公钥设置为RsaSignature对象的公钥。
调用Verify()方法验证加密了的Alice的签名,
匹配sigBuffer中的签名, 如果签名不是由Alice的私钥产生的,
或者签名不匹配,验证过程将失败。
这样Bob就不能验证消息是由Alice发送过来的。 Eve能冒充Alice或者Bob发送消息吗?
这是不可能的。
因为Bob不知道他们的私钥。
所以她不能对消息进行签名。 那好Jon,这堂课的最后我们会学些什么呢?
我们将看一下bada中的hashes.
hashes用来验证消息的内容没有被窜改。
Bob和Alice根据消息的内容产生了一个哈希值,
也就是信息摘要。这个摘通过密码哈希函数产生。
你可以把摘要理解为指纹。
从消息的某块数据产生。
不可能通过摘要去产生原文,
也不可能通过不同的原文产生相同的摘要。
消息的摘要是怎样计算出来的呢?
一个数学算法用来实现这种功能。
当接收到消息后,
接收方将从消息产生的摘要和接收到的摘要进行比较,
如果摘要相同,说明消息没有被窜改。
哈希在bada中是如何实现的呢?
实现密码哈希函数的类在Security::Crypto命名空间中,
它实现了IHash接口类。
Md5Hash, Sha1Hash 和 ha2Hash类分别表示不同的算法,
让我们看看代码:
在AliceForm类中,我们用SignWithHash()函数从消息摘要中产生一个数字签名。
这个数字签名和消息一起传给Bob.
首先我们创建一个RsaSignature对象,并设置Alice的私钥。
通过GetHashN()得到一个新的hash对象。 通过hash对象从消息中产生一个摘要。
将摘要传入RsaSignature类中的SignN()函数,
这个方法返回消息摘要的签名。 储藏在pSignature中,pSignature是一个ByteBuffer对象。
将签名和消息一起发送给Bob. SignN()改变了摘要的内容吗?
SignN没有改变摘要的内容,它只是返回它的数字签名。
那么Bob怎样确认从Alice来的消息没有被窜改呢?
当Bob接收到消息后,首先用Alice的公钥进行解密,
解密的结果放在pMessage字符串当中。
BobForm类中的方法VerifySignedWithHash()用来验证消息没有被窜改。
创建一个RsaSignature对象,
将Alice的公钥设置给RsaSignature对象。 创建一个新的hash对象。
从消息中产生一个摘要,并加密。
调用Verify()方法,保证刚才产生的签名和同消息一起发送过来的签名是一致的。
如果验证成功,
那么用Alice的私钥进行签名的消息就没有被修改。
如果验证失败,
那么消息就是被修改了,Alice就不能被认为是发送者。
为什么我们要从消息的摘要中产生签名,
而不是直接用消息本身呢?这是因为用整消息产生签名非常耗时。
尤其是在资源受限的移动电话上。
让我们在看一下我们的工程。 看Bob和Alice是如何保证交换的消息的完整性的。
运行我们的演示程序,
AlieForm和BobForm比之前复杂。
在AliceForm中,我们输入消息, 点击Encrypt,对消息进行加密,
并从消息的哈希码中产生一个签名。 这个签名用来让我们知道消息是否被窜改。
在BobForm中,Bob收到了消息。
用他自己的私钥进行解密,通过Alice的公钥和签名验证消息。
消息验证通过,消息是由Alice发送的,
消息的Hash值是正确的。消息没有被窜改。
如果Eva截获了消息呢?
让我们看看当Eva试着截获消息会发生什么情况。
在AliceForm中,我们输入发送给Bob的消息,为了了解当Eve截获了消息会发生什么情况。
点击Eve intercepts键。在EveForm中我们修改了消息。
并将它传送给Bob. Bob解密并验证消息。
验证失败。 为什么会这样呢?
验证失败有两个原因。 Eve没有Alice的私钥,不能对消息进行签名。
再就是消息被修改了,这样从原文件产生的哈希值和
和加密后的消息产生的哈希值不匹配。
Bob知道那条消息不可靠。这样Alice的安全策略就成功了。
Jon.从哪里我可以获取更多的关于安全方面的资料呢?
请关注developer.bada.com
在上面你可以找到很多视频,编程技巧和技术文档。