这篇文章描述了如何使用Java密码体系结构 (JCA),该体系结构使您可以在应用程序中使用密码服务。

Java密码体系结构服务

JCA提供了许多加密服务,例如消息摘要和签名 。

这些服务可以通过特定于服务的API来访问,例如MessageDigestSignature

密码服务抽象了不同的算法。 例如,对于摘要,可以使用MD5或SHA1 。 您可以将算法指定为加密服务类的getInstance()方法的参数:

MessageDigest digest = MessageDigest.getInstance("MD5");

您可以在“ JCA 标准算法名称文档”中找到算法参数的值。

一些算法具有参数。 例如,生成私钥/公钥对的算法将把密钥大小作为参数。 您可以使用initialize()方法指定参数:

KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA");
generator.initialize(1024);

如果不调用initialize()方法,则将使用某些默认值,该默认值可能是您想要的,也可能不是。

不幸的是,用于初始化的API在服务之间并非100%一致。

例如, Cipher类将init()与指示加密或解密的参数一起使用,而Signature类将initSign()用于签名, initVerify()用于验证。

Java密码体系结构提供程序

JCA通过提供程序系统使您的代码独立于特定密码算法的实现。

提供商根据可配置的首选项顺序进行排名(请参见下文)。 最佳优先级是1,次佳是2,依此类推。优先级顺序允许JCA选择实现给定算法的最佳可用提供程序。

另外,您可以在getInstance()的第二个参数中指定特定的提供程序:

Signature signature = Signature.getInstance("SHA1withDSA", "SUN");

默认情况下,JRE附带了来自Oracle的一堆提供程序 。 但是,由于历史上的出口限制,这些并不是最安全的实现。 要获得更好的算法和更大的密钥大小,请安装Java密码学扩展无限强度管辖权策略文件 。

更新 :请注意,以上声明对Oracle JRE是正确的。 OpenJDK没有相同的限制 。

使您可以对密码学进行配置

您应始终确保应用程序使用的加密服务是可配置的。

如果这样做,则可以在不发布补丁的情况下更改密码算法和/或实现。

当对(一种实现)算法有新的攻击时,这特别有价值。

JCA使配置加密的使用变得容易。

getInstance()方法同时接受算法的名称和实现该算法的提供程序的名称。 您应该从某种配置文件中读取算法参数的值和所有值。

还要确保将代码DRY保留在一个地方并实例化加密服务。

检查所请求的算法和/或提供程序是否实际可用。

当给定的算法或提供程序不可用时, getInstance()方法将引发NoSuchAlgorithmException ,因此您应该捕获该异常。 然后最安全的选择是失败,并请他人确保系统配置正确。 如果在配置错误的情况下仍然继续,则可能会导致系统安全性低于要求。

请注意, Oracle建议不要指定提供程序 。 它们提供的原因是,并非所有提供程序都可以在所有平台上使用,并且指定提供程序可能意味着您错过了优化。

您应该权衡这些不利因素和易受攻击的风险。

在您的应用程序中部署具有已知特征的特定提供程序可能会消除Oracle提到的缺点。

添加加密服务提供商

提供程序系统是可扩展的,因此您可以添加提供程序。

例如,您可以使用开源Bouncy Castle或商业RSA BSAFE提供程序。

为了添加提供程序,必须确保其jar对应用程序可用。 为此,您可以将其放在类路径中。

另外,您可以通过将其放置在$JAVA_HOME/lib/ext目录中来使其成为已安装的扩展 ,其中$JAVA_HOME是JDK / JRE发行版的位置。

两种方法之间的主要区别在于,默认情况下, 已授予安装的扩展所有权限 ,而classpath上的代码则未被授予 。 当您的代码(的一部分)在沙盒中运行时,这非常重要。

某些服务(例如Cipher )要求对提供者jar进行签名 。

下一步是在JCA提供者系统中注册提供者。 最简单的方法是使用Security.addProvider()

Security.addProvider(new BouncyCastleProvider());

您还可以使用Security.insertProviderAt()方法设置提供者的优先顺序:

Security.insertProviderAt (new JsafeJCE(), 1);

这种方法的一个缺点是,它将代码耦合到提供程序,因为您必须导入提供程序类。 在像OSGi这样的模块化系统中,这可能不是重要的问题。

需要注意的另一件事是代码需要SecurityPermission以编程方式添加提供程序。

通过将注册项添加到java.security属性文件(可在$JAVA_HOME/jre/lib/security/java.security找到),还可以通过静态注册将提供程序配置为您环境的一部分:

security.provider.1=com.rsa.jsafe.provider.JsafeJCE
security.provider.2=sun.security.provider.Sun

该文件中的属性名称以security.provider.开头security.provider. 并以提供者的偏好结束。 该属性值是实现Provider的类的完全限定名称。

实施您自己的加密服务提供商

不要这样做 。 您弄错它,并且容易受到攻击。

使用加密服务提供者

提供程序的文档应告诉您将哪个提供程序名称用作getInstance()的第二个参数。 例如,Bouncy Castle使用BC ,而RSA BSAFE使用JsafeJCE

大多数提供程序都有自定义API以及符合JCA的API。 请勿使用自定义API,因为那样将无法配置所使用的算法和提供程序。

并非所有算法和实现都是相同的

重要的是要注意,不同的算法和实现具有不同的特性,这些特性或多或少会使它们适合您的情况。

例如,某些组织仅允许使用经过FIPS 140-2认证或在NSA Suite B加密算法列表中的算法和实现。

始终确保您了解客户的加密需求和要求。

在OSGi环境中使用JCA

getInstance()方法是使用服务提供商接口 (SPI)的工厂方法 。 这在OSGi世界中是有问题的,因为OSGi违反了SPI框架关于存在单个类路径的假设。

另一个潜在的问题是,JCA需要对一些jar进行签名。 如果这些罐子不是有效的OSGi捆绑包,则不能通过bnd来运行它们,因为这样会使签名无效。

幸运的是,您可以用一块石头杀死两只鸟。 将提供程序jar放在主程序(即启动OSGi框架的程序)的类路径中。

然后使用org.osgi.framework.system.packages.extra系统属性从OSGi系统捆绑包导出提供程序包。 这将使系统捆绑包导出该软件包。

现在,您可以简单地在包中的提供程序Import-Package上使用Import-Package

还有其他的选择 ,因为如果你不能使用上述方案解决这些问题。

参考: Secure Software Development博客上的JCG合作伙伴 Remon Sinnema提供了在Java应用程序中使用加密的信息 。

翻译自: https://www.javacodegeeks.com/2012/12/test-using-cryptography-in-java-applications.html

在Java应用程序中使用密码学相关推荐

  1. java程序中用户名和密码_在Java应用程序中使用密码术

    java程序中用户名和密码 这篇文章描述了如何使用Java密码体系结构 (JCA),该体系结构使您可以在应用程序中使用密码服务. Java密码体系结构服务 JCA提供了许多加密服务,例如消息摘要和签名 ...

  2. Java web程序中备份oracle数据库

    Java web程序中备份oracle数据库 1.生成备份文件: public ActionForward createDmp(ActionMapping mapping, ActionForm fo ...

  3. 在 Java 应用程序中使用 Elasticsearch: 高性能 RESTful 搜索引擎和文档存储快速入门指南

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  4. elastic search java_在 Java 应用程序中使用 Elasticsearch

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  5. 网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常

    网络研讨室 1月30日参加我们的网络研讨会,以发现Java应用程序中的"隐藏"异常. 如果一棵树落在森林中,但是没有写到原木上,它会发出声音吗? 答案是肯定的. 这些类型的错误可能 ...

  6. lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

    lombok 生成代码 对Java编程语言最常提出的批评之一是它需要大量的样板代码 . 对于简单的类尤其如此,该类只需要存储一些值就可以. 您需要这些值的getter和setter方法,也许您还需要一 ...

  7. 免费网络研讨会:Java应用程序中的吞咽异常

    1月30日参加我们的网络研讨会,以发现Java应用程序中的"隐藏"异常. 如果一棵树落在森林中,但是没有写到原木上,它会发出声音吗? 答案是肯定的. 这些类型的错误可能会对用户体验 ...

  8. 使用Project Lombok减少Java应用程序中的样板代码

    对Java编程语言最常提出的批评之一是它需要大量的样板代码 . 对于简单的类尤其如此,该类只需要存储一些值就可以. 您需要这些值的getter和setter,也许您还需要一个构造函数,覆盖equals ...

  9. Java应用程序中的内存泄漏和内存管理

    Java平台最突出的功能之一是其自动内存管理. 许多人错误地将此功能转换为Java中没有内存泄漏 . 但是,事实并非如此,我给人的印象是,现代Java框架和基于Java的平台,尤其是Android平台 ...

最新文章

  1. Android之startActivityForResult的使用
  2. java tf值搜索_搜索引擎优化 TF_IDF之Java实现
  3. PHP 自学教程之MySQL数据库
  4. MyBatis-学习笔记02【02.Mybatis入门案例】
  5. Java项目编译时经常会出现不编译,或者报一些假性错误
  6. common lisp 学习第四天 变量、宏
  7. C++中STL-queue使用方法
  8. 7.26 4 印度旅馆阿鲁沙之家
  9. uefi模式安装win7出现winload.efi和oxc0000428错误的另类解决办法
  10. 【目标检测算法系列】一、R-CNN算法
  11. python进行数据抽取_python中的数据抽取
  12. 显示器分辨率、显示器大小和视频分辨率的关系
  13. 为什么现在的程序员那么卑微?青出于蓝而胜于蓝啊
  14. 完全不用递归解汉诺塔(65个盘子——VC6代码)
  15. 靶子环数图片_一种靶子环数的图像识别方法与流程
  16. php swoole 教程,PHP Swoole 基本使用
  17. 台式计算机开机黑屏,联想台式电脑开机黑屏出现英文字母,怎么办?
  18. Flink实操 : 状态管理
  19. 口碑好工作站服务器维修,童颜玩物 惠普Z800顶级工作站深度拆解
  20. java黑白棋原码_JAVA课程设计黑白棋源代码

热门文章

  1. fastdfs 集群 java_FastDFS集群部署(转载 写的比较好)
  2. centos 卸载ffmpeg_Linux下ffmpeg的完整安装
  3. 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis
  4. java继承中的 equals + hashCode+toString
  5. 脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报
  6. c++ 嵌套私有类_嵌套类和私有方法
  7. java解决错误经验_在Java错误进入生产之前的新处理方式
  8. api网关和esb区别_具有ESB,API管理和Now .. Service Mesh的应用程序网络功能。
  9. spring javaee_开发人员对Spring vs JavaEE的看法
  10. OCA第1部分中的Java难题