首页 > 其他分享 >用户密码安全存储

用户密码安全存储

时间:2023-11-27 17:34:37浏览次数:34  
标签:存储 加密 String AES 用户 密码 密钥 客户端

用户密码安全存储

关键字:AES加密,CBC,Java

浏览器或者各种客户端实现注册功能时,对用户密码的存储,该如何保证密码的安全?


关于方案

  1. 客户端使用AES(本文使用AES加密)算法对密码进行加密,然后将加密后的密码通过BASE64编码发送给服务器。
  2. 服务端收到后,BASE64解码,然后使用与客户端相同的密钥和初始向量进行ASE解密。解密后我们就得到原始密码了,然后我们可以对原始密码在进行各种操作,我说说之前我们公司的操作。他将原始密码进行md5编码,将编码后的字符串每16字节进行一次AES加密,最终将所有加密结果拼接合并,存放到数据库中再做一次SHA256.(我并不懂为什么要做这种操作,为什么不直接使用加密后的密文,而是要将编码后的每16字节进行一次加密后做拼接)

对于密钥存储

我不清楚客户端如何获取密钥,直接写在客户端代码中? 如果这样那就需要代码混淆,或者代码加密。

还是用接口访问服务器获得密钥?那么服务器也要验证接口调用者身份,况且对于每个app客户端如何判断是否有权限获得密钥。如果可以抓包,那么也可以获得请求中密钥,所以要对密钥再次进行加密,进行套娃?

好了,我们说说服务器端吧。我还是先说说之前公司的操作。他将密钥存储到配置文件,在生产环境有一个统一的配置中心,密钥就存储在那里。如果配置中心的配置泄露,那么密钥就会泄露。

如果密钥泄露,那么攻击者是否可以拦截客户端请求体,而解密出密码呢?

那么可以使用密钥管理系统来提高密钥的安全性。如KMS云服务,各个云服务厂商搜索KMS即可。或者自己部署一个开源软件密钥管理系统,如HashiCorpKeycloak 等项目。

关于Java加密解密代码

    @Test
     void encrypt() {
        String value="baeldung";
        final String key = "aesEncryptionKey";
        final String initVector = "encryptionIntVec";
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encrypted = cipher.doFinal(value.getBytes());
            String s = Base64.encodeBase64String(encrypted);
            System.out.println(s);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Test
    void decrypt() {
        String encrypted = "f3abc1/iSw92hEfjeZeZxA==";
        final String key = "aesEncryptionKey";
        final String initVector = "encryptionIntVec";
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));

            System.out.println(new String(original));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

关于AES

AES加密模式

AES padding,AES是块加密算法,因此加密的数据可能并不是16字节整数倍,因此填充数据使之成为16整数倍。

CBC需要初始向量,ECB不需要初始向量。

关于GPT

标签:存储,加密,String,AES,用户,密码,密钥,客户端
From: https://www.cnblogs.com/keboom/p/17859889.html

相关文章

  • 通过亚马逊云科技云存储服务探索云原生应用的威力
    文章作者:Libai欢迎来到我们关于“使用亚马逊云科技云存储服务构建云原生应用”的文章的第一部分。在本文中,我们将深入探讨云原生应用的世界,并探索亚马逊云科技云存储服务在构建和扩展这些应用中的关键作用。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术......
  • 存储单位
    位(bit)位(bit)是计算机能够存储信息的最小单位。字节(byte)字节(byte)是计算机存储信息的基本单位。1字节byte等于8位bit。更大的存储单位单位名称换算关系千字节(KB)1KB=1024B兆字节(MB)1MB=1024KB吉字节(GB)1GB=1024MB太字节(TB)1TB=1024GB......
  • 默认密码大全
    应用默认密码Oms呼叫中心KXTsoft2010Glodon控制台adminTRENDnet趋势网络摄像头admin/adminMOBOTIX-视频监控admin/meinsm思科Cisco没有原始密码,第一次登录时需要创建DRSadmin/1234Honeywelladmin/1234安迅士Axisroot/pass,新安迅士摄像......
  • 解决非root用户安装软件中cannot create regular file `/usr/local/lib/libz.a‘: Per
    解决非root用户安装软件中cannotcreateregularfile`/usr/local/lib/libz.a':Permissiondenied举例解决办法 举例比如我现在要安装一个软件叫zlib,安装过程如下:wgethttp://zlib.net/zlib-1.2.11.tar.gztarzxfzlib-1.2.11.tar.gzcdzlib-1.2.11./configure......
  • 重置root密码
    linux系统重启后在引导选择界面按【E】有好几行内容,找到linux/boot/vmlinuz-3.2.0-23-genericroot=UUID=[长串数字]roquietsplash$vt_handoff将最后的roquietsplash$vt_handoff替换为rwinit=/bin/bash改完后即为linux/boot/vmlinuz-3.2.0-23-genericroot=UUID=[......
  • 2023 中国 Serverless 用户调查,邀您填写!
    当前云计算已成为数字时代的基础设施,支撑众多企业进行数字化转型升级。随着企业上云的范围更加广泛,国内云计算正在迈向云原生时代。Serverless技术因其以应用为中心、屏蔽底层复杂逻辑,灵活扩展,按需取用的特点,已经成为现代计算的一个重要组成部分,企业正在利用各种Serverless产品以......
  • 存储管理
    1.文件系统Linux中文件系统是数据存储和组织的核心。学习Linux存储管理的第一步是了解不同文件系统的类型,以及它们之间的区别。常见的文件系统包括Ext4、XFS、Btrfs等,每种文件系统都有其适用的场景和优缺点。2.磁盘分区和格式化磁盘分区是将物理硬盘划分为逻辑部分的过程。学......
  • Linux 存储管理
    1.存储方式在Linux系统中,有几种常见的存储方式:1.文件系统Linux支持多种文件系统,包括Ext4、XFS、Btrfs等。文件系统是对存储介质(如硬盘)进行组织和管理的方式,它定义了文件和目录的结构、权限和访问方式。2.磁盘分区:磁盘分......
  • 用户交互scanner
    publicclassScannerDemo01{publicstaticvoidmain(String[]args){Scannera=newScanner(System.in);doublesum=0;//和intb=0;//输出了多少个数System.out.println("请输入:");while(a.hasNextDouble()){......
  • Oracle 数据库存储过程调用SpringBoot API 接口方法
    数据库存储过程代码CREATEORREPLACEPROCEDUREFSMT.P_GET_HTTP_RES/*描述:存儲過程掉用HTTP接口作者:Janus日期:2023-11-23*/(M_DOC_NOINVARCHAR2,--??M_DOC_TYPEINVARCHAR2,--?据?型M_STANDBYINVARCHAR2,--?用字段M_EM......