JVM日历:JDPR或Java数据保护建议

2024-04-30 12:48

本文主要是介绍JVM日历:JDPR或Java数据保护建议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在整个技术生态系统中引起反响的一个重大事件是2018年推出的GDPR,即欧洲公民的通用数据保护法规。虽然我将会或不会影响英国公民,但它仍然有待观察,它为Java开发人员提供了一个积极的机会,可以对三个安全领域感兴趣:

  1. 在其应用程序中查找个人身份信息(PII)或其他敏感数据。

  2. 正确使用加密技术,以正确保护此信息和安全系统。

  3. 应用自定义代码,库和JRE的有效补丁管理。

查找PII和敏感数据

Java开发人员可以通过静态类型和清除API来定位PII。对于开发人员编写的POJO的例子,标准化的方法命名通过大部分的社区可以揭示潜在的PII信息一样   getAddress(),   getName()或   getSomethingElseThatLooksLikePII()。通过方法名称,熟悉PII目标的开发人员可以轻松找到PII睡眠的兴趣点,并识别潜在的泄漏。

Java API还提供了另一种识别PII熊洞穴的简单方法。例如,大多数持久性由JDBC或ORM库(如Hibernate)处理。通过观察查询或直接查看数据库,开发人员可以识别流经这些接口的PII。标准化API(如JDBC和Hibernate)的存在使得基于仪器的工具可以轻松地找到PII,类似于免费的基于仪器的工具监控安全性或性能的方式。

正确使用密码学

Java开发人员受益于Java Cryptographic Architecture,这是一套兼容的工具和库,涵盖了基本的加密方法。从JDK 9开始,大多数JRE都附带了Unlimited Strength Cryptography。无限强度的加密强度和策略文件配置的限制一直是需要强加密的开发项目混淆的根源。Java开发人员提供了一个快速测试,您可以运行以了解是否正确配置了无限强度。

导入 javax。加密。密码 ;
 
class  TestCryptoLimitations {
 
  public  static  void  main(String [] args){
 
    尝试 {
 
      系统。出。println(“Hello World!”);
 
      int  maxKeyLen  =  密码。getMaxAllowedKeyLength(“AES”);
 
      系统。出。println(“最大 密钥 长度 为 ”  +  maxKeyLen);
 
    } catch(例外 e){
 
      系统。出。println(“悲伤的世界:(”);
 
    }
 
  }
 
}

 

接下来,您可能会在项目中遇到三个主要的加密用例:散列文件/凭证,对称加密和非对称加密。

哈希和消息摘要

散列通常用于生成文件校验和或加密凭据。它是一种单向算法,从密钥计算哈希值可以在多项式时间内完成,并且被认为是有效的计算。相反的操作,找到产生给定散列的值,称为碰撞,效率不高且计算成本高。考虑生日攻击以O(2 ^(n / 2)时间为例。单向散列函数的行为使它们适合于凭证存储或测试数据(例如,文件)篡改。即使是一个小的改变文件将显着更改哈希值。

常见的哈希算法有:SHA-256,SHA-512或较旧的算法,如MD5和SHA-1,可以在jdk.certpath.disabledAlgorithms属性下的jre / lib / security / java.security文件中列入黑名单。

在对凭证的秘密部分进行散列(例如,密码)时,散列值应包括每用户盐的唯一值。盐是加密随机值,难以猜测,通常采用长串十六进制值或字节数组的形式。包含盐可防止预计算攻击,攻击者只需在称为彩虹表的字典中查找预先计算的值。不需要Salting来散列非秘密信息,例如文件检查。最好使用像PBKDF2这样的密钥派生函数而不是自己的凭证散列,我们将很快介绍。

计算给定文件的哈希值:

MessageDigest  md  =  MessageDigest。getInstance(“SHA - 256 ”);
md。更新(fileinbytes);
final  byte [] hashed  =  md。doFinal();

 

这可以使用基于密码的密钥推导(PBKDF2)来生成信息的散列,这些信息应该是秘密的并且更难以预先计算。

final  String  password  =  “12345” ;
final  String  salt  =  “user@example.com” ;
final  int  iterations  =  32 ;
 
PBEKeySpec  keySpec  =  新 PBEKeySpec(密码。toCharArray(),盐。的getBytes(),次迭代,512);
 
SecretKeyFactory  skf  =  SecretKeyFactory。getInstance(“PBKDF2WithHmacSHA256”);
 
byte [] hashed  =  skf。generateSecret(keySpec)。getEncoded();
 
final  String  encoded  =  Base64。getEncoder()。encodeToString(hashed);
系统。出。println(“编码:”  +  编码);

 

对称密码

对称密码用于加密和解密信息。对称密码得名,因为加密和解密操作使用相同的密钥。对称密码术是密码学的基础,比非对称密码学更快。密钥通常是长字符串或字节数组,在字典中不容易找到。

常见的对称算法包括AES,Blowfish和DES。以下是对称加密和解密的示例。

导入 javax。加密。密码 ;
导入 javax。加密。规范。IvParameterSpec ;
导入 javax。加密。规范。SecretKeySpec ;
导入 java。安全。SecureRandom ;
导入 java。util。Base64 ;
 
public  class  CryptoAdvent {
    public  static  String  encrypt(byte [] key,byte [] initVector,String  value)throws  Exception {
        IvParameterSpec  iv  =  new  IvParameterSpec(initVector);
        SecretKeySpec  skeySpec  =  new  SecretKeySpec(key,“AES”);
        密码 密码 =  密码。getInstance(“AES / CBC / PKCS5PADDING”);
        密码。INIT(密码。ENCRYPT_MODE,skeySpec,IV);
 
        byte [] encrypted  =  cipher。doFinal(值。的getBytes(“UTF-8” ));
        字符串 编码 =  Base64。getEncoder()。encodeToString(加密);
        返回 编码 ;
    }
 
    public  static  String  decrypt(byte [] key,byte [] initVector,String  encrypted)throws  Exception {
        IvParameterSpec  iv  =  new  IvParameterSpec(initVector);
        SecretKeySpec  skeySpec  =  new  SecretKeySpec(key,“AES”);
        密码 密码 =  密码。getInstance(“AES / CBC / PKCS5PADDING”);
        密码。INIT(密码。DECRYPT_MODE,skeySpec,IV);
 
        byte [] original  =  cipher。doFinal(Base64的。getDecoder()。解码(加密));
        return  new  String(original);
    }
 
    private  static  String  bytesToHex(byte [] bytes){
        StringBuilder  sb  =  new  StringBuilder();
        for(byte  b:bytes){
            SB。追加(字符串。格式(“%02X” ,b));
        }
        返回 某人。toString();
    }
 
    public  static  void  main(String [] args){
        尝试 {
 
            //注意:每次程序运行时都会生成一个新的Key和initVector。真实的
            //实现你需要将密钥和initVector存储为秘密
            //以后解密。
            //
            SecureRandom  sr  =  new  SecureRandom();
            byte [] key  =  new  byte [ 16 ];
            sr。nextBytes(key); // 128位密钥
            byte [] initVector  =  new  byte [ 16 ];
            sr。nextBytes(initVector); // 16字节IV
 
            系统。出。println(“Random key =” + bytesToHex(key));
            系统。出。println(“initVector =” + bytesToHex(initVector));
 
            String  payload  =  “这是Erik和Milton的文章的明文。” ;
            系统。出。println(“Original text =” + payload);
 
            String  encrypted  =  encrypt(key,initVector,payload);
            系统。出。println(“加密文本=” + 加密);
 
            串 解密 =  解密(键,initVector,加密);
            系统。出。println(“Decrypted text =” + decrypted);
 
            字符串 结果 =已 解密。等于(有效载荷)? “有用!” :“事情不对。” ;
            系统。出。println(结果);
 
        } catch(Exception  t){
            t。printStackTrace();
        }
    }
}

 

一个示例输出是:

随机 键= E5  01  B6  AC  9 C  A5  6 D  64  08  DE  AB  DD  83  9 C  E0  87 
initVector = AC  09  5 C  B0  6 E  76  3 B  E6  A4  2 B  D7  4 C  B3  4 B  CE  F8 
原始 文本= 这 是 在 明文 从 埃里克 和 米尔顿的文章。
加密 文本= / LQlJp7fR4Gkq5unWU4X + 5 qrje1WWKyCms + MPzcwsFf2eE + QHVr2RQDoJVfrSmoc / dM5ulrtk5z4z4evozprUQ ==
解密 文本= 这 是 在 明文 从 埃里克 和 米尔顿的文章。
它的 作品!

 

不对称密码

大多数Internet加密(例如HTTPS)都是围绕非对称加密构建的。非对称加密技术的优点在于它为客户端和服务器提供了一种安全地协商密钥和密码套件的方法,这些秘密密钥和密码套件后来用于使用通用的对称加密技术来保护数据。非对称加密利用一些新的类,如中  KeyPair,  PublicKey,  PrivateKey,和  Certificate。这些类中的每一个都设计为可以共享公钥以便通过不受信任的网络访问任何人,然后使用他们自己的私钥加密消息。然后,公钥的所有者可以使用他们自己的私钥解密消息,使两者能够通话。

非对称加密的最常见用途是与网站进行加密的HTTPS通信。在这种情况下,每个客户端都有一个已知的证书颁发机构列表,用于建立身份并验证每个网站的公钥的所有者。

与浏览器不同,大多数JRE都有一个截断的证书颁发机构列表,其中包含许多来自Digicert的不同证书,但不包含流行的证书颁发机构,如Amazon Trust(AWS)或SSL.com。因此,Java客户端可能会因PKIX异常而无法对某些URL进行身份验证。

发生这种情况时,开发人员不应只是禁用SSL身份验证。这样做可以简单地确保应用程序通过安全通道发送信息,而无需知道此通道另一端的内容。

正确的机制是将根证书添加到lib / security / cacerts文件中:

 keytool -importcert -keystore lib/security/cacerts -alias awstrust -file awstrust.cer

虽然将根证书添加到此根证书颁发机构存储是合理的,但是耳机之类的东西不需要根证书,如果是,则这些耳机的私钥应保持私密。

有效的补丁管理

开发人员需要考虑两个方面进行修补:

  • 保持与JRE的节奏

  • 跟上库漏洞

Oracle JRE和Amazon Corretto都按季度进行补丁。与Oracle JRE(其Java 8支持在2019年4月结束)不同,Amazon Corretto承诺在2023年之前按季度免费修补补丁 - 大约四年。

Java开发人员无法抵御最近攻击Node社区的攻击类型,从而窃取了不同数量的比特币。例如,在2014年,针对Maven Central进行了一次攻击,以修改字节码,因为它在jar文件中移动到网络中。虽然响应很快就能启用SSL,但大多数JAR文件仍然没有通过jarsigner工具签名,这使得检测篡改变得更加困难。类似的攻击在别处发生。

当在第三方库中发现漏洞时,在部署补丁之前,您的应用程序几乎没有防御。这就是为快速修补设计软件应用程序,服务和基础架构对于强大的安全性至关重要的原因。除了快速部署之外,测试通常是一个常见的障碍。大多数组织推迟修补,因为他们没有很大的信心推动修补程序不会破坏生产。这就是为什么投资高质量的单元测试案例非常重要的原因。

为了监控第三方库的安全状态,OWASP Dependency Check或Contrast Community Edition等开发人员可以使用免费工具。

许多软件购买者强制执行这种依赖性分析,称为软件组合分析,部分原因是只需查看库就可以轻松检测到。忽视此建议的开发人员可能会发现他们的应用程序取消部署,后续发票未付。

一般建议

开发人员应该关注他们拥有的数据类型以及他们如何保护这些数据。由于GDPR的监管环境,“保存所有数据”的默认业务方法可能成为严重的商业责任。数据可能是新油,但油是易燃的,并且在处理加密数据时,不要将密钥与加密数据一起存储,因为这会破坏目的。

这篇关于JVM日历:JDPR或Java数据保护建议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948906

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定