【Java学习】安全编程——学习笔记

在这里插入图片描述


声明:学习内容来自b站尚硅谷视频:https://www.bilibili.com/video/BV1tz4y197hm?from=search&seid=16699194548616133080&spm_id_from=333.337.0.0

一.古典密码学

1.1 替换法

  • 分为单表替换和多表替换

    • 单表替换:替换的规则在同一张表上。

    • 多表替换:替换的规则在不同张表上。

      • 例子如下:
      • 表1:abcde-swtrp	    表2:abcde-chfhk		表3:abcde-jftou
        原文:bee
        密钥:312	(密钥:指示去哪个表找,定义的是规则)
        密文:fpk
        

1.2 移位法

  • 按照字母在字母表上的位置,进行移动的加密方式
  • 著名的加密算法:凯撒加密
    • 如:abcde 往后移动两位 cdefg

1.3 破解方法

  • 频率分析法:
    • 通过统计密文的英文等字符出现的概率,与明文统计出的字符出现概率进行比对。应用了概率论的知识。
    • 即 在密文中统计出频率最高的字符=明文中出现频率最高的字符,然后由ASCII码推出它们的密钥值(即移动了多少位),从而推导原文。

二.现代密码学

2.1 散列函数(哈希函数)

  • 常见有MD5,SHA-1,SHA256

2.2 对称加密

  • 用同一把密钥进行加密解密。

  • 特点:

    • 加密速度快
    • 密文不可逆,密钥不能泄露
    • 若在编码表上找不到对应的字符,则会乱码
    • 常结合base64一起使用
  • Java编程(这里运用了流进行读取加密内容,可自行简化与拓展):

    • String algorithm = "DES"; // 或则“AES”算法
      String transformation = "DES/ECB/PKCS5Padding" //“算法/加密模式/填充模式”
      //定义密钥,DES算法密钥字节数要为8
      String key = "45826954";	//DES需要8个字节;换成AES则需要16个字节
      //获取Cipher对象
      Cipher cipher = Cipher.getInstance(transformation);
      //定义加密规则
      SecretKeySpec spec = new SecretKeySpec(key.getBytes(),algorithm);
      //初始化cipher
      cipher.init(Cipher.ENCRYPT_MODE,spec);	//解密用cipher.init(Cipher.DECRYPT_MODE,spec);
      
      FileInputStream fis = new FileInputStream(srcFile);
      FileOutputStream fos = new FileOutputStream(encFile);
      byte[] bytes = new byte[1024];
      int len;
      while((len = fis.read(bytes))!=-1){
          //调用加密方法
          byte[] newBytes = cipher.doFinal(bytes, 0, len);
          //由于出现乱码,用base64加密一下
          byte[] encode = Base64.getEncoder().encode(newBytes);
          fos.write(encode,0,encode.length);
          
          //解密用
          byte[] decode = Base64.getMimeDecoder().decode(bytes);
          byte[] newBytes = cipher.doFinal(decode, 0, decode.length);
          fos.write(newBytes,0,newBytes.length);
      }
      fis.close();
      fos.close();
      

2.3 非对称加密

  • 有两把密钥,用公钥和私钥进行加密解密。
  • 若公钥加密,必须私钥解密;私钥加密,必须公钥解密。

2.4 如何设置密码才安全

  • 密码不要太常见,如 123456。
  • 各个软件的账户密码不要一样,防止泄漏一个,导致全部泄漏。
  • 设置密码可加特殊的标记,如京东 jd,淘宝 tb。

2.5 byte和bit

  • 1byte = 8 bit
  • java中:
    • 中文,如String a=“我”:

      • 在UTF-8编码下:1个中文 = 3个字节;在GBK下:1个中文 = 2个字节
    • 英文/数字,如String a=“1”:

      • 一个英文/数字 = 1个字节

2.6 base64和base58

  • base64
    • base64是可读性算法,不是加密算法
    • 由64个字符组成,由大小写字母a-z,数字0-9,+,/组成。
    • 原理:
      • 传输3个字节,将3个字节分成4组,每组6个字节,并在每组的最高位补2个0。
      • 这样每组的范围就是0~63,如111 111 ,32+16+8+4+2+1=63.然后去base64的表查对应的字符。
      • 3个字节为一组,若位数不够则用=补齐。
    • 例子:如传输的数据是34 00 a9,则base64编码后为 N A B P。
    • image-20211003141904901
  • base58
    • 一般用是比特币里的编码方式。
  • 区别:
    • base58没有 数字0,字母o,I,i,字符+,/

2.7 ASCII表:

在这里插入图片描述

2.8 加密模式:

  • ECB(Electronic codebook电子密码本):将加密的消息按块大小分块,并对每个块独立加密。

    • 优点:并行加密,速度块。
    • 缺点:同样的原文生成同样的密文,不够安全。
  • CBC(Cipher-block chaining密码块链接):每个明文块要先与前一个密文快进行异或后,在进行加密。

    image-20211003144939640

    • 优点:安全;缺点:效率低。

    • 使用CBC加密模式:

      • String algorithm = "DES";
        String transformation = "DES/CBC/PKCS5Padding" //“算法/加密模式/填充模式”
        String key = "45826954";
        Cipher cipher = Cipher.getInstance(transformation);
        SecretKeySpec spec = new SecretKeySpec(key.getBytes(),algorithm);
        //这里需要定义iv向量
        IvParameterSpec iv = new IvParameterSpec(key.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE,spec,iv);//若填充模式是NoPadding,则key需要8个字节
        
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(encFile);
        byte[] bytes = new byte[1024];
        int len;
        while((len = fis.read(bytes))!=-1){
            //调用加密方法
            byte[] newBytes = cipher.doFinal(bytes, 0, len);
            //由于出现乱码,用base64加密一下
            byte[] encode = Base64.getEncoder().encode(newBytes);
            fos.write(encode,0,encode.length);
        
            //解密用
            byte[] decode = Base64.getMimeDecoder().decode(bytes);
            byte[] newBytes = cipher.doFinal(decode, 0, decode.length);
            fos.write(newBytes,0,newBytes.length);
        }
        fis.close();
        fos.close();
        

2.9 填充模式:

  • NoPadding:不填充
    • 不填充的话,DES算法下,原文需要8字节整数倍;
    • AES算法下,原文需要16字节整数倍.
  • PKCS5Padding:数据块大小为8位,不够就填充。

2.10 消息摘要(数字摘要):

  • 特点:

    • 是一个值,唯一对应一个消息或文本的固定长度的值。是由hash加密函数对消息作用产生的。
    • 使用消息摘要生成的值不可被篡改。
  • 参见算法:

  • MD5,SHA1,SHA256,SHA512

  • Java编程:

    • String algorithm = "MD5";
      MessageDigest digest = MessageDigest.getInstance(algorithm);
      FileInputStream fis = new FileInputStream(srcFile);
      FileOutputStream fos = new FileOutputStream(encFile);
      byte[] bytes = new byte[1024];
      int len;
      while((len = fis.read(bytes))!=-1){
          byte[] newBytes = digest.digest(bytes);
          String str="";
          //将密文转化为16进制
          for (byte newByte : newBytes) {
              String s = Integer.toHexString(newByte&0xff);
              if(s.length()==1)
                  s="0"+s;
              str = str+s;
          }
          System.out.println(str);
          fos.write(str.getBytes(),0,str.getBytes().length);
      }
      fis.close();
      fos.close();
      

2.11 非对称加密:

  • 特点:

    • 有一对密钥对,为公钥和私钥。
    • 若用公钥加密,则使用私钥解密;反之亦然。
  • 常见算法:

    • RSA,ECC
  • java编程:

    • //生成公钥和私钥
      String algorithm = "RSA";
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
      KeyPair keyPair = keyPairGenerator.genKeyPair();
      PrivateKey privateKey = keyPair.getPrivate();
      PublicKey publicKey = keyPair.getPublic();
      //加密,解密类似
      String algorithm = "RSA";
      //获取Cipher对象
      Cipher cipher = Cipher.getInstance(algorithm);
      //初始化cipher
      cipher.init(Cipher.ENCRYPT_MODE,privateKey);
      //调用加密方法
      byte[] newBytes = cipher.doFinal(bytes, 0, len);
      

image-20211003175320789

  • 读取公钥:

    • image-20211003175953158
  • 读取私钥:

    • image-20211003180023672

2.12 数字签名

  • 特点:

    • 公钥数字签名,只能由信息的发送者才能产生的一段数字串。
  • 例子:

    • image-20211003190611518

      张三:对邮件进行hash生成数字摘要,在对摘要进行私钥加密,生成数字签名。发送过去。

      朋友:对收到的邮件,对数字签名进行公钥解密,生成数字摘要。用hash函数对邮件内容进行计算得出数字摘要,跟另一个的数字摘要进行对比。若相同,则邮件没被修改。

  • Java编程:

    • //生成数字签名
      private String getSignature(String input,String algorithm,PrivateKey privateKey) throws Exception {
          Signature signature = Signature.getInstance(algorithm);
          signature.initSign(privateKey);
          signature.update(input.getBytes());
          byte[] sign = signature.sign();
          return new String(Base64.getEncoder().encode(sign));
      }
      //校验数字签名
      private boolean verifySignature(String input,String algorithm,PublicKey publicKey,String signaturedDate) throws Exception {
          Signature signature = Signature.getInstance(algorithm);
          signature.initVerify(publicKey);
          signature.update(input.getBytes());
          return signature.verify(Base64.getDecoder().decode(signaturedDate));
      }
      String signature = getSignature("aaaaa1", "sha256withrsa", privateKey);
      System.out.println(signature);
      boolean b = verifySignature("aaaaa", "sha256withrsa", publicKey, signature);
      System.out.println(b);
      

2.13 数字证书

  • 特点:

    • 由权威的认证机构将 公钥,数字签名 打包成的东西 数字证书。
    • image-20211003191540390
  • CA认证中心:采用公开密钥基础架构技术(PKI),负责签发和管理数字证书。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 本书共分9章,主要内容如下: # 第一章 # 解决的主要问题 # 运行本书的程序需要哪些软件? # 主要内容 # 介绍本书所使用的主要软件及其安装和配置 # 第二章 # 解决的主要问题——内容的安全性 # 数据在网上传递怎么样防止被黑客窃取听到? # 硬盘上的文件中有敏感数据,如何防止被黑客看到? # 主要内容 # 本章解决的是数据内容的安全性,介绍Java的加密和解密技术。学完该章可以通过Java编程对各种数据进行各种形式的加密。密码学也是安全机制的基础。 # 第三章 # 解决的主要问题——和源代码相关的安全性 # 编写好的程序给用户后,用户如果能反编译出源代码怎么办? # 定义类、成员变量、方法时如何防止恶意或无意的攻击? # 主要内容 # 本章解决的是和源代码相关的保护。包括源代码、类、成员变量、方法的保护。通过常用的反编译工具加强对源代码保护的认识,使用混淆器和加密等方式对源代码作了初步保护。同时演示了编写程序时如何考虑攻击者对类、成员变量、方法等方面的攻击。 # 第四章 # 解决的主要问题——确定数据的完整性和所有者 # 网上下载了一个程序,如何确定它确实是某某公司开发的? # 如何确定黑客没有将程序修改过? # 某公司或人发来一个文件,后来他不承认发过这个文件怎么办? # 主要内容 # 第四章起开始介绍和身份认证相关的技术。包括身份确定性、不可篡改性、不可否认性等,该章介绍的消息摘要和签名技术可解决这些问题。 # 第五章、第六章 # 解决的主要问题——数字化身份的凭证 # 实际应用中如何方便地使用摘要和签名技术? # 如何确定某个签名确实是某个人或机构的? # 主要内容 # 第五章和第六章介绍基于摘要和签名技术的数字证书。这是Java安全中确定身份的主要技术。其中第五章介绍了数字证书的创建、签发、验证和维护等,第六章介绍了多个证书组成的证书链(CertPath)的创建和验证。 # 第七章 # 解决的主要问题——数据安全传输,服务器和用户身份的确定 # 客户机和服务器之间的通信如何自动进行加密传输? # 客户机和服务器之间的通信如何相互确定身份? # 浏览器访问一个站点,如何确定这个站点不是黑客的服务器? # 主要内容 # 本章介绍介绍使用加密技术和证书机制的一个实际应用,基于SSL和HTTPS的编程。学完本章可以编写自己的SSL和HTTPS客户及服务器程序。 # 第八章 # 解决的主要问题——基于代码来源的程序的安全运行 # 网上下载了一个程序,运行时会不会删除我的文件,或将某些文件泄漏给黑客? # 编写了一个Java Applet,如何让其能访问硬盘上的文件? # 主要内容 # 本章介绍基于代码来源的程序的安全运行,可以基于运行时代码在哪个URL、或代码是谁签名的限制其可以访问哪些用户资源。还介绍了定义自己的权限以及签名Java Applet。 # 第九章 # 解决的主要问题——身份验证和基于执行者身份的程序的安全运行 # 程序需要用户输入账号和口令到数据库登录,但以后可能需要改为智能卡验证。 # 程序需要访问某个用户资源,但只有用户以某些特殊身份登录时才需要该权限。 # 主要内容 # 本章介绍Java验证和授权服务(JAAS),可以方便地更换验证模块,并实现基于身份的授权。
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值