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

java程序中用户名和密码

java程序中用户名和密码_在Java应用程序中使用密码术相关推荐

  1. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  2. java url 本地文件是否存在_我的应用程序知道URL中是否存在文件会一直停止[重复]...

    这个问题在这里已有答案: 我试图写一个应用程序,如果在给定的URL中有一个文件,将字符串放在textview中,这是代码和崩溃信息,可能是什么错误? public class MainActivity ...

  3. Java程序如何写判断闰年_用Java程序判断是否是闰年的简单实例

    我们知道,(1)如果是整百的年份,能被400整除的,是闰年:(2)如果不是整百的年份,能被4整除的,也是闰年.每400年,有97个闰年.鉴于此,程序可以作以下设计: 第一步,判断年份是否被400整除, ...

  4. java程序员比c多_为什么JAVA会比C语言使用的多?

    Java和C都是指令式语言(Imperative Language),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++.C#支持面向对象. 另外一个不同是,Jav ...

  5. java 项目 q a 表设计_《JAVA程序设计项目案例训练》期末试卷(A卷)..doc

    献给Java专业期末考试复习的同学 希望你们能考个好成绩 2010-2011学年第二学期哈尔滨华夏计算机职业技术学院期末考试 JAVA程序设计项目案例训练试题(A卷) 总分题号一二三四核分人题分402 ...

  6. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

  7. java制作一个简单的画板_【Java】Thymeleaf一个简单示例

    Thymeleaf简单介绍 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemar ...

  8. java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...

    @ 1.异常 1.1 异常概念 异常 :简单说就是不正常运行,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处 ...

  9. java服务端开发的好处_用java开发web的优势到底在哪里?

    你所说的 "客户端访问页面也不需要装jvm啊" 证明了你连服务端和客户端都分不清 你可能是正版培训班的受害者 花点功夫解释下给你哈. 纵向比较:客户端编程 vs 服务器编程 客户使 ...

最新文章

  1. golang string 字符串 大小写转换
  2. ios中MKHorizMenu用法
  3. idea控制台输出乱码
  4. Java web访问MySql数据库分页查询
  5. android获取图片格式,Android得到图片的真实格式——从本地文件或者网络文件流...
  6. scp 、ssh非22端口的服务器方法
  7. Best Friend Forever
  8. Docker Jenkins Node(一):初步构建
  9. Grafana+Prometheus系统监控MySQL
  10. python字符串转整数_Python连接字符串和整数
  11. 何通过ArcCatalog本地发布地图服务
  12. 网上药店领导品牌_药康网
  13. 网页上传图片时,直接本地预览无需上传服务器
  14. 30、T5L 迪文屏 C51开发之 ADC模数转换
  15. CSS3-数据可视化
  16. 移远BC35-G固件升级
  17. Swift中的UIKit重力学(一)
  18. MAC xmind破解版使用
  19. ipv4地址怎么设置 手机_怎样修改手机的ip地址?手机IP地址如何修改
  20. ICT是什么?ICT的社会和经济影响

热门文章

  1. 深入JVM虚拟机(四) Java GC收集器
  2. Spring Boot整合Thymeleaf模板引擎
  3. 通往大神之路,百度Java面试题前200页。
  4. React类里面能写的东西
  5. 常数除以0的极限是什么_【极限】第四节 极限运算法则
  6. 亚信科技笔试面试2019届
  7. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc
  8. inner join on 加条件和where加条件_SQL学习笔记 - GROUP BY / JOIN / UNION
  9. 转-HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)
  10. 网络——提交表单数据(post方式)