第8章 _ppt.txt

大学电子商务的应用开发技术-席宁华-课件PPT

收藏

资源目录
跳过导航链接。
压缩包内文档预览:
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:21836196    类型:共享资源    大小:12.82MB    格式:ZIP    上传时间:2019-09-06 上传人:QQ24****1780 IP属地:浙江
25
积分
关 键 词:
大学 电子商务 应用 利用 运用 开发 技术 席宁华 课件 ppt
资源描述:
大学电子商务的应用开发技术-席宁华-课件PPT,大学,电子商务,应用,利用,运用,开发,技术,席宁华,课件,ppt
内容简介:
第八章网络安全开发技术对外经济贸易大学信息学院第八章网络安全开发技术第一节网络安全开发技术概述第二节.消息的完整性实现第三节.对称加密消息实现 第四节.非对称加密消息实现第五节.数字签名编程实现第六节.数字证书编程实现第一节 概述电子商务是基于互联网的一种新型商业模式,和客观世界中的商务活动一样,电子商务一样可能面临泄密和欺诈行为。特别在开放的互联网上进行交易,如何安全地进行网上交易,完成网上支付,保证网上数据传输的准确无误,使得商业秘密不被窃取和破坏,日益显得尤为重要。概括起来,进行电子商务交易的企业所面临的主要安全问题有:机密性:为防止信息被非授权的人窃听,需要保证电子商务中涉及的大量机密信息在本地存储和在网络的传输过程中不被窃取。认证:在电子商务活动中,需要对双方进行认证,以保证交易双方身份的正确性。确保要进行交易的贸易方的真实身份确实与对方宣称的身份一致,是保证电子商务顺利进行的关键之一。完整性:要防止信息的丢失、伪造、篡改、删除和传送次序的混乱,保证电子商务中所传输的交易信息不被中途篡改及通过重复发送进行虚假交易等。不可否认性:在电子商务的交易完成后,要保证交易的任何一方无法否认已发生的交易。针对这些安全问题,加密/解密技术、消息认证(Message Authentication)技术、数字签名技术和数字证书技术被提出来,通过它们及其组合可以增强电子商务的安全性。 1.加密/解密 所谓数据加密就是通过对原始的文件或数据(称为明文)用某种算法进行处理,使其转变为对未经授权的读者而言不可理解的一段信息(称为密文),这段转变后的信息只能在输入相应的密钥之后才能显示出其本来的内容。通过这样的途径来达到保护数据不被未经授权者窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。 根据加密和解密时使用的密钥是否是同一个来区分,加密技术一般分为对称加密技术(私钥加密技术)和非对称加密技术(公钥加密技术),在对称加密中,加密和解密使用同一个密钥,而非对称加密在加密和解密时使用不同的密钥。采用非对称加密技术时,分别使用两个密钥,一个称为公钥(公开密钥),另一个称为私钥(私有密钥)。被公钥加密的消息,能且仅能采用私钥对其解密,反之亦然,故它们构成一个密钥对。一般公钥对外发布,而私钥自己保留。 利用非对称加密技术是目前相对较安全的加密技术。比如:发送方用自己拥有的、接收方的公钥对原文进行加密,接收方收到发送方的密文后,用自己的私钥能够进行解密。按照非对称加密技术的非对称特性,发送方的密文是用接收方的公钥加密生成的,只有接收方的私钥才能解密。而在整个网络中只有接收方一个人拥有其自己的私钥,任何他人都不拥有接收方的私钥,因而即使他人截获了这段密文,他也是无法将其解密的。 电子商务活动中的大量电子信息在网络上传输的时候,都需要保证信息的机密性,这时,加密技术起到关键作用。另外,加密技术是其它安全技术的基础,很多其它安全技术都是以加密技术为基础的,比如后面提到的数字签名等。2.消息认证 消息认证(也有称作报文认证)是用来校验所接收的消息是否来自所宣称的发送方,并且该消息没有被篡改的技术。消息认证用来解决网络传输中的信息伪装、内容篡改、插入删除和消息顺序的改变等非法攻击等。 在消息认证中,一般需要先根据消息本身经过计算生成消息认证部分(Authenticator),消息认证部分可被用来认证消息。单向散列是一种常用的生成消息认证部分的技术。在消息认证部分生成之后,通过认证协议使得接收者可以利用消息认证部分来校验消息的真实性。下面提及的数字签名也是一种消息认证技术,它可以使得交易的双方不可抵赖自己所承诺的交易。 在电子商务活动中,通过消息认证算法和认证协议,如果发生发送方所传输的交易信息被伪装、篡改、插入和删除,以及交易信息顺序被改变等情况,都可以被接收方发现,这样可以保证信息的完整性,防止电子商务活动中恶意的破坏活动。 3.数字签名 客观世界中,书信或文件是根据亲笔签名或者印玺来证明其真实性。在计算机网络中,被传送报文的签名者身份的标识是由数字签名技术来完成的。数字签名利用一套规则和一个参数对所要签名的数据进行计算,计算的结果能够确认签名者的身份和数据的完整性。 利用非对称加密技术一方面可以用于加密,另一方面,以其公钥/私钥这一对密钥对为基础还可以用于数字签名,在用作数字签名的时候,使用私钥对信息进行加密,公钥用于解密,即发送方在向接收方发送信息时,发送方用自己的私钥加密信息,然后将密文传送给接收方,接收方用发送方的公钥进行解密。该私钥只有其对应的公钥才能解密,由于在网络中只有发送方持有自己的私钥,如果接收方用发送方的公钥解密成功,就证明这段密文只能是由发送方发出的。所以,利用非对称加密技术可以唯一地确定发送方的身份。 通过数字签名,接收方能够核实发送方对信息的签名,发送方事后不能抵赖对报文的签名,接收方和其它人由于没有发送方的私钥,也就不能伪造对信息的签名。 4.数字证书 加密、解密和数字签名会涉及到公钥/私钥这一对密钥对的使用,非对称加密技术要求把公钥向相关的通讯对象进行分发,以便通信相关方使用它来进行安全的通信,但是在公钥的分发过程中经常会发生问题。比如某人与多人通信,这个人会拥有其他多人的公钥。他可能使用别人的公钥来冒充他人,甚至伪造公钥来达到不可告人的目的。当网络规模较大、用户群很大的时候还会出现更多的问题。数字证书正是解决这个问题的有效方法。 数字证书是一段包含用户身份信息、用户公钥信息以及证书认证中心(CA)数字签名的文件,它由证书认证中心管理。认证中心作为权威的、可信赖的、公正的第三方机构,专门负责为各种认证需求提供数字证书服务,它的数字签名可以确保证书信息的真实性。 网上为安全传输信息,传输前传输的双方首先互相交换证书,验证彼此的身份;然后,发送方利用证书中的加密密钥和签名密钥对要传输的数字信息进行加密和签名,这就保证了只有合法的用户才能接收该信息,同时保证了传输信息的机密性、真实性、完整性和不可否认性。从而保证网上信息的安全传输。比如,用户可以通过认证中心获得用户的公开密钥。当用户向认证中心申请获得用户的公开密钥的时候,认证中心会发送一个数字证书给用户,用户通过对数字证书的分析可以确认用户的公开密钥的合法性,并获得其它有关信息,这样用户就可以使用用户的公匙和用户进行安全的通信。另外,用户可以使用自己的私匙对信息进行签名,有了签名,就不可对自己的行为进行否认。 第八章网络安全开发技术第一节网络安全开发技术概述第二节.消息的完整性实现第三节.对称加密消息实现 第四节.非对称加密消息实现第五节.数字签名编程实现第六节.数字证书编程实现第二节 消息的完整性实现 消息摘要技术可以确保消息的完整性,它通过获取消息作为输入并生成输出数据块,该数据块被认为是消息的指纹。消息中即使有很小的变化(如更改和删除)都将引起指纹的显著变化。消息摘要一般通过摘要函数生成,摘要函数是单向函数,使用摘要函数从消息生成指纹很容易,但通过指纹来还原消息却很难。散列法是生成消息摘要常用的算法。 目前广泛使用的算法有MD4、MD5、SHA-1,JDK1.5对上面这几个都提供了支持。MD4 和 MD5都是 128 位算法 ,SHA-1 是 160 位算法。在Java中进行消息摘要很简单,因为它的 java.security.MessageDigest类提供了一个简易的操作方法:下面我们介绍如何通过这些相关的算法、类和方法来保证消息的完整性。 1.相关类及其方法 java.security.MessageDigest类该类用于支持消息摘要,下面是其主要方法:static getInstance(String algorithm) 该方法用于返回一个MessageDigest对象,它实现指定的算法。 参数:算法名,如 SHA-1 或MD5多个update方法 这些方法用于添加要进行计算摘要的信息,具体有以下几个方法。 void update (byte input) /计算单字节摘要。 void update (byte input) /计算数组摘要。 void update(byte input, int offset, int len) /计算数组指定位置的信息的 摘要。byte digest() 该方法完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)。void reset() 该方法实现复位。static boolean isEqual(byte digesta, byte digestb) 该方法用于比效两个摘要是否相同。 2.编程步骤 指定散列算法 首先创建一个MessageDigest类的对象,通过参数指定散列算法。 java.security.MessageDigest alga=java.security.MessageDigest.getInstance(SHA-1);添加要进行计算摘要的信息 alga.update(msg.getBytes(); /其中msg为原始信息计算出摘要 byte dig=alga.digest(); /dig存放返回的摘要数据块 将信息和摘要发送给其他人(程序),其他人(程序)用相同的方法初始化,添加信息,最后进行比较摘要是否相同 java.security.MessageDigest alga=java.security.MessageDigest.getInstance(SHA-1); alga.update(msg.getBytes(); algb.isEqual(dig, algb.digest() 其中:msg是从发送方获得的原始信息,而dig是从发送方获得的摘要信息。algb.digest()是接收方自己计算的摘要信息,isEqual是比较从发送方获得的摘要信息和接收方自己计算的摘要信息是否相同,如果不同,说明信息完整性受到破坏。 3.消息摘要示例 下面,举出一个例子来说明如何在一个程序中模拟消息摘要,保证完整性。其中:类MyDigest提供了计算摘要和验证摘要的方法,使用SHA-1算法。类testMyDigest使用MyDigest类提供的方法完成消息摘要的生成和验证。以下是testMyDigest.java文件的源代码,其中一个文件中包括2个类。 testMyDigest.java文件的源代码:import java.security.*;public class testMyDigest public static void main(String args) MyDigest my=new MyDigest(); byte digesta; String myinfo=This is a test string.; /生成摘要 digesta=my.getDigest(myinfo); /通过某方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常 /验证摘要 boolean end=my.checkDigest(myinfo,digesta); if(end) System.out.println(信息检查正常); else System.out.println(摘要不相同); class MyDigest public byte getDigest( String myinfo) byte digesta=null; try MessageDigest alga=MessageDigest.getInstance(SHA-1); alga.update(myinfo.getBytes(); digesta=alga.digest(); System.out.println(本信息摘要是:+byte2hex(digesta); return digesta; catch (java.security.NoSuchAlgorithmException ex) System.out.println(非法摘要算法); return null; public boolean checkDigest( String myinfo,byte digesta) try MessageDigest algb=MessageDigest.getInstance(SHA-1); algb.update(myinfo.getBytes(); return algb.isEqual(digesta,algb.digest() ; catch (java.security.NoSuchAlgorithmException ex) System.out.println(非法摘要算法); return false; public String byte2hex(byte b) /二行制转字符串 String hs=; String stmp=; for (int n=0;nb.length;n+) stmp=(java.lang.Integer.toHexString(bn & 0XFF); if (stmp.length()=1) hs=hs+0+stmp; else hs=hs+stmp; if (n oldMD.length) System.out.println( Signature failed, length error); System.exit(1); for (int i = 0; i len; +i) if (oldMDi != newMDi) System.out.println( Signature failed, element error ); System.exit(1); System.out.println( Signature verified ); 3.数字签名示例2 该例使用 Java 语言对签名的直接支持,它使用RSA私钥对来对消息摘要签名,然后使用公钥验证。import java.security.Signature;import java.security.KeyPairGenerator;import java.security.KeyPair;import java.security.SignatureException;public class DigitalSignature2Example public static void main(String args) throws Exceptionif(args.length!=1)System.err.println(Usage:java DigitalSignature2Example );System.exit(1);byte plainText=args0.getBytes(UTF8);/形成RSA公钥对System.out.println(nStart generating RSA key);KeyPairGenerator keyGen=KeyPairGenerator.getInstance(RSA);keyGen.initialize(1024);KeyPair key=keyGen.generateKeyPair();System.out.println(Finish generating RSA key);/使用私钥签名Signature sig=Signature.getInstance(SHA1WithRSA);sig.initSign(key.getPrivate();sig.update(plainText);byte signature=sig.sign();System.out.println(sig.getProvider().getInfo();System.out.println(nSignature:);System.out.println(new String(signature,UTF8);/使用公钥验证System.out.println(nStart signature verification);sig.initVerify(key.getPublic();sig.update(plainText);tryif(sig.verify(signature)System.out.println(Signature verified);else System.out.println(Signature failed);catch(SignatureException e)System.out.println(Signature failed); 4.数字签名示例3 对于一个用户来讲,首先要生成他的密钥对,并且分别保存。下面对生成一个密钥对的实例KeyPairGenerator进行解释。开始的代码首先是下面的代码:java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance(DSA);初始化如果设定随机数发生器,可采用如下代码初始化:SecureRandom secrand=new SecureRandom();secrand.setSeed(tttt.getBytes(); /初始化随机数发生器keygen.initialize(512,secrand); /初始化密钥生成器否则用如下代码:keygen.initialize(512);生成密钥生成密钥公钥pubkey和私钥prikey可采用如下代码:KeyPair keys=keygen.generateKeyPair(); /生成密钥对PublicKey pubkey=keys.getPublic();PrivateKey prikey=keys.getPrivate();保存密钥对需要把密钥对分别保存在myprikey.dat和mypubkey.dat中,以便下次不再生成,生成密钥对的时间比较长。其代码如下:java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(myprikey.dat);out.writeObject(prikey);out.close();out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(mypubkey.dat);out.writeObject(pubkey);out.close();用其私人密钥(prikey)对他所确认的信息(info)进行数字签名产生一个签名数组。从文件中读入私人密钥(prikey):java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(myprikey.dat);PrivateKey myprikey=(PrivateKey)in.readObject();in.close();初始化和签名初始化一个Signature对象,并用私钥对信息签名:java.security.Signature signet=java.security.Signature.getInstance(DSA);signet.initSign(myprikey);signet.update(myinfo.getBytes();byte signed=signet.sign();保存信息和签名把信息和签名保存在一个文件(myinfo.dat)中:java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(myinfo.dat);out.writeObject(myinfo);out.writeObject(signed);out.close();分发信息和签名发送者将其公钥的信息和签名分发给其它用户,其他用户用发送者的公共密钥(pubkey)和签名(signed)对信息(info)进行验证,判断所接收到的信息是否确实是发送者发出的。读入公钥:java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(mypubkey.dat);PublicKey pubkey=(PublicKey)in.readObject();in.close();读入签名和信息:in=new java.io.ObjectInputStream(new java.io.FileInputStream(myinfo.dat);String info=(String)in.readObject();byte signed=(byte)in.readObject();in.close();验证初始化一个Signature对象,并用公钥和签名进行验证:java.security.Signature signetcheck=java.security.Signature.getInstance(DSA);signetcheck.initVerify(pubkey);signetcheck.update(info.getBytes();if (signetcheck.verify(signed) System.out.println(签名正常);保存密钥文本如果密钥的保存文本是用对象流的方式保存和传送的,也可以用编码的方式保存:import java.security.spec.*import java.security.*具休说明如下:如果public key是用X.509编码的,例码如下:byte bobEncodedPubKey=mypublic.getEncoded(); /生成编码/传送二进制编码/以下代码转换编码为相应key对象X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);KeyFactory keyFactory = KeyFactory.getInstance(DSA);PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);如果Private key是用PKCS#8编码的,例码如下::byte bPKCS=myprikey.getEncoded();/传送二进制编码/以下代码转换编码为相应key对象PKCS8EncodedKeySpec priPKCS8=new PKCS8EncodedKeySpec(bPKCS);KeyFactory keyf=KeyFactory.getInstance(DSA);PrivateKey otherprikey=keyf.generatePrivate(priPKCS8);5.完整的代码 import java.security.*;import java.security.spec.*;public class testdsa public static void main(String args) throws java.security.NoSuchAlgorithmException,java.lang.Exception testdsa my=new testdsa();my.run();public void run()/数字签名生成密钥/第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地/而mypubkey.dat给发布给其它用户if (new java.io.File(myprikey.dat).exists()=false) if (generatekey()=false) System.out.println(生成密钥对败);return;/第二步,此用户/从文件中读入私钥,对一个字符串进行签名后保存在一个文件(myinfo.dat)中/并且再把myinfo.dat发送出去/为了方便数字签名也放进了myifno.dat文件中,当然也可分别发送try java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(myprikey.dat);PrivateKey myprikey=(PrivateKey)in.readObject();in.close();/ java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);/java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpecString myinfo=这是我的信息; /要签名的信息/用私钥对信息生成数字签名java.security.Signature signet=java.security.Signature.getInstance(DSA);signet.initSign(myprikey);signet.update(myinfo.getBytes();byte signed=signet.sign(); /对信息的数字签名System.out.println(signed(签名内容)=+byte2hex(signed);/把信息和数字签名保存在一个文件中java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(myinfo.dat);out.writeObject(myinfo);out.writeObject(signed);out.close();System.out.println(签名并生成文件成功);catch (java.lang.Exception e) e.printStackTrace();System.out.println(签名并生成文件失败);/第三步/其他人通过公共方式得到此户的公钥和文件/其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息./try java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(mypubkey.dat);PublicKey pubkey=(PublicKey)in.readObject();in.close();System.out.println(pubkey.getFormat();in=new java.io.ObjectInputStream(new java.io.FileInputStream(myinfo.dat);String info=(String)in.readObject();byte signed=(byte)in.readObject();in.close();java.security.Signature signetcheck=java.security.Signature.getInstance(DSA);signetcheck.initVerify(pubkey);signetcheck.update(info.getBytes();if (signetcheck.verify(signed) System.out.println(info=+info);System.out.println(签名正常);else System.out.println(非签名正常);catch (java.lang.Exception e) e.printStackTrace();/生成一对文件myprikey.dat和mypubkey.dat-私钥和公钥,/公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地public boolean generatekey()try java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance(DSA);/ SecureRandom secrand=new SecureRandom();/ secrand.setSeed(tttt.getBytes(); /初始化随机数发生器/ keygen.initialize(576,secrand); /初始化密钥生成器keygen.initialize(512);KeyPair keys=keygen.genKeyPair();/ KeyPair keys=keygen.generateKeyPair(); /生成密钥组PublicKey pubkey=keys.getPublic();PrivateKey prikey=keys.getPrivate();java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(myprikey.dat);out.writeObject(prikey);out.close();System.out.println(写入对象 prikeys ok);out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(mypubkey.dat);out.writeObject(pubkey);out.close();System.out.println(写入对象 pubkeys ok);System.out.println(生成密钥对成功);return true;catch (java.lang.Exception e) e.printStackTrace();System.out.println(生成密钥对失败);return false;public String byte2hex(byte b)String hs=;String stmp=;for (int n=0;nb.length;n+)stmp=(java.lang.Integer.toHexString(bn & 0XFF);if (stmp.length()=1) hs=hs+0+stmp;else hs=hs+stmp;if (nb.length-1) hs=hs+:;return hs.toUpperCase();数字证书编程实现 数字证书是确定消息发送方身份的另一个技术手段,数字证书将一个身份标识连同公钥一起进行封装,并由称为认证中心或 CA 的第三方进行数字签名,以保证彼此的身份是可信赖的。 (1) Java平台对数字证书的支持 Java平台提供了密钥库(keystore)、管理工具(keytool)以及一些用于构建和验证证书路径的类和函数,JDK 支持 X.509 数字证书标准。密钥库 从物理上讲,密钥库是缺省名称为 .keystore 的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护,可以选择让每个别名密码与主密钥库密码匹配。 管理工具Java 平台使用 keytool 来操作密钥库。这个工具提供了许多选项。下面的示例(keytool 示例)演示了生成公钥对和相应的证书、以及通过查询密钥库查看结果的基本方法。可以用 keytool 将密钥以 X.509 格式导出到文件中,由认证中心对该文件签名,然后将其重新导入到密钥库中。特殊密钥库还有一个用来保存认证中心(或其它可信的第三方)证书的特殊密钥库,它又包含了用于验证其它证书有效性的公钥。这个密钥库称为 truststore。Java 语言在名为 cacerts 的文件中提供了缺省的 truststore。如果搜索这个文件名,就会发现至少两个这样的文件。可以使用下列命令显示其内容:keytool -list -keystore cacerts Use a password of changeit2. keytool 示例本示例使用缺省密钥库 .key
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:大学电子商务的应用开发技术-席宁华-课件PPT
链接地址:https://www.renrendoc.com/p-21836196.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!