问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

接口测试中的加密算法如何实现?

发布网友 发布时间:2022-04-20 07:39

我来回答

2个回答

热心网友 时间:2023-05-22 19:38

关于如何去实现Provider,官方文档中有详细的说明。
请参照:http://download.oracle.com/javase/6/docs/technotes/guides/security/crypto/HowToImplAProvider.html#Steps

热心网友 时间:2023-05-22 19:38

在Java的安全包中,包括了三部分内容:
1、JCA/JCE(Java Cryptography Architecture & JavaCryptography Extensions)
2、JSSE( Java Secure-Sockets Extension)
3、JAAS( Java Authentication & AuhorizationService)

在这里,将仅介绍加解密的实现。

Java 中的加解密的实现,是由JCA(Java Cryptography Architecture) 和JCE(Java Cryptography Extension)共同组成。 在JDK1.4之前,相关的包需要单独下载和安装。现在,Java加密扩展(JCE)已经成为Java SDK 1.4的核心组成部分。JCE是一组提供了加密框架并实现了一些加密,密钥生成算法和协议,消息认证码(MAC)等算法的Java包。

什么是Provider?
JCA/JCE并不执行各种算法,它们只是连接应用和实际算法实现程序的一组接口。软件开发商根据JCE接口,将各种算法实现后,打包成一个Provider,可以动态地加到Java运行环境中。由于美国出口控制规定,JCA是可出口的(JCA和一个Sun的默认实现包括在Java2中),但是JCE对部分国家是*出口的。因此,要实现一个完整的安全结构,就需要一个或多个第三方厂商提供的JCE产品,称为安全提供者(Provider)。Provider是特定加密算法的实现者,有的供应商提供的加密技术是免费的,有的不免费。这些厂商有IBM,Bouncy Castle和RSA。Sun也给出了实现自己的Provider时需要遵循一些约定。

在低版本JDK上JCE的安装
1.静态安装
在安装和使用JCE之前,你需要从 Sun Web site(这里是以暗中sun的提供者为例)获得安装包。JCE中已经办函Sun自己的安全Provider - SunJCE,为了把SunJCE静态的安装到默认的Provider列表中,你需要修改安全属性文件:
? <java-home>\jre\lib\security\java.security (Win32)
? <java-home>/jre/lib/security/java.security (UNIX)
假如你把JDK安装在C:\jdk1.3,你需要编辑以下文件:
C:\jdk1.3\jre\lib\security\java.security
为了安装SunJCE,你需要在以上文件中加入:
security.provider.n=com.sun.crypto.provider.SunJCE
把n用你加入的提供者的优先级代替(注意:序号要保持递增,不能跳过,但可以调整前后顺序)。
代码A,用于查看你安装过的提供者的信息,结果在显示清单B中列出,显示Provider的能力,比如说可用的加密算法。
代码A: ProviderInformation.java
import java.security.Provider;
import java.security.Security;
import java.util.Set;
import java.util.Iterator;
public class ProviderInformation {
public static void main(String[] args) {
Provider[] providers = Security.getProviders();
for (int i = 0; i < providers.length; i++) {
Provider provider = providers[i];
System.out.println("Provider name: " + provider.getName());
System.out.println("Provider information: " + provider.getInfo());
System.out.println("Provider version: " + provider.getVersion());
Set entries = provider.entrySet();
Iterator iterator = entries.iterator();
while (iterator.hasNext()) {
System.out.println("Property entry: " + iterator.next());
}
}
}
}
显示清单B:
ProviderInformation.java output
Provider name: SUN
Provider information: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore)
Provider version: 1.2
Property entry: Alg.Alias.KeyFactory.1.2.840.10040.4.1=DSA
Property entry: Alg.Alias.Signature.1.2.840.10040.4.3=SHA1withDSA
Property entry: Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1=DSA
Property entry: Signature.SHA1withDSA KeySize=1024
Property entry: Signature.SHA1withDSA ImplementedIn=Software

动态安装:
代码C说明了如何在运行时动态加载Provider,要注意的是,当你用Security.addProvider(…)加载Provider时,它是对整个JVM环境都可用的。
代码C: DynamicProvider.java
import java.security.Security;
public class DynamicProvider {
public static void main(String[] args) {
// This is all there is to it!
Security.addProvider(new com.sun.crypto.provider.SunJCE());
}
}
如前所述,当你安装一个Provider时,你用n来指明此提供者的优先级,但一个算法的实例被调用时,JVM将按照提供的优先级来在已经安装的提供者中查找可用的实现,并使用他首先找到的可用算法。你也可用在调用时加上附加参数来指明要在哪个提供者中寻找使用的算法。

实现细节:
JCE API包含了大量的为实现安全特性的类和接口,首先,我们做一个DES对称(Symmetric)加密的例子。

生成密钥:
下面的代码展示了如何使用密钥生成器来生成密钥。
代码D: DESKeyGenerator.java

import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.NoSUChAlgorithmException;
import java.security.Security;
public class DESKeyGenerator {
public static void main(String[] args) {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
KeyGenerator kg = KeyGenerator.getInstance("DES");
Key key = kg.generateKey();
System.out.println("Key format: " + key.getFormat());
System.out.println("Key algorithm: " + key.getAlgorithm());
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
为了生成密钥,首先要初始化密钥生成器,这一步可以通过调用KeyGenerator类的静态方法getInstance来实现。所用的DES算法没有模式和填充模型。你同样可以(在getInstance(""))传入DES/ECB/PKCS5Padding来指明模式(ECB)和填充模式(PKCS5Padding),也可以传入另外一个参数指明所用的Provider,不过这是可选的。在获得密钥生成器的实例后,通过调用其generateKey()方法,我们就可以获得一个密钥。

生成密码(Cipher):
生成Cipher的过程跟生成密钥类似,需要调用Cipher类的getInstance方法,参数要跟生成密钥时用的参数保持一致。
代码E说明了如果操作。
代码E: DESCipherGenerator.java
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import java.security.Security;
import java.security.NoSuchAlgorithmException;
public class DESCipherGenerator {
public static void main(String[] args) {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try{
Cipher cipher = Cipher.getInstance("DES");
System.out.println("Cipher provider: " + cipher.getProvider());
System.out.println("Cipher algorithm: " + cipher.getAlgorithm());
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
}

加解密数据
加密是对字节的,所以保密行比较高,当你准备好了密钥和Cipher时,你已经做好了加密的准备。要注意的是,同一个算法要用相同的密钥和密码(Cipher)。比如说,你不能用DESsede的密钥,用DES的密码。Cipher对象用同一个方法对数据进行加密和解密,所有你要首先初时化,让他知道你要干什么:

cipher.init(Cipher.ENCRYPT_MODE, key);

这就将初始化Cipher类,以准备好去加密数据。最简单的加密方法就是对传入的字节数组调用doFinal方法:
byte[] data = “Hello World!”.getBytes();
byte[] result = cipher.doFinal(data);

以下是详细的代码
代码F: DESCryptoTest.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.BadPaddingException;
import java.security.Key;
import java.security.Security;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
public class DESCryptoTest {
public static void main(String[] args) {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
KeyGenerator kg = KeyGenerator.getInstance("DES");
Key key = kg.generateKey();
Cipher cipher = Cipher.getInstance("DES");
byte[] data = "Hello World!".getBytes();

System.out.println("Original data : " + new String(data));

cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(data);

System.out.println("Encrypted data: " + new String(result));

cipher.init(Cipher.DECRYPT_MODE, key);
byte[] original = cipher.doFinal(result);

System.out.println("Decrypted data: " + new String(original));
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (NoSuchPaddingException e) {
e.printStackTrace();
}catch (InvalidKeyException e) {
e.printStackTrace();
}catch (IllegalStateException e) {
e.printStackTrace();
}catch (IllegalBlockSizeException e) {
e.printStackTrace();
}catch (BadPaddingException e) {
e.printStackTrace();
}
}
}追问这个怎么加密解密很简单,我想知道怎么开发那个安全提供者包,谢谢

追答这个...人家提供了我们直接拿来用就完了...你要修改人家提供的包~?这个是不是需要把人家的反编译出来再自己修改啊...有点儿深了额...呵呵~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怀孕甲状腺激素偏高正常吗 怀孕检查甲状腺素偏高是什么原因引起的 怀孕了甲状腺功能偏高是怎么回事 怀孕甲状腺高是什么引起的 孕中期促甲状腺激素偏高是什么原因 重钢别墅靠谱吗 重刚别墅的致命缺点 重钢别墅的优点和缺点各是什么 积食可以吃什么 车子换了点火线圈,分缸线,火花塞以后车子打不着。这是什么原因 后端接口进行加密处理,我前端要怎样配合 有没有106短信接口可以加密传输短信内容? java 接口都用什么加密 java怎么调用别人加密后的接口啊? http和https接口有什么区别 接口进行sha1加密是什么意思 有什么办法或者软件可以将电脑的USB接口给加密! web端调接口用angularJS的post请求,接口传输数据... java给别人提供接口,接口安全怎么保证 如何保证API接口安全? php怎样用des加密算法给接口加密 android 接口数据如何加密 接口如何对https加密 在云计算中虽然api接口传输采用https进行加密传输... 路由器属于OSI的那一层,为什么 ? 有多少妈妈拍过孕妇写真啊? 孕妇照拍摄什么样的场景比较合适? 要想拍出最美孕妇照,孕妈妈需掌哪些重点? 以下程序的作用是什么? 游戏程序有什么作用? 如何防止 Android App 被反编译后接口泄露? 单位电脑的USB接口被加密软件封了,拷贝东西极其不... 橄榄酵素是什么?有什么用? 橄榄酵素几天能吃 哪些蔬菜适合做酵素 如何酵素养油? 台湾黄家农庄橄榄酵素 梅子酵素减肥 求介绍初心果酵素橄榄的成份? 酸梅酵素及橄榄酵素哪个好? 酵素和橄榄油能一起喝吗?会有什么效果和副作用? 初心果酵素橄榄怎么样? 请问初心果酵素橄榄都适合什么人啊? 易生美酵素蔬菜果酵素粉可以减肥吗 喝酵素头几天排便第四天就不排便了呢 酵素有没有分寒性和热性,寒性体质和寒性的水果酵素 大家路由器在osi哪一层 2021年牛奶为什么涨价? 为什么牛奶一直在涨价啊? 听说乳制品都涨价了,有涨价的细则吗? 听说光明牛奶开始涨价了是真的吗?