您的位置  > 互联网

外汇密码技术的特性和常用的加密算法和解密使用

●保密性(信息加密);

●完整性(防篡改、验证数据完整性);

●身份验证(防止冒充并验证身份);

●不可否认性(否认性)。

关于

它只是一种编码方法。 它本质上类似于 ASCII 和 UTF-8 编码。 其主要目的是将不可打印的二进制数据编码为可打印的字符串。 它不具备上述密码技术的四个特征中的任何一个。 。

对称加密

使用同一密钥进行消息加密和解密的加密算法称为对称加密,也称为私钥加密和密钥加密。 常用的对称加密算法包括:DES、3DES、AES、RC4、RC5、RC6等,目前标准为AES,它是目前应用最广泛的对称加密算法。

AES是一种分组密码,它将明文消息分割成一定长度的N个块,然后对每个块进行加密。 AES的块长度固定为128位,密钥可以是128/192/256位。 既然是固定长度的组,那么如果我们想要加密任意长度的明文,就涉及到如何迭代加密多个组的问题。 因此,就有了分组模式。 常用的分组模式有:ECB、CBC、CFB、OFB、CTR等,其中最常用的是ECB和CBC模式,所以需要了解这两种模式的用法和区别。

ECB的全称是电子码本模式。 这是最简单的模式。 它直接将明文分成多组,并逐一加密,如下图:

这种模式的优点是简单、快速,加密和解密都支持并行计算。 缺点也很明显,因为每个明文组都是独立加密和解密的。 如果明文中有多个相同的明文组,这些组最终会被转换成同一个密文组。 这样,只要观察密文,就可以知道明文中存在哪些重复组合,并可以以此作为破译密码的线索。 另外,攻击者可以在不破译密码的情况下,通过改变密文组的顺序、删除密文组或替换密文组来达到操纵明文的目的。 实际应用中,需要并行计算的加解密场景很少。 因此一般不使用这种分组模式,更推荐使用CBC模式。

CBC的全称是Block。 密文组链接方式是将之前的密文组和当前的明文组的内容混合起来进行加密,如下图:

在CBC模式下,明文组首先与之前的密文组进行异或,然后进行加密。 在对第一明文组进行加密时,由于不存在“先前密文组”,因此需要提前准备一个块长度的比特序列来替换“先前密文组”。 该位序列称为初始化向量( ),通常缩写为 IV。 CBC模式避免了ECB模式的弱点,明文的重复排列不会在密文中反映出来。 但相比ECB模式,CBC模式多了一个初始化向量IV。

另外,当最后一个明文数据包的内容小于数据包长度时,需要填充一些特定的数据。 填充方式有很多种,常用的有两种:PKCS#5和PKCS#7。 需要注意的是,不同的编程语言可能会使用不同的填充方法。 例如,Java 使用 PKCS#5,而 iOS-C 和 Swift 使用 PKCS#7。 然而,对于 AES,两种填充方法是相同的。

在实际应用中,我们一般会在前端对密码或者其他敏感数据进行加密,然后在后端进行解密。 由于前后端涉及到不同语言的实现,为了保证前后端加解密结果一致,需要几个参数保持一致:

●密钥:基本上毫无疑问密钥必须使用相同的,但需要注意的是密钥长度需要统一为128/192/256位,即16/24/32字节。

●分组模式:建议分组模式统一为CBC模式并显式声明,因为不同语言的默认分组模式可能不同。

●初始化向量:加密和解密时的初始化向量IV也必须一致。 也不要使用默认设置,而是明确定义它们。

●填充方式:Java采用,iOS采用PKCS7,对于AES,两者相同。

AES 算法本身对字节数组进行操作。 因此,编码一般用于将字节数组加密后转换为字符串,解码用于在解密前将字符串转换回字节数组。

使用对称加密最关键的是保证密钥的安全。 一般不建议直接在网络上传输密钥。 此外,密钥必须安全地存储在客户端上。

非对称加密

非对称加密也称为公钥加密,使用一对密钥,使用公钥进行加密,然后使用配对的私钥进行解密。 公钥是公开的,而私钥是保密的。 与对称加密相比,安全性提高了,但以牺牲性能为代价,加解密速度慢了几个数量级。 消息越长,加密和解密速度越慢。

最广泛使用的非对称加密算法是RSA。 它的原理是采用大整数素数分解(每个合数可以写成几个素数的乘积,其中每个素数是该合数的一个因数,称为该合数的分解素因数。)问题的难度,加密和解密其实就是两个很简单的公式:

●加密:密文=明文^E mod N

●解密:明文=密文^D mod N

也就是说,加密就是将明文进行E次方后除以N求余的过程,其中E和N的组合就是公钥,即公钥=(E,N )。

解密过程是将密文进行D次方除以N得到余数,即明文。 D和N的组合就是私钥,即私钥=(D,N)。

公钥和私钥共有的N称为模数,E和D分别是公钥指数和私钥指数。 因为RSA是基于上述数学问题的,所以它的明文、密钥和密文都是数字。 我们通常看到的字符串实际上是数字的编码二进制表示。

密钥长度越长,就越安全。 建议使用 1024 位或更大的值。 这里所说的1024密钥长度实际上是指模数的长度。 此外,与可以加密任意长度的明文的对称密码不同,RSA 明文长度不能超过密钥长度。 Java默认RSA加密实现的最长明文长度是密钥长度减去11字节。 如果密钥长度设置为1024位,即128字节,则明文长度不能超过128 - 11 = 117字节。 如果超过这个长度就会抛出异常。 如果你要加密的明文比较长,生成更长的密钥,比如2048位,那么明文可以长达245字节,就足够了。 对于太长的明文加密,不建议使用RSA,性能太低。

另外,为了提高安全性,RSA加密时会填充一些随机数。 RSA加密填充方式主要有3种:、、。 其中,最常用的一种是在明文前面填充11字节的随机数。 因此,同一个明文每次加密生成的密文都会不同。 如果希望每次加密生成的密文都一样,那么就使用的方式,即不填充,但这无疑会降低安全性,所以一般不推荐。

在实际应用中,我们不会直接对长消息进行非对称加密,而只会对一些安全性要求非常高的短消息进行加密,比如用户密码、对称加密密钥等。 SSL/TLS的加密方案使用对称加密对请求消息进行加密,并使用公钥加密对对称加密密钥进行加密。

单向哈希函数

对称加密和非对称加密主要用来解决消息的保密问题,即可以防止消息被窃听而导致秘密泄露,但无法验证消息是否被篡改。 为了验证消息是否被篡改,必须验证消息的完整性。 验证方案有很多种,最简单、最高效的一种是单向哈希函数。

单向哈希函数,又称散列函数、散列函数、消息摘要算法等,是一种可以将任意长度的输入消息字符串转换为固定长度的输出字符串的函数。 输出值称为“哈希值”或“消息摘要”,也称为消息的“指纹”。 使用单向哈希函数,相同的消息将生成相同的哈希值。 只要消息发生改变,即使只改变1个字节,最终的哈希值也会发生很大的变化。 因此,使用这个hash是非常合适的。 该值验证消息的完整性。

最常用的单向哈希函数是 MD5 和 SHA。 SHA实际上包括SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。 后四种统称为 SHA-2。 有时候,当我们下载一些软件的安装文件时,官方一般会提供该文件的MD5和SHA-1哈希值,这样我们就可以自己生成下载文件的哈希值,然后与官方哈希值。 比较hash值就可以知道文件是否被修改过。

在我们日常的实际应用中,单向哈希函数很少单独使用,一般都是与其他技术结合使用。 毕竟单独使用并不是很安全。 以用户密码的安全为例。 很多应用程序会直接MD5,然后将用户密码传输到服务器。 该解决方案存在两个主要安全风险。 首先,对于一些不够复杂的密码来说,很难防范彩虹表。 其次,如果不同的用户设置相同的密码,那么哈希值无疑是相同的。

我们先来说第一点。 首先,我们来了解一下什么是彩虹表。 彩虹表是一种预先计算的表,用于单向哈希函数的逆运算,为破解密码哈希而准备。 我们可以简单的理解彩虹表是一张建立明文和密文对应关系的字典表。 通过已知的密文可以找到明文,尽管实际上其原理比想象的要复杂得多。 比如密码“”的MD5结果是“”,那么我监听用户的登录请求,当得到密码字符串“”时,可以从准备好的彩虹表中查出原来的密码是“”。

我们来说说第二点。 设置了相同密码的不同用户具有相同的MD5哈希值,因此只要破解其中一个密码,就相当于破解了多个用户的密码。

为了处理以上两个问题,比较好的解决方案是MD5+salt,也称为MD5加盐,意思是在原始密码的基础上添加一串salt值,然后再进行MD5。 盐值 salt 是一个随机字符串。 每个用户的盐值通常是不同的。 这样就保证了不同用户最终的MD5哈希值是不同的。 而且,因为有一串随机的字符串,彩虹表也很难。 有效。

消息验证码

虽然单向哈希函数可以用来验证消息的完整性,但它无法验证消息是否来自合法的发送者,即无法解决身份验证问题。 解决发送方的认证问题,最常用的解决方案有两种,一种是使用消息认证码,另一种是使用数字签名。 本节我们首先了解一下消息认证码。

消息认证码(code)是一种确认完整性并进行认证的技术,简称MAC。 消息认证码的输入包括任意长度的消息以及发送方和接收方共享的密钥,并且可以输出固定长度的数据。 该数据称为 MAC 值。

实现消息认证码的方法有很多种。 最常用的实现方法是HMAC。 具体来说,根据使用哪种单向哈希函数,可以分为:HMAC-MD5、HMAC-SHA1、HMAC-等。 HMAC简单理解为带有密钥的哈希函数。 因为有密钥,所以可以验证发送者的身份; 并且由于使用了哈希函数,因此还具有完整性检查的特性。

认证的基本流程是:

1. 发送方使用共享密钥计算消息的MAC值;

2. 发送方将消息和MAC值一起发送给接收方;

3、接收方收到消息和MAC值后,使用相同的共享密钥计算消息的MAC值;

4. 比较计算出的MAC 值与接收到的MAC 值是否一致。 如果一致,则认证成功。

现在很多接口增加的URL签名机制实际上就是对请求的MAC认证。 我经常使用的是HMAC。 具体的设计细节将在文章后面详细讲解。 但由于使用共享密钥,也存在与对称加密相同的密钥安全问题。

电子签名

数字签名还可以解决发送者的身份验证问题,并且数字签名具有不可否认性。 数字签名的原理也很简单。 它实际上是非对称加密的逆向使用。 我们知道,非对称加密是使用公钥进行加密,然后使用私钥进行解密。 数字签名用私钥加密,生成的密文就是数字签名,然后用公钥解密。 使用私钥加密只能由持有私钥的人完成。 正是基于这个事实,用私钥加密的密文可以被视为签名。 由于公钥是公开的,所以任何人都可以使用公钥来解密,即任何人都可以验证签名。

另外,我们还知道非对称加密本身加密和解密的速度非常慢。 消息越长,性能越慢。 因此一般不用于长消息的加密和解密。 同样,长消息一般不会直接签名。 通常的方法是对消息的哈希值进行签名。 由于哈希值比较短,加密签名速度相对较快。 因此,您将看到这样实现的数字签名。

最后,应该指出的是,数字签名实现可以验证消息完整性、验证发送者身份并防止否认,但它们不能解决机密性问题。 不要想象可以用一种密码技术来解决它。 所有问题。

然而,数字签名不适合直接在客户端使用。 由于客户端需要对消息进行签名,因此客户端需要保存私钥,而私钥的安全传递和存储还存在问题。 使用最广泛的数字签名可能是数字证书,其中还涉及SSL/TLS和CA。 我们将在后面的文章中讨论这个话题。