在Java应用程序中使用密码学

这篇文章描述了如何使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS学习笔记-04 a标签-导航练习

个人练习&#xff0c;各位大神勿笑 。。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&qu…

深度学习loss值变为0_利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python源代码)...

背景数据描述胆固醇、高血脂、高血压是压在广大中年男性头上的三座大山&#xff0c;如何有效的监控他们&#xff0c;做到早发现、早预防、早治疗尤为关键&#xff0c;趁着这个假期我就利用TF2.0构建了一套时序预测模型&#xff0c;一来是可以帮我预发疾病&#xff0c;二来也可以…

在Spring MVC Web应用程序中使用reCaptcha

CAPTCHA是一种程序&#xff0c;可以生成人类可以通过的测试并对其进行评分&#xff0c;而计算机程序“ 不能 ”通过。 所采取的策略之一是向用户显示具有扭曲文本的图像&#xff0c;并且用户应在输入区域中书写文本。 如果显示的文字与用户输入的文字相同&#xff0c;则我们可以…

课时109.外边距合并现象(掌握)

我们先写一个案例&#xff0c;通过案例来了解 它们之间的水平距离就是两个间距的和 我们看完水平再来看垂直方向 在默认布局的垂直方向上&#xff0c;默认情况下外边距是不会叠加的&#xff0c;会出现合并现象&#xff0c;谁的外边距比较大就听谁的 本文转载于:猿2048➜https:…

纯 CSS实现三角形

最近项目上做评论回复&#xff0c;设计师提高交互性特意设计了小三角&#xff0c;如下&#xff1a; 下面介绍一下实现效果的css方法&#xff1a; 1.border 通过设置上下左右border宽度来实现。 首先查看一下全部设置的效果&#xff1a; <style>   .triangle{     w…

Spring MVC表单验证(带批注)

这篇文章提供了一个简单HTML表单验证示例。 它基于带有注释的Spring MVC示例。 该代码可在GitHub的Spring-MVC-Form-Validation目录中找到。 数据 在此示例中&#xff0c;我们将使用bean和JSR303验证批注&#xff1a; public class MyUser {NotNullSize(min1,max20)private …

课时106.边框练习(理解)

让我们做出来如下的样式&#xff1a; 1.首先看下有几个边框&#xff0c;就做几个div&#xff0c;用简单方法div.box$*6 tab键 2.然后给它们设置宽高 3.然后依此来做边框 第一个&#xff1a;有四种方法&#xff0c;第一种最简单 第二个&#xff1a;有两种方法&#xff0c;第二…

课时105.边框属性下(掌握)

2.3连写&#xff08;分别设置四条边的边框&#xff09; border-width:上 右 下 左; border-style:上 右 下 左; border-color:上 右 下 左; 注意点&#xff1a; 1.这三个属性的取值是按顺时针来赋值的 也就是按照上右下左来赋值&#xff0c;而不是按照日常生活…

新mac 下第一次 安装 mongodb 步骤

新入手mac&#xff0c;安装mongo步骤记录&#xff1a;不建议使用网上的brew安装方法&#xff0c;因为试了半天没有成功&#xff0c;应该是新版本限制比较多&#xff01; 从mongodb官网下载mac版本mongo&#xff1a; 1.访问MongoDB官方下载地址 http://www.mongodb.org/download…

201621123065《JAVA程序设计》第11周学习总结

1. 本周学习总结 2. 书面作业 1. 源代码阅读&#xff1a;多线程程序BounceThread 1.1 BallRunnable类有什么用&#xff1f;为什么代码中需要调用Thread.sleep进行休眠&#xff1f; BallRunnable类实现Runnable接口&#xff0c;支持多线程&#xff1b;调用Thread.sleep进行休眠则…

vue使用v-for循环,动态修改element-ui的el-switch

在使用element-ui的el-switch中&#xff0c;因为要用v-for循环&#xff0c;一直没有成功&#xff0c;后来仔细查看文档&#xff0c;发现可以这样写 <el-switch v-for"(item, key) in list" v-model"item.is" :key"key" :active-value"…

前端加按钮将图片另存为_Windows 10系统如何将自己的照片制作成文件夹图标

我们大家都在电脑上建有很多文件夹&#xff0c;有时候查找自己需要的资料文件夹时不太容易&#xff0c;很浪费时间。如果将自己的照片作为常用文件夹的图标&#xff0c;看起来醒目查找时也更为方便些。下面就介绍具体的操作教程。一、将照片格式转换为图标文件格式在电脑上将图…

利用css transition属性实现一个带动画显隐的微信小程序部件

我们先来看效果图 像这样的一个带过渡效果的小部件在我们实际开发中的应用几率还是比较大的&#xff0c;但是在开发微信小程序的过程中可能有的小伙伴发现transition这个属性它不好使&#xff08;下面说明&#xff09;所以我们这个时候会考虑去使用微信官方提供的wx.createAnim…

c语言学生管理系统链表(dev vs2012下可以运行)

struct student { char name[10]; char sex[5]; long int num;//学号 int xuhao; int age; float score[3]; float averange; char DJ;//存放等级哦 struct student *next;};//定义结构体变量保存 名字 性别 年龄 成绩] 结构体声明int n;//存放学生人数int man;//存放统计的男生…

抽象工厂设计模式解释

抽象工厂设计模式是工厂设计模式的另一种形式。 这种模式可以被视为“超级工厂”或“工厂工厂”。 抽象工厂设计模式&#xff08;属于“四人帮”的一部分&#xff09;属于“创新设计模式”类别&#xff0c;它提供了一种封装一组具有公共链接的工厂的方法&#xff0c;而无需突出…

app账号退不出去_最新!多交的税可以退,同学,你今天退税了吗?

4.3 号 更新。1、有知友留言&#xff0c;已经收到退税了。2、部分地区陆续开放申报了&#xff0c;建议大家不要着急。3、大家耐心一点&#xff0c;该是你的就是你的&#xff0c;退税这个事多退少补&#xff0c;建议大家在白天上班时间去APP上看看&#xff0c;毕竟相关公务人员也…

课时77.序选择器(掌握)

CSS3中新增的选择器最具代表性的就是序选择器。 1.同级别的第几个 1. :first-child 选中同级别中的第一个标签 注意点&#xff1a;不区分类型 但是我们这里有一个注意点&#xff0c;如果我们在第一个p之前加一个h1&#xff0c;则第一个p就不变红了&#xff0c;因为我们…

Gulp——文件压缩和文件指纹

先看下文件指纹添加成功发布后的“成果”。 首先介绍下gulp的文件压缩&#xff08;压缩css和js&#xff09; &#xff08;下面介绍的代码移步这里&#xff09; 我的文件目录如下&#xff1a; &#xff08;标红部分是生成的处理后的文件&#xff09; 如何使用gulp&#xff0c;请…

Java 7:使用NIO.2进行文件过滤-第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 &#xff0c;这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以执行与java.io相同的操作&#xff0c;以及许多出色的功能&#xff0c;例如&a…

课时76.兄弟选择器(掌握)

我们先来明确一点&#xff0c;什么是兄弟&#xff1f; 比如&#xff0c;head和body是兄弟&#xff0c;必须是同级关系&#xff0c;如果是嵌套关系&#xff0c;儿子&#xff0c;孙子则不可以。 1.相邻兄弟选择器 CSS2 作用&#xff1a;给指定选择器后面紧跟的那个选择器选中的…