曾经试图在Java和OpenJDK中使用椭圆曲线密码术 (ECC)的每个人要么被迫使用Bouncy Castle,要么被SunEC提供者弄糊涂了 。 SunEC提供程序根据文档 (报价)提供以下算法:

AlgorithmParameters 欧共体
KeyAgreement ECDH
KeyFactory 欧共体
KeyPairGenerator 欧共体
Signature ECDSA没有
SHA1withECDSA
SHA256withECDSA SHA3​​84withECDSA SHA512withECDSA

不幸的是,OpenJDK并未附带该提供程序。 但是任何真正想尝试Java内置ECC功能的人都可能会尝试将sunec.jar(包含提供程序)简单地添加到jre / lib / ext /文件夹中。 但是,当尝试使用提供程序时,这些家伙一定会惊讶地擦着眼睛。 事情与刚开始时看起来不一样...

假设我们将库添加到了正确的文件夹中,我们的OpenJDK注意到了它,并且我们可以成功地编译以下代码而没有任何例外:

package eccprovidertest;import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
import sun.security.ec.SunEC;/*** ECC Provider Test.* @author  Christopher Meyer - christopher.meyer@rub.de* @version 0.1* Oct 23, 2013*/
public class ECCProviderTest {/*** @param args the command line arguments*/public static void main(final String[] args) {Provider sunEC = new SunEC();Security.addProvider(sunEC);for(Service service : sunEC.getServices()) {System.out.println(service.getType() + ": " + service.getAlgorithm());}}}

如果最终使用OpenJDK(Java版本“ 1.7.0_25”)运行它,则会得到以下输出:

KeyFactory: EC
AlgorithmParameters: EC

哇! 这不是一个非常有用的提供程序.....承诺的算法在哪里? 让我们尝试使用Oracle JDK来运行代码,只是为了好玩:

KeyFactory: EC
AlgorithmParameters: EC
Signature: NONEwithECDSA
Signature: SHA1withECDSA
Signature: SHA256withECDSA
Signature: SHA384withECDSA
Signature: SHA512withECDSA
KeyPairGenerator: EC
KeyAgreement: ECDH

惊喜,惊喜! 那是您开始揉眼睛的时刻! 这里是算法,但是为什么仅在使用Oracle JDK时才可用?

这样做的原因隐藏在提供程序的代码中。 以下几行摘自sun.security.ec.SunEC :

private static final long serialVersionUID = -2279741672933606418L;// flag indicating whether the full EC implementation is present
// (when native library is absent then fewer EC algorithms are available)
private static boolean useFullImplementation = true;
static {try {AccessController.doPrivileged(new PrivilegedAction() {public Void run() {System.loadLibrary("sunec"); // check for native libraryreturn null;}});} catch (UnsatisfiedLinkError e) {useFullImplementation = false;}
}public SunEC() {super("SunEC", 1.7d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)");// if there is no security manager installed, put directly into// the provider. Otherwise, create a temporary map and use a// doPrivileged() call at the end to transfer the contentsif (System.getSecurityManager() == null) {SunECEntries.putEntries(this, useFullImplementation);} else {Map<Object, Object> map = new HashMap<Object, Object>();SunECEntries.putEntries(map, useFullImplementation);AccessController.doPrivileged(new PutAllAction(this, map));}
}

此外,在将某些条目添加到列表之后,可以在SunECEntries类中找到以下内容:

/** Register the algorithms below only when the full ECC implementation* is available*/
if (!useFullImplementation) {return;
}

好的,这说明了行为。 仅当可以成功加载本机库(Windows计算机上的libsunec.so或sunec.dll)时,才存在算法。 在我们的情况下,显然缺少该库(因为我们仅复制了sunec.jar文件)。

不幸的是,如果我们阅读了提供者文档,我们将了解以下内容:

“ […] Java类打包到JRE扩展目录中已签名的sunec.jar中,而C ++和C函数打包到JRE本机库目录中的libsunec.so或sunec.dll中。 如果不存在本机库,则该提供者已注册为支持较少的ECC算法(省略了KeyPairGenerator,Signature和KeyAgreement)。”

不幸的是,这是我们自己急于采取的行动,这浪费了我们宝贵的开发时间。 摘自:有时候阅读JavaDocs确实很有帮助……。 (但不像调试工作那样富有教育意义)。

参考: Java安全和相关主题博客中的JCG合作伙伴 Christopher Meyer的如何将ECC与OpenJDK结合使用 。

翻译自: https://www.javacodegeeks.com/2013/10/how-to-use-ecc-with-openjdk.html

如何在OpenJDK中使用ECC相关推荐

  1. openjdk 使用_如何在OpenJDK中使用ECC

    openjdk 使用 曾经试图在Java和OpenJDK中使用椭圆曲线密码术 (ECC)的每个人要么被迫使用Bouncy Castle,要么被SunEC提供者弄糊涂了 . SunEC提供程序根据文档 ...

  2. 我是如何在SQLServer中处理每天四亿三千万记录的

    原文地址:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇 ...

  3. 请看:我是如何在SQLServer中处理每天四亿三千万记录的

    2019独角兽企业重金招聘Python工程师标准>>> 小中午,无意间读到这篇博客,觉得,文中作者在处理海量数据写入方面,所做的一些尝试,或许可以给同道朋友提供一些帮助,与君共勉.  ...

  4. 如何在Linux中安装jdk?

    如何在Linux中安装jdk? 学习目标 如何在Linux中安装jdk? 1.先创建一个新的虚拟机,一共13步创建好虚拟机 2.配置虚拟机 3.在虚拟机中安装JDK 1.先创建一个新的虚拟机,一共13 ...

  5. jenkins中maven的安装及配置,如何在jenkins中创建maven任务。

    本文介绍了在jenkins中maven的安装及配置(安装maven及jdk的方法),以及如何在jenkins中创建maven任务. 有三点需要注意的地方. maven一定要安装在jenkins服务器上 ...

  6. 字符串压缩 java_如何在Java中压缩字符串?

    如何在Java中压缩字符串? 我使用GZIPOutputStream或ZIPOutputStream压缩字符串(我的2222235278130938882小于20),但压缩结果比原始字符串长. 在某个 ...

  7. 如何在SQLServer中处理每天四亿三千万记录的

    项目背景 这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空 ...

  8. 如何在SQLServer中处理每天四亿三千万记录的(数据库大数据处理)

    http://blog.csdn.net/wybshyy/article/details/52064289 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是 ...

  9. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

最新文章

  1. 虚拟化--027 VMware vCenter Server Heartbeat 6.5安装教程
  2. 《信息学奥赛一本通》高精除以高精,求它们的商和余数。
  3. pat 乙级 1002 写出这个数(C++)
  4. Git分布式版本管理
  5. 降低关系型数据库的逻辑复杂
  6. java.util.concurrent包(2)——线程池
  7. 【w3cschool】C语言复习
  8. 今天买了正版的beyondcompare 4.0
  9. 计算机比赛训练总结500字,比赛活动总结500字(精选7篇)
  10. DNS服务器存在问题需要修复,dns服务(dns异常怎么都修复不了)
  11. 阿里云调用api配置access_key
  12. 读懂K线,就能理解期货股票交易中人性的期望、猜疑、幻想、贪婪、恐惧...
  13. 小心肝队-冲刺日志(第六天)
  14. android平板电脑的虚拟键盘,触控、手写、虚拟键盘的操作体验
  15. 创建订单【项目 商城】
  16. 『力扣刷题』5238_找出给定方程的正整数解 解题代码
  17. 一点英语不会可以学java吗_不会英语能学编程吗 编程好不好学
  18. 笑看万物锘锘锘 php,如何用一句话证明你是程序员?41 个答案揭晓!
  19. Doraemon-接口自动化测试工具
  20. Word中的图文框和文本框

热门文章

  1. java填充线缺口,在geom_freqpoly线下填充区域的最简单方法是什么?
  2. spring boot 入门荔枝
  3. MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据
  4. tomcat(10)安全性
  5. java泛型——桥方法
  6. 不相交集合求并的路径压缩
  7. java设计模式 订阅模式_Java中的外观设计模式
  8. cassandra数据备份_Cassandra中的数据建模
  9. aws lambda_API网关和AWS Lambda进行身份验证
  10. java迭代器删除两个_两个迭代器的故事