精华内容
下载资源
问答
  • 本文介绍,在数据安全相关领域,常见的问题场景,以及相应的处理策略。涉及到三类算法:哈希算法、对称加密算法、非对称加密算法;以及两个场景:数字签名(数字证书也是数字签名一种处理方式)、内容加密。

    1 前言

    本文介绍,在数据安全相关领域,常见的问题场景,以及相应的处理策略。涉及到三类算法:哈希算法、对称加密算法、非对称加密算法;以及两个场景:数字签名(数字证书也是数字签名一种处理方式)、内容加密。

    2 三类算法

    2.1 哈希算法

    常见的hash算法包括“MD5、SHA-1、SHA-256、SHA-384、SHA-512”。不论消息内容有多长,使用hash算法,总能得到指定位数的一个序列。例如,采用SHA-1算法计算以下内容的消息摘要:
    “Upon my death, my property shall be divided equally among my children; however, my son George shall receive nothing.”
    得到的结果是:
    “12 5F 09 03 E7 31 30 19 2E A6 E7 E4 90 43 84 B4 38 99 8F 67”
    以下是代码示例:

    package com.galen.v2ch09.hash;
    
    import java.io.*;
    import java.nio.file.*;
    import java.security.*;
    
    /**
     * This program computes the message digest of a file.
     *
     * @author Cay Horstmann
     * @version 1.20 2012-06-16
     */
    public class Digest {
        /**
         * @param args args[0] is the filename, args[1] is optionally the algorithm
         *             (SHA-1, SHA-256, or MD5)
         *             javac com/galen/v2ch09/hash/Digest.java
         *             java com.galen.v2ch09.hash.Digest input.txt
         *             java com.galen.v2ch09.hash.Digest input.txt MD5
         */
        public static void main(String[] args) throws IOException, GeneralSecurityException {
            String algname = args.length >= 2 ? args[1] : "SHA-1";
            MessageDigest alg = MessageDigest.getInstance(algname);
            byte[] input = Files.readAllBytes(Paths.get(args[0]));
            byte[] hash = alg.digest(input);
            String d = "";
            for (int i = 0; i < hash.length; i++) {
                int v = hash[i] & 0xFF;
                if (v < 16) d += "0";
                d += Integer.toString(v, 16).toUpperCase() + " ";
            }
            System.out.println(d);
        }
    }
    

    如果使用idea开发工具可以打开teminal输入以下命令进行测试:
    在这里插入图片描述
    (1) javac com/galen/v2ch09/hash/Digest.java : 编译指定java文件。
    (2) java com.galen.v2ch09.hash.Digest input.txt:运行Digest类,并传入input.txt文件,默认将使用“SHA-1”哈希算法。
    (3) java com.galen.v2ch09.hash.Digest input.txt MD5 : 运行Digest类,并传入input.txt 文件,使用MD5哈希算法。

    2.2 对称加密算法

    对称加密算法是应用较早的加密算法,又称为共享密钥加密算法。常见的对称加密算法包括DES、3DES、AES 等。
    在 对称加密算法 中,使用的密钥只有一个,发送 和 接收 双方都使用这个密钥对数据进行 加密 和 解密。这就要求加密和解密方事先都必须知道加密的密钥。
    数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。
    数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成可读明文。

    package com.galen.v2ch09.aes;
    
    import java.io.*;
    import java.security.*;
    import javax.crypto.*;
    
    /**
     * This program tests the AES cipher. Usage:<br>
     * javac com/galen/v2ch09/aes/Util.java<br>
     * javac com/galen/v2ch09/aes/AESTest.java<br>
     * java com.galen.v2ch09.aes.AESTest -genkey secret.key<br>
     * java com.galen.v2ch09.aes.AESTest -encrypt plaintext.txt encrypted.txt secret.key<br>
     * java com.galen.v2ch09.aes.AESTest -decrypt encrypted.txt decrypted.txt secret.key<br>
     *
     * @author Cay Horstmann
     * @version 1.01 2012-06-10
     */
    public class AESTest {
        public static void main(String[] args)
                throws IOException, GeneralSecurityException, ClassNotFoundException {
            if (args[0].equals("-genkey")) {
                KeyGenerator keygen = KeyGenerator.getInstance("AES");
                SecureRandom random = new SecureRandom();
                keygen.init(random);
                SecretKey key = keygen.generateKey();
                System.out.print(key.toString());
                try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(args[1]))) {
                    out.writeObject(key);
                }
            } else {
                int mode;
                if (args[0].equals("-encrypt")) {
                    mode = Cipher.ENCRYPT_MODE;
                } else {
                    mode = Cipher.DECRYPT_MODE;
                }
    
    
                try (ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(args[3]));
                     InputStream in = new FileInputStream(args[1]);
                     OutputStream out = new FileOutputStream(args[2])) {
                    Key key = (Key) keyIn.readObject();
                    Cipher cipher = Cipher.getInstance("AES");
                    cipher.init(mode, key);
                    Util.crypt(in, out, cipher);
                }
            }
        }
    }
    

    测试类中使用的公共类:

    package com.galen.v2ch09.aes;
    
    import java.io.*;
    import java.security.*;
    import javax.crypto.*;
    
    public class Util {
        /**
         * Uses a cipher to transform the bytes in an input stream and sends the transformed bytes to an
         * output stream.
         *
         * @param in     the input stream
         * @param out    the output stream
         * @param cipher the cipher that transforms the bytes
         */
        public static void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException,
                GeneralSecurityException {
            int blockSize = cipher.getBlockSize();
            int outputSize = cipher.getOutputSize(blockSize);
            byte[] inBytes = new byte[blockSize];
            byte[] outBytes = new byte[outputSize];
    
            int inLength = 0;
            boolean more = true;
            while (more) {
                inLength = in.read(inBytes);
                if (inLength == blockSize) {
                    int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
                    out.write(outBytes, 0, outLength);
                } else more = false;
            }
            if (inLength > 0) outBytes = cipher.doFinal(inBytes, 0, inLength);
            else outBytes = cipher.doFinal();
            out.write(outBytes);
        }
    }
    
    
    

    2.3 非对称加密算法

    非对称加密算法也有叫做“公共密钥加密技术”。非对称加密算法是基于“公共密钥”和“私有密钥”两个基本概念的。它的设计思想是你可以将公共密钥告诉任何人,但是只有自己才持有“私有密钥”,你需要保护你的“私有密钥”,不将其泄露给任何人。常见的非对称加密算法如DSA、RSA、ECC等。“公共密钥”和“私有密钥”是相对的,通过指定工具产生一组密钥,将其中任一个密钥作为公有密钥公布出去,另外一个即为私有密钥。
    由于非对称加密算法更加复杂,加解密过程相对于对称加密会慢很多,所以当需要加密的信息内容很多的情况下,一般对正文内容会采用对称加密(会有一个密钥),然后对密钥进行非对称加密。以下代码,展示对一个对称加密的的密钥进行非对称加密的过程。

    package com.galen.v2ch09.rsa;
    
    import java.io.*;
    import java.security.*;
    import javax.crypto.*;
    
    /**
     * This program tests the RSA cipher. Usage:<br>
     * javac com/galen/v2ch09/rsa/Util.java<br>
     * javac com/galen/v2ch09/rsa/RSATest.java<br>
     * java com.galen.v2ch09.rsa.RSATest -genkey publickey.key privatekey.key<br>
     * java com.galen.v2ch09.rsa.RSATest -encrypt plaintext.txt rsaencrypted.txt publickey.key<br>
     * java com.galen.v2ch09.rsa.RSATest -decrypt rsaencrypted.txt rsadecrypted.txt privatekey.key<br>
     *
     * @author Cay Horstmann
     * @version 1.01 2012-06-10
     */
    public class RSATest {
        private static final int KEYSIZE = 512;
    
        public static void main(String[] args)
                throws IOException, GeneralSecurityException, ClassNotFoundException {
            if (args[0].equals("-genkey")) {
                KeyPairGenerator pairgen = KeyPairGenerator.getInstance("RSA");
                SecureRandom random = new SecureRandom();
                pairgen.initialize(KEYSIZE, random);
                KeyPair keyPair = pairgen.generateKeyPair();
                try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(args[1]))) {
                    out.writeObject(keyPair.getPublic());
                }
                try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(args[2]))) {
                    out.writeObject(keyPair.getPrivate());
                }
            } else if (args[0].equals("-encrypt")) {
                KeyGenerator keygen = KeyGenerator.getInstance("AES");
                SecureRandom random = new SecureRandom();
                keygen.init(random);
                SecretKey key = keygen.generateKey();
    
                try (ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(args[3]));
                     DataOutputStream out = new DataOutputStream(new FileOutputStream(args[2]));
                     InputStream in = new FileInputStream(args[1])) {
                    Key publicKey = (Key) keyIn.readObject();
                    Cipher cipher = Cipher.getInstance("RSA");
                    cipher.init(Cipher.WRAP_MODE, publicKey);
                    byte[] wrappedKey = cipher.wrap(key);
                    out.writeInt(wrappedKey.length);
                    out.write(wrappedKey);
    
                    cipher = Cipher.getInstance("AES");
                    cipher.init(Cipher.ENCRYPT_MODE, key);
                    Util.crypt(in, out, cipher);
                }
            } else {
                try (DataInputStream in = new DataInputStream(new FileInputStream(args[1]));
                     ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(args[3]));
                     OutputStream out = new FileOutputStream(args[2])) {
                    int length = in.readInt();
                    byte[] wrappedKey = new byte[length];
                    in.read(wrappedKey, 0, length);
    
                    // unwrap with RSA private key
                    Key privateKey = (Key) keyIn.readObject();
    
                    Cipher cipher = Cipher.getInstance("RSA");
                    cipher.init(Cipher.UNWRAP_MODE, privateKey);
                    Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
    
                    cipher = Cipher.getInstance("AES");
                    cipher.init(Cipher.DECRYPT_MODE, key);
    
                    com.galen.v2ch09.rsa.Util.crypt(in, out, cipher);
                }
            }
        }
    }
    
    

    代码中使用到的公共类如下:

    package com.galen.v2ch09.rsa;
    
    import java.io.*;
    import java.security.*;
    import javax.crypto.*;
    
    public class Util {
        /**
         * Uses a cipher to transform the bytes in an input stream and sends the transformed bytes to an
         * output stream.
         *
         * @param in     the input stream
         * @param out    the output stream
         * @param cipher the cipher that transforms the bytes
         */
        public static void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException,
                GeneralSecurityException {
            int blockSize = cipher.getBlockSize();
            int outputSize = cipher.getOutputSize(blockSize);
            byte[] inBytes = new byte[blockSize];
            byte[] outBytes = new byte[outputSize];
    
            int inLength = 0;
            ;
            boolean more = true;
            while (more) {
                inLength = in.read(inBytes);
                if (inLength == blockSize) {
                    int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
                    out.write(outBytes, 0, outLength);
                } else more = false;
            }
            if (inLength > 0) outBytes = cipher.doFinal(inBytes, 0, inLength);
            else outBytes = cipher.doFinal();
            out.write(outBytes);
        }
    }
    
    

    3 数字签名

    java核心技术卷2【core java】中有这样一个例子,一位亿万富翁生前留下遗嘱:“我死了之后,我的财产将由我的孩子们评分,但是,我的儿子George应该拿不到一分钱”。遗嘱的信息是公开的(不用保密),但是遗嘱的内容不能被篡改。那么数字签名的作用,就类似于指纹或者个人手写签名的作用。

    数字签名是数据安全中的典型应用之一,主要作用是保证数据内容在传输过程中,没有被篡改。数字签名的使用方法包括:1、计算出消息摘要,2、对消息摘要加密,3、证书认证。

    3.1 消息摘要(message digest)

    消息摘要(message digest),即数据信息的数字指纹。消息摘要的主要特性:如果数据的1位或者几位改变了,那么消息摘要也将改变。
    消息摘要是通过哈希算法计算得到的,如果消息的内容改变了,那么改变后的消息的摘要与原消息的摘要是不匹配的。如果消息的内容与消息的摘要分开传递的话,接受者就可以用摘要来检查消息的内容是否发生过改变。但是如果消息的内容和消息的摘要同时被截获了,对消息进行修改,再重新计算摘要,发送给接收方,那么接收方就无法判断内容是否被篡改过了。所以,仅靠消息摘要,也是无法完全保证消息内容不被篡改的。

    这里就涉及到了数据签名的更加严谨的方式:计算出消息摘要后,再对消息摘要加密(即消息签名)。

    3.2 数字签名

    消息签名涉及到非对称加密算法。下面以Alice给Bob发送了一个邮件,采用数字签名的方式,实现的具体步骤:
    1、Alice写了一个邮件;
    2、使用hash算法,如MD5算法,计算得到该邮件内容的摘要(一个指定长度的hash字符串);
    3、Alice用它的私钥对摘要加密;
    4、将邮件以及加密后的摘要发送给Bob;
    5、Bob用Alice的公钥解密邮件摘要,得到摘要A;
    6、Bob采用同样的hash算法计算该邮件的摘要,得到摘要B;
    结论:
    1、上述第5步,如果使用Alice的公钥解开了摘要,那么就说明该邮件是Alice发送的;
    2、上述第5步,第6步得到的摘要A=摘要B,则证明邮件在传输过程中没有被修改过。

    进一步讨论,这里可能产生新的问题:公钥是公开的并且可以自行导入到电脑,如果George偷偷在Bob的电脑用自己公钥替换了Alice的公钥,然后用自己的私钥给Bob发送Email,这时Bob收到邮件其实是被George冒充的,但是他无法察觉。所以这里引申出来另外解决办法:数字证书。

    3.3 数字证书

    上面第2点描述的安全漏洞根源在哪?就是Alice的公钥很容易被替换!那么数字证书是怎么生成的呢?以及如何配合数字签名工作呢?

    1、首先Alice去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对Alice的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate):
    在这里插入图片描述
    2、A在邮件正文下方除了数字签名,另外加上这张数字证书
    在这里插入图片描述
    3、Bob收到Email后用CA的公钥解密这份数字证书,拿到Alice的公钥,然后验证数字签名,后面流程就和上一步的流程一样了,不再赘述。

    和数字签名一样我在梳理这个流程时有下面几点疑惑:
    (1) 假设数字证书被伪造了呢?
    答案:是的,传输中数字证书有可能被篡改。因此数字证书也是经过数字签名的,是不是感觉很绕貌似陷入了“鸡生蛋蛋生鸡”,我保证这是最后一个蛋- - !上文说道数字签名的作用就是验证数据来源以及数据完整性!B收到邮件后可以先验证这份数字证书的可靠性,通过后再验证数字签名。

    (2) 要是有1万个人要给B发邮件,难道Bob要保存1万份不同的CA公钥吗?
    答案:不需要,CA认证中心给可以给Bob一份“根证书”,里面存储CA公钥来验证所有CA分中心颁发的数字证书。CA中心是分叉树结构,类似于公安部->省公安厅->市级派出所,不管A从哪个CA分支机构申请的证书,Bob只要预存根证书就可以验证下级证书可靠性。

    (3) 如何验证根证书可靠性?
    答案:无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

    4 内容加密

    上面内容介绍的都是对数字签名进行认证,确保信息传递过程中的不被篡改。那么数据安全的另外一个方面,就是数据内容加密。并不是所有信息都需要加密,加密后的信息内容是不可见的,在用户账户,用户密码,个人身份等敏感信息传递过程中使用。

    • 对于内容加密,有两种处理方式,对称加密(对称加密算法,对称密码)和非对称加密(非对称加密算法,公共密钥,私有密钥)。
    • 对称加密,采用同一密码,运算快,安全度低;非对称加密,采用公私钥加密,运算慢,安全度高。当数据内容量大的情况下,我们采用对称加密,同时将对称密码采用非对称加密。(详细见2.3代码的实现方式)

    5、源码说明

    (1) 当使用javac命令编译源码时,需要将teminal定位到source folder目录(一般是source目录)的下一级目录,然后进行编译或者运行。否则,引用其他类时,会出现“错误:找不到符号”。如:
    在这里插入图片描述
    (2) source folder目录可以在project structure中看到:
    在这里插入图片描述
    (3) 代码中使用到的文件,统一放在 source folder(本例中为src)目录下,这样可以直接通过文件名获取到。
    在这里插入图片描述
    本文源码:https://gitee.com/muziye/core-java.git请查看v2ch09章节部分
    推荐阅读:
    1、阮一峰老师的博文:【数据安全】一、数字签名是什么?
    2、【数据安全】一、通俗理解数字签名,数字证书和https

    展开全文
  • 3.5.1 数字签名技术 数字签名技术是公钥加密算法的典型应用数字签名的应用过程是数据源发送方使 用自己的私钥对数据校验和或其他与数据内容有关的变量进行加密处理完成对数据的合 法签名数据接收方则利用对方的公钥...
  • 本文将详细介绍什么是数字签名,并采用Signtool工具对EXE文件进行签名,后续深入分析数字签名的格式及PE病毒内容。这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些...

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~

    作者前文介绍了宏病毒相关知识,它仍然活跃于各个APT攻击样本中,具体内容包括宏病毒基础原理、防御措施、自发邮件及APT28样本分析。本文将详细介绍什么是数字签名,并采用Signtool工具对EXE文件进行签名,后续深入分析数字签名的格式及PE病毒内容。 这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了参考文献中的文章,并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。

    从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

    接下来我将开启新的安全系列,叫“系统安全”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

    作者的github资源:

    前文分析:

    声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)


    一.PE文件的数字签名

    1.概念普及

    (1) PE文件
    PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。后续文章会详细分析PE文件格式。


    (2) 为什么要对PE文件进行数字签名呢?

    • 防篡改:通过对数字签名的验证,保证文件未被非法篡改。
    • 降低误报:安全软件通过验证文件是否有正规厂商的数字签名来降低误报。

    (3) PE文件数字签名及验证过程
    签名:

    • 软件发布者使用散列算法(如MD5或SHA)计算PE文件的散列值。
    • 软件发布者使用私钥对散列值进行签名得到签名数据。
    • 将签名私钥对应的公钥和签名数据等以证书的形式附加在PE文件之中,形成经过数字签名的PE文件。
    • 软件发布者将经过数字签名的PE文件进行发布。

    验证:

    • 从PE文件证书中提取软件发布者的公钥、使用的散列算法、签名算法、原始散列值的签名数据。
    • 使用提取的公钥和对应签名验证算法将签名数据还原为原始PE文件的原始散列值。
    • 对现有PE文件使用同样的散列算法计算出对应的散列值。
    • 对比两个散列值是否一致,从而判断数据是否被破坏和篡改。

    在这里插入图片描述


    (4) PE文件数字签名的总体结构
    PE文件数字签名信息存放在Certificate Table位置,同时PE文件可选文件头DataDirecotry第5项记录文件偏移及大小。

    下一篇文章作者尝试详细讲解PE文件结构及签名解析。

    在这里插入图片描述

    使用PEView查看签名前后对比图,可以看到Certificate Table存储相关签名信息。

    在这里插入图片描述


    (5) PE文件数字签名查看
    这里以Zoomit.exe程序为例,我们可以看到经过数字签名后的PE文件还会多出一个“数字签名”的属性,点击详细信息可以查看对应的证书。
    在这里插入图片描述

    对应的证书信息及证书路径如下图所示,包括签名算法、哈希算法、有效期、颁发者信息等。

    在这里插入图片描述


    (6) 微软数字签名证书查看
    接着,我带领大家看看Windows证书。运行中输入“certmgr.msc”,可以看到这里面有5个系统默认的ECC签名的根证书,如下图所示。

    在这里插入图片描述

    我们随意导出其中一个根证书,导出直接选择Base64编码那个就行。

    在这里插入图片描述

    可以看到导出的ECC密钥证书如下图所示,包括证书的有效期等信息。这就是微软在实现椭圆曲线加密(ECC)算法的数字证书,位于CryptoAPI.dll文件,也是被我们利用来伪造可信任来源的签名漏洞。

    在这里插入图片描述


    (7) 数字签名常用算法及应用领域
    数字签名常用算法包括:

    • RSA数字签名算法
      基于大整数分解问题,MD5、SHA
    • DSA数字签名算法
      基于离散对数问题
    • ECDSA椭圆曲线数字签名算法
      ECC+DSA,椭圆加密算法,属于DSA的一个变种,基于椭圆曲线上的离散对数问题

    其应用领域包括:

    • PE文件数字签名
    • HTTPS数字签名
    • 电子邮件数字签名
    • Office文档数字签名
    • 代码数字签名

    2.Github网站证书验证过程

    接着看看Github网站进行微软证书验证的过程。

    • 在Windows系统访问一个网站(例Github.com)时,该网站会向Windows系统发送由第三方权威机构(CA)签署的网站证书。

    在这里插入图片描述

    • Windows系统则会验证该证书是否由CA颁发,若验证通过,则Windows系统与网站成功建立TLS链接。

    在这里插入图片描述

    • 为了方便下一次更快的访问,Windows将验证成功的证书放入内存中一块Certificate Cache(证书缓存)中。在下一次校验时,如果该证书存在于缓存中,则直接取缓存中的值进行校验。这里利用CVE-2020-0601。

    在这里插入图片描述

    • 在成功缓存证书数据后,根据下面描述的Windows证书缓存机制,恶意网站可以伪造虚假的网站(例github.com)证书且通过Windows验证,将自身伪装成合法网站。

    在这里插入图片描述

    • 当 Windows 接收到新的证书时,Windows 将新接收的证书与已缓存证书的证书的公钥进行遍历对比,寻找匹配的值。

    在这里插入图片描述

    • 伪造的恶意证书与Windows系统中的缓存证书有同样的公钥,但Curve项没有在校验范围内,所以可以通过构造自定义Curve来伪造证书。使得证书验证流程依然成立,但通过验证的证书已经不是之前成功验证的安全证书。

    在这里插入图片描述

    在第23篇文章中,我们将详细复现微软证书CVE-2020-0601漏洞。


    二.阮一峰老师告诉大家什么是数字签名

    参考文章:
    数字签名是什么? - 阮一峰
    What is a Digital Signature? - 原始网站

    写到这里,您可能还是很疑惑“什么是数字签名”?下面我通过阮一峰老师的博客进行讲解,个人认为这是一篇讲得比较清晰的原理文章,同时也包含了网络安全中加密解密、信息传输等知识。


    (1) 假设鲍勃有两把钥匙,一把是公钥,另一把是私钥。

    在这里插入图片描述

    (2) 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

    在这里插入图片描述

    (3) 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

    在这里插入图片描述

    (4) 鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

    在这里插入图片描述

    (5) 鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。

    在这里插入图片描述

    (6) 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。

    在这里插入图片描述

    (7) 鲍勃将这个签名,附在信件下面,一起发给苏珊。

    在这里插入图片描述

    (8) 苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

    在这里插入图片描述

    (9) 苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

    在这里插入图片描述

    (10) 复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

    在这里插入图片描述

    (11) 后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。

    在这里插入图片描述

    (12) 鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

    在这里插入图片描述

    (13) 苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。

    在这里插入图片描述

    (14) 下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。首先,客户端向服务器发出加密请求。

    在这里插入图片描述

    (15) 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

    在这里插入图片描述

    (16) 客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

    在这里插入图片描述

    (17) 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

    在这里插入图片描述

    (18) 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

    在这里插入图片描述

    在这里插入图片描述

    数字签名是为了保证数据完整性。通过它可以判断数据是否被篡改,私钥加密完的数据所有知道公钥的都可以解密,这样不安全。私钥加密的作用是为了确认身份,用对应的公钥解密摘要,则证明摘要来自谁,起到签名的作用。


    三.Signtool签名PE文件

    在这里插入图片描述

    该test.exe程序后续文章也会分享,均上传至Github。

    在这里插入图片描述


    第一步,通过makecert.exe生成需要的证书,生成两个文件分别是test.cer和test.PVK。

    cd SignTool
    makecert -$ "individual" -r /sv "test.PVK" /n "CN=Windows,E=microsoft,O=微软" test.cer
    

    在这里插入图片描述

    创建过程中需要输入私钥密码,这里设置为“123456789”。

    在这里插入图片描述


    第二步,查看证书信息,如果未信任需要点击“安装证书”。

    在这里插入图片描述

    安装并信任该证书。

    在这里插入图片描述


    第三步,利用signcode.exe工具进行数据签名,选择需要签名的“test.exe”程序。

    在这里插入图片描述


    第四步,自动选择自定义选项,然后点击从文件中选择test.cer文件,test.cer文件在第一个步骤你生成的目录中,然后下一步。

    在这里插入图片描述


    第五步,点击浏览按钮,添加文件test.PVK,test.PVK文件也是在第一步生成的目录中,点击下一步,哈希算法可以选md5,也可以选sha1,点击下一步。

    在这里插入图片描述


    第六步,默认点击下一步,出现数据描述框,自己可以填写,也可以不填。点击下一步。

    在这里插入图片描述


    第七步,填写时间戳服务器URL:http://timestamp.wosign.com/timestamp,也可以不选添加时间戳,点击下一步,完成,弹出签名成功框。

    在这里插入图片描述


    第八步,此时test.exe文件完成数字签名,打开该exe文件属性,如下图所示,可以看到签名相关信息。注意,该数字签名正常且颁发者为Windows。

    在这里插入图片描述

    最后我们使用PEView软件打开PE文件,可以看到签名前和签名后的结构存在“CERTIFICATE Table”区别。

    在这里插入图片描述

    下一篇文章我们将详细分析数字签名的结构。

    在这里插入图片描述



    四.总结

    文章写到这里,就介绍完毕,希望文章对您有所帮助。这篇文章主要讲解:

    • PE文件数字签名
    • 分享阮一峰老师的博客,告诉大家什么是数字签名
    • 结合SignTool工具对EXE文件进行签名

    作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢小伙伴和师傅们的教导。从网络安全到系统安全,从木马病毒到后门劫持,从恶意代码到溯源分析,从渗透工具到二进制工具,还有Python安全、顶会论文、黑客比赛和漏洞分享。未知攻焉知防,人生漫漫其路远兮,作为初学者,自己真是爬着前行,感谢很多人的帮助,继续爬着,继续加油!

    学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全和系统安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、实验室小伙伴的教导,深知自己很菜,得努力前行。编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。

    欢迎大家讨论,是否觉得这系列文章帮助到您!如果存在不足之处,还请海涵。任何建议都可以评论告知读者,共勉~

    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    (By:Eastmount 2021-02-07 星期天 凌晨夜于贵阳 http://blog.csdn.net/eastmount/ )


    参考文献:
    [1] 武大《软件安全》课程
    [2] (强推) [网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
    [3] (强推) 数字签名是什么? - 阮一峰
    [4] (强推) What is a Digital Signature? - 原始网站
    [5] (强推) 对Windows 平台下PE文件数字签名的一些研究 - DoveFeng
    [6] (强推) https://docs.microsoft.com/zh-cn/windows/win32/debug/pe-format
    [7] (强推) 哈希 HASH·数字签名 - Phant
    [8] (强推) 恶意文件分析系统中的数字签名验证 - 绿盟科技
    [8] (强推) [翻译]Windows PE文件中的数字签名格式 - 看雪银雁冰大神
    [9] PE文件数字签名工具 - ahuo
    [10] PE文件解析-异常处理表与数字签名 - zhyulo
    [11] Authenticode签名伪造——PE文件的签名伪造与签名验证劫持 - 嘶吼RoarTalk
    [12] 数字签名 - CTF Wiki
    [13] 数字签名算法介绍和区别 - infiniSign
    [14] [求助]关于PE文件的数字签名 - 看雪论坛
    [15] 区块链:数字签名是什么?- ChinaKingKong
    [16] 校验文件数字签名的合法性(VerifyPE) - ahuo
    [17] 数字签名 - shinymood
    [18] 恶意文件分析系统中的数字签名验证 - 百度文库
    [19] 如何判断一个文件是否已经有数字签名 - CSDN论坛


    展开全文
  • 数字签名技术

    千次阅读 2016-11-20 15:14:58
    电子签名数据电文中以电子形式含、附用于识别签名人身份并表明签名人认可其中内容的数据。通俗地说,电子签名就是通过密码技术对电子文档的电子形式的签名,并非是书面签名数字图像化,它类似于手写签名或...
    1.什么是电子签名
    电子签名数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。通俗地说,电子签名就是通过密码技术对电子文档的电子形式的签名,并非是书面签名的数字图像化,它类似于手写签名或印章,也可以说它就是电子印章。
    电子签名主要有三个作用:
    (1)证明文件的来源,即识别签名人;

    (2)表明签名人对文件内容的确认;

    (3)构成签名人对文件内容正确性和完整性负责的根据。与传统商务活动中的签名盖章作用相同,具有同样的法律效力。


    2.什么是数字签名
    数字签名只有信息的发送者才能产生,别人无法伪造的一段数字串,它同时也是对发送者发送的信息的真实性的一个证明。 ISO 7498-2标准对数字签名是这样定义的:附加在数据单元上的一些数据,或是对数据单元所做的密码变换,这种数据或变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(如接收者)伪造。
    数字签名是目前电子商务、电子政务中应用最普遍、技术最成熟、可操作性最强的一种电子签名方法。所谓"数字签名"就是通过某种密码运算生成一系列符号及代码组成电子密码进行签名,来代替书写签名或印章。它采用了规范化的程序和科学化的方法,用于鉴定签名人的身份以及对一项电子数据内容的认可。它还能验证出文件的原文在传输过程中有无变动,确保传输电子文件的完整性、真实性和不可抵赖性。


    3.数字签名的作用 
    1)信息传输的保密性
    交易中的商务信息均有保密的要求。如果信用卡的帐号和用户名被别人获悉,就可能被盗用:订货和付款的信息被竞争对手获悉,就可能丧失商机,因此在电子商务的信息传播中一般都有加密的要求。

    2)交易者身份的可鉴别性
    网上交易的双方很可能素昧平生,相隔千里。对于商家要确认客户端不是骗子,而客户也要相信网上的商店不是一个玩弄欺诈的黑店,因此能方便而可靠地确认对方的身份是网上交易的前提。为顾客或用户开展服务的银行、信用卡公司和销售商店,为了做到安全、保密、可靠地开展服务活动,都需要进行身份认证的工作。对有关的销售商店来说,他们不知道顾客的信用卡号码,只能把信用卡的确认工作完全交给银行来完成。银行和信用卡公司可以采用各种保密与识别方法来确认顾客的身份是否合法、确认订货和订货收据信息同时还要注意防止发生拒付款等问题。

    3)数据交换的完整性
    交易的文件是不能被修改的。举个例子,比如订购黄金。供货方在收到订单后,发现金价大幅上涨了,如果它能改动订单内容,将订购数1吨改为1克,则可大幅受益,而订货方就会因此而蒙受损失。因此电子交易文件也要做到不可修改,以保障交易的严肃性和公正性。

    4)发送信息的不可否认性
    由于商情的千变万化,交易一旦达成是不能被否认的。否则必然会损害一方的利益。再如订购黄金,订货时金价较低,但收到订单后,金价上涨了,如果供货方能否认收到订单的实际时间,甚至否认收到订单的事实,则订货方就会蒙受损失。因此电子交易通信过程的各个环节都必须是不可否认的。

    5)信息传递的不可重放性
    如在日常生活中,A向B借了钱,同时写了一张借条给B;当A还钱的时候,肯定要向B索回他写的借条撕毁,不然,恐怕他会再次挟借条要求A再次还钱。在数字签名中,如果采用了对签名报文添加流水号、时戳等技术,可以防止重放攻击。 


    4.数字签名的用途
    数字证书的用途很广泛,它可以用于方便快捷安全地发送电子邮件、访问安全站点、网上招标投标、网上签约、网上订购、网上公文的安全传送、网上办公、网上缴费、网上缴税、网上购物等安全电子事务处理和安全电子交易活动。
    在网络应用中,数字签名比手工签字更具优越性,数字签名是进行身份鉴别与网上安全交易的通用实施技术。当然,网络环境还有很多其他威胁,要由其他专门技术解决,如防火墙技术、反病毒技术、入侵检测技术等。在网络应用中,凡是要解决伪造、抵赖、冒充、篡改与身份鉴别的问题,都可运用数字签名来处理。 


    数字签名技术是结合消息摘要函数公钥加密算法的具体加密应用技术。数字签名(Digital Signature)指一个用自己的非对称密码算法(如:RSA算法)私钥加密后的信息摘要附在消息后面;别人得到这个数字签名及签名前的信息内容,使用该用户分发的非对称密码算法公钥,就可以检验签名前的信息内容在传输过程或分发过程中是否己被篡改并且可以确认发送者的身份。

    为了实现网络环境下的身份鉴别、数据完整性认证和抗否认的功能,数字签名应满足以下要求:
    (1)签名者发出签名的消息后,就不能再否认自己所签发的消息;
    (2)接收者能够确认或证实签名者的签名,但不能否认;
    (3)任何人都不能伪造签名;
    (4)第三方可以确认收发双方之间的消息传送,但不能伪造这一过程,这样,当通信的双方关于签名的真伪发生争执时,可由第三方来解决双方的争执。


    对于一个典型的数字签名体系而言,它必须包含2个重要的组成部分:即签名算法(Signature Algorithm)和验证算法(Verification Algorithm)。为了满足上述4点要求,数字签名体系必须满足2条基本假设:
    (1)签名密钥是安全的,只有其拥有者才能使用;
    (2)使用签名密钥是产生数字签名的唯一途径。

    1.发送方签名过程
    发送方A创建数字签名的过程如下:
    (1)为保证签名的速度,A先将原文进行单向HASH运算生成定长的消息摘要A 



    (2)利用自己的私钥加密消息摘要得到数字签名A,并将数字签名附在原消息后面 



    (3)通讯时用户A将自己的原文和签名文一起通过网络送给通讯对方即用户B 




    2.接收方验证过程
    接收方B接收到发送方A的签名消息后,对A的签名消息进行验证的过程如下:
    (1)将消息中的原消息与数字签名分离出来 




    (2)使用A的公钥解密数字签名得到摘要 




    (3)利用与发送方A相同的散列函数重新计算原消息的摘要 



    (4)比较解密后获得的消息摘要A与重新计算产生的消息摘要B,若相等则说明消息在传输过程中没有被篡改,否则消息不可靠。




    展开全文
  • 文章目录数字签名防止假冒防止篡改事后否认数字签名的漏洞中间人攻击 背景:A和B通信,X是中间人 数字签名   上一篇我们说到了消息认证码可以防止假冒和篡改,而无法防止事后否认,这里我们会讲解数字签名为什么...

    章节系列目录:点击跳转

    背景:A和B通信,X是中间人

    数字签名

      上一篇我们说到了消息认证码可以防止假冒和篡改,而无法防止事后否认,这里我们会讲解数字签名为什么能解决这个问题。

      当我们用私钥加密的时候,我们会把这个操作称为数字签名,利用公钥解密的时候,这个操作称为验证签名

    数字签名的方法流程是怎样的?

    我看到了这样一张图,觉得太香了,能够很好的说明这个过程。

    防止假冒

      中间人X假冒A给B发消息,由于X没有A的私钥,无法生成正确的数字签名。即使X不签名直接发过去,B也会直接丢弃,所以X无法假冒。

    防止篡改

    1.A给B发文档,先把文档进行哈希,生成摘要,然后用自己的私钥对摘要加密生成数字签名,发送出去的是 {明文文档,数字签名}
    2.如果中间人X去修改明文,不改数字签名,发送给B。(因为没A的私钥,X如果改了签名,B用A公钥就无法解密数字签名)
    3.B用A的公钥去解密数字签名得到摘要1,再用同样的哈希算法把发来的明文进行哈希,得到一段摘要2
    4.摘要1一定是A亲手给的,因为公钥能解出来,摘要2是对明文哈希算出来的。
    5.如果摘要1和摘要2对比不一样,那么这明文肯定是被篡改了。

    事后否认

      当A要发送给B消息,会生成非对称密钥对,用A的私钥加密的东西只能用A的公钥解密,那么用A的公钥能解密的东西,只可能是A的私钥加密的了,就相当于A进行了签名,赖不掉的。当然需要数字证书才能真正安全,如果被中间人攻击了还防止事后否认,那可就是给自己挖坑,后面章节我们会讲解数字证书。

    RSA生成和验证签名的过程

    RSA生成签名

      在RSA中,被签名的消息、密钥以及最终生成的签名都是以数字形式表示的。在对文本进行签名时,需要事先将文本编码成数字。用RSA生成签名的过程可用下列公式来表述:

    消息摘要 = hash(消息)
    签名 = 消息摘要D mod N (用RSA生成签名)
    这里的 {D, N} 就是签名者的私钥

    RSA验证签名

    验签解密的消息摘要 = 签名E mod N (用RSA验证签名)
    由明文计算的消息摘要 = hash(明文消息)
    这里 {E, N} 就是签名者的公钥。

    if (验签解密的消息摘要 == 由明文计算的消息摘要)
        验证签名成功
    else 
        验证签名失败
    

    RSA签名和验证举例

      下面通过具体数字,用RSA实际生成和验证签名。

      先生成密钥对:
      公钥:E=5;N=323,即公钥 = {5, 323}
      私钥:D=29;N=323,即私钥 = {29, 323}
      假设消息摘要=hash(消息)=123
    生成签名

    签名 = 消息摘要D mod N
       = 12329 mod 323
       = 157
    所以签名是157

    验证签名:

    验签解密的消息摘要 = 签名E mod N
                 = 1575 mod 323
                 = 123
    所以验签解密的消息摘要是123

      如果消息没被篡改,那么由明文计算的消息摘要=hash(消息)=123

      验签解密的消息摘要=由明文计算的消息摘要,所以验证签名成功。这个明文消息就是由正确的发送者发来的。

    为什么要加密摘要而不直接加密消息?

    解决非对称密码处理速度慢的问题

      假如这个消息是一个很大的视频呢?非对称加解密本身就慢,大的视频更是难以操作,直接私钥加密消息得出来的数字签名非常大,而消息的哈希只是一串长度很有限的16进制数值,所以只加密消息的哈希而不是整个消息本身。如果你想检测签名是否有效,可以解密验证签名并自己对消息进行哈希转换(生成摘要),看看这两个值(摘要)是否匹配,这样我们就知道所接收的消息与服务器发送是否完全一样。如果消息在传输中被更改了,则哈希与服务器作为签名提供的值(摘要)不匹配,这叫做无效签名。

    注意:一般来说,在采用具备同等机密性的密钥长度的情况下,非对称密码的处理速度只有对称密码的几百分之一。

    防止利用数字签名攻击公钥密码

      这个话题怎么理解呢?假如有个中间人X有点low,在A和B通信过程中没法替换掉他们持有的对方的公钥,此时X想出了一招空手套白狼的方法。

      A想给B发送消息,然后用B的公钥加密发送给B,结果被中间人X拦截,然后X将这个密文消息作为附件发送给B,告诉B帮忙对此进行签名,实际上签名就是私钥密码的运算,相当于把A发给B的消息解密了。这样X就获取到了A发送给B的密文消息。

      我们不要对来历不明的消息进行签名,尤其是看起来像是随机数据的消息。

      所以我们对消息摘要进行签名会比较安全,不直接对消息签名也是避免了这种安全问题。

    数字签名的漏洞

    中间人攻击

    A给B发消息会使用非对称加密,为了接下来的对话,先要把公钥发送给B,结果被X中间人攻击了。
    A:“我是A,这是我的公钥key_pubA,你收好” ----->B
    X截获了这个请求,修改一下:“我是A,这是我的公钥key_pubX,你收好” ----->B
    接着A发消息时用A的私钥签名,X截获后随便篡改别的信息再自己生成签名,而B拿着所谓的"A的公钥" key_pubX,B验证签名也不会有问题。
    A找B借钱1000到A账户,结果被X修改为借钱5000到X账户,B验证签名没问题。
    这样防止事后否认的特性给A挖了个大坑。

      中间人攻击的详细过程及示意图已在第三章讲解混合加密时已经说过了,如不理解,请返回看图。传送门

      从上面我们可以看到,要防止中间人攻击,就必须确认自己拿到的公钥是否真的属于自己的通信对象。那么应该怎么解决这个问题?就是数字证书 。下一章给大家讲解数字证书。


    关注、留言,我们一起学习。

    ----------------------Talk is cheap, show me the code-----------------------
    展开全文
  • 数字签名的应用过程是,数据发送方使用自己的私钥对数据校验和或其他与数据内容有关的变量进行加密处理,完成对数据的合法“签名”,数据接收方则利用对方的公钥来解读收到的“数字签名”,并将解读结果用于对数据...
  • 数字签名

    千次阅读 2020-10-28 16:16:56
    数字签名是一种将相当于现实世界中的盖章、签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。 通过消息认证码,我们可以识别消息是否被篡改或者发送者身份是否被伪装,也...
  • 数字签名:公钥数字签名,只有信息的发送者才能产生别人无法伪造的一段数字串,类似于合同上的签名。 一、安全通讯需特征: 机密性,完整性,端点鉴别 1.机密性 简单来说就是只有发送方和希望接受方能看到文件的...
  • 数字签名基础

    2018-06-08 14:13:21
    其中数字签名是个加密的过程,数字签名验证是个解密的过程。其原理首先要理解非对称加密和消息摘要。 非对称加密中公钥是公开的,如果用公钥解密,只能开解对应私钥加密的内容,因此,私钥也可以认为是个人身份的...
  • RSA数据摘要+数字签名(Java)

    千次阅读 2018-10-17 15:48:46
    其实,A的私钥主要是A用来签名的,签名顾名思义是表明这个东西是A发送的,而不是别人发过来的。为什么A用自己的私钥签名就说明这个东西就是A发过来的呢?因为用B用A的公钥解签的时候,得到了原文的数据摘要,然后B...
  • 数字签名的过程详解

    千次阅读 2020-06-07 16:21:38
    数字签名的过程详解1. 数字证书的概念2. 数字签名的过程3. 加密的过程4. 数字签名两大特性5. 用到的部分名词解释 1. 数字证书的概念 数字证书又叫“数字身份证”、“网络身份证”,是由证书认证中心CA发放并经认证...
  • 数字签名和数字证书的区别与联系

    千次阅读 多人点赞 2019-04-30 11:57:42
    前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应。签章有法律效应必须满足两个条件: 能够证明签名,盖章者是谁,无法抵赖 ...两个重要的概念就是数字签...
  • 数字签名(digital signature)技术介绍

    万次阅读 2018-06-19 20:49:16
    本文主要介绍数字签名(digital signature)...数字签名,就是只有信息的发送者才能产生的、别人无法伪造的一段数字串,这段数字串是对信息发送所发送信息真实性的一个有效证明。 数字签名是非对称密钥加密技术与数
  • 数字签名和验签

    2019-09-27 16:15:33
    数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串标明这段信息是发送发送的。 数字签名是非对称密钥加密技术与数字摘要技术的应用。 数字签名的作用: 保证信息传输的完整性(数字摘要...
  • 哈希函数和数字签名

    2021-09-13 18:54:27
    目录1 哈希函数 Hash1.1 构造方法1.2 哈希函数在密码学的应用2 数字签名2.1 签名--认证流程2.2 一个生动形象的例子 在讲数字前面以前,我们先要了解一下哈希函数 1 哈希函数 Hash Hash,一般翻译做散列、杂凑,或...
  • PKI - 数字签名、CA
  • 数字签名的应用实例

    千次阅读 2018-09-24 20:30:53
    在这样的情况下,就可以使用数字签名,即该组织可以对警告信息的文件施加数字签名,这样一来世界上所有人就都可以验证警告信息的发布者是否合法。 消息发布的目的是尽量让更多的人知道,因此我们没有必要对信息进行...
  • 数字签名的攻击

    千次阅读 2018-09-24 20:33:49
    数字签名的中间人攻击,具体来说就是主动攻击者Mallory介入发送者和接收者的中间,对发送者伪装成接受者,对接收者伪装成发送者,从而能够在无需破解数字签名算法的前提下完成攻击。 要防止中间人攻击,就需要...
  • 数字签名原理及其应用

    万次阅读 多人点赞 2017-06-25 15:40:34
    签名的作用无非就是证明某个文件上的内容确实是我写的/我认同的,别人不能冒充我的签名(不可伪造),我也不能否认上面的签名是我的(不可抵赖)。 我们知道,手写签名之所以不能伪造,是因为每一个人的...而数字签名
  • android中的数字签名技术

    千次阅读 2018-06-04 16:30:05
    数字签名利用非对称加密技术和消息摘要技术来保证信息的安全可靠。发送方需要提供签名文件和CA证书,接收者才可以解密出对应的数据。数字证书同样也可以认为是一个数字签名,只不过签名的内容是消息发送方的公钥。...
  • 前言 这本是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视频。 在一旁玩手机的女朋友突然问”你知道数字证书是来干啥的不,为啥浏览器提示证书不可信?...什么是数字签名数字签名的作
  • 数字签名算法实现

    2021-04-22 19:20:12
    一、实验目的   掌握利用Hash算法对要传送信息提取消息摘要的方法,理解数字...数字签名目前采用较多的是非对称加密技术,其实现原理简单的说,就是由发送利用Hash算法对要传送的信息进行计算得到一个固定位数的消.
  • 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应。签章有法律效应必须满足两个条件: 能够证明签名,盖章者是谁,无法...两个重要的概念就是数字签名和数...
  • 区块链技术系列(1) - 数字签名

    千次阅读 2018-09-02 07:42:19
    这些电子数据显然无法人工签名,数字签名就孕育而生。本文将介绍什么是数字签名数字签名的特性与相关技术。 对于区块链方面多技术,我还是建议大家多看英文文档,多利用Google来搜索技术文章。 怎么搭建自...
  • 搞懂 数字签名技术

    2021-01-22 10:25:06
    数字签名(Digital Signature,电子签名,公钥数字签名利用电子信息加密技术实现在网络传送信息报文时,附加一个特殊的唯一代表发送者个人身份信息的标记,表示确认、经手、真实 这个标记是只有信息的发送者才能...
  • 数字签名工作原理

    万次阅读 2017-09-25 08:27:55
    数字签名是指发送方用自己的私钥对数字指纹进行加密后所得的数据,其中包括非对称密钥加密和数字签名两个过程,在可以给数据加密的同时,也可用于接收方验证发送方身份的合法性。采用数字签名时,接收方需要使用发送...
  • 数字签名是什么?

    千次阅读 2015-02-28 09:10:45
    数字签名是什么? 作者:David Youd 翻译:阮一峰 http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
  • 数字签名基本概念

    千次阅读 2016-07-31 21:21:26
    1. 概念:数字签名是一种以电子形式存在于数据信息之中的,或作为其附件或逻辑上有联系的数据,可用于辨别数据签署人的身份,并表名签署人对数据信息中包含的信息的认可技术 2. 一个完善的数字签名应该包含以下三...
  • 数字签名FAQ

    2018-09-24 20:29:38
    一 密文为什么能作为签名使用 ...数字签名利用了“没有私钥的人事实上无法生成使用该私钥生成的密文”这一性质来实现的。这里生成的密文并非用于保证机密性,而是用于代表一种只有持有该密钥...
  • 数字签名技术简介

    千次阅读 2017-07-27 18:44:11
    笔记小结 知识点1. 非对称密钥加密技术 ... 公钥和私钥是一对,公钥加密的数据必须用对应... 简单的来说:数字摘要就是采用单向的Hash函数,将明文摘要成128bit的数字指纹(密文),不同的明文摘要密文结果不同,相同的明文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,792
精华内容 14,316
关键字:

发送数字签名数据所利用的是