主要防止非法用户修改cookie信息,以及cookie的超时时间 
传统cookie存储,Cookie(name, value),value很容易就被篡改。 
防修改cookie存储,Cookie(name, value+“&&”+ signToken+“&&”+saveTime+“&&”+maxTime) 
signToken :签名密钥 由md5(value+saveTime+maxTime+”自定义密钥“)生成 
saveTime:cookie创建时间 
maxTime:cookie超时时间

设置Cookie

    public static void put(HttpServletResponse response, String key, String value, int maxTime) {
        String pwdKey = "white_yu"; //自定义密钥
        String saveTime = System.currentTimeMillis() + "";
        String signToken = md5(pwdKey, saveTime, maxTime + "", value);

        String cookieValue = signToken + "&&" + saveTime + "&&" + maxTime
                + "&&" + value;
        Cookie cookie = new Cookie(key,cookieValue);
        cookie.setMaxAge(maxTime);
        response.addCookie(cookie);

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

获取Cookie

    public static String getCookie(String cookieValue) {
        String pwdKey = "white_yu"; //自定义密钥
        if (StringUtils.isNotBlank(cookieValue)) {
            String cookieStrings[] = cookieValue.split("&&");
            if (null != cookieStrings && 4 == cookieStrings.length) {
                String signToken = cookieStrings[0];
                String saveTime = cookieStrings[1];
                String maxTime = cookieStrings[2];
                String value = cookieStrings[3];

                String sign = md5(pwdKey, saveTime, maxTime, value);

                // 保证 cookie 不被人为修改
                if (sign.equals(signToken)) {
                    long stime = Long.parseLong(saveTime);
                    long maxtime = Long.parseLong(maxTime) * 1000;
                    // 查看是否过时
                    if ((stime + maxtime) - System.currentTimeMillis() > 0) {
                        return value;
                    }
                }
            }
        }
        return null;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
版权声明:转载请标注原文地址 https://blog.csdn.net/soul_code/article/details/52768421
 
 
 
cookie是存储在用户本地的,最高权限还是在用户手上,服务器可以验证cookie是否合法性,
 
 
 
 
关键词: cookie poisoning
概述:
除了 session 外,一般不会在客户端的 cookies 里保存过于重要的凭据,但电商应用有时候不可避免地存储了一些敏感数据到客户端,当然不希望被篡改。

目的:
让服务器端能识别cookie值被篡改了。
 
手法:
set-cookie时加上防篡改验证码。
如:
user_name=alex|bj95ef23cc6daecc475de
 
防篡改验证码的生成规则可以很简单:md5(cookieValue+key)或sha1(cookieValue+key),key可以是服务器端掌握的一个固定字符串,也可以很复杂(如后面的LTPA示例)。
 
服务器端得到客户端送上来的cookie后,重新计算一下验证码,如一致,则未篡改。
 
示例2:IBM LTPA 的 cookie 签名
Lightweight Third-Party Authentication (LTPA)是IBM Websphere和Domino产品中使用的单点登录技术。
当服务器配置好LTPA认证方式,用户通过浏览器成功登录后,服务器会自动发送一个 session cookie 给浏览器;此 Cookie 中包含一个 LTPA Token。
一个有效的 LTPA Cookie 能够在同一个认证域中被所有服务器自动认证。此 Cookie 中包含认证信息和时间戳。这些信息通过共享的 3DES Key 进行了 bis  加密。使用公共密钥/私有密钥进行签名。
 
1)大致介绍:
LTPA Cookie 原始值 通过 3DES密钥 使用 DESede/ECB/PKCS5P 进行加密。
此 3DES密钥  也是采用 DESede/ECB/PKCS5P 进行加密,加密后再使用事先提供的 密钥密码 进行SHA-1 Hash,生成24个字节的密钥,再进行Base64编码。
 
如 Dmonio 里, LTPA Cookie 值为以下公式组成:
SHA-1=LTPA版本号+创建时间+过期时间+用户名+Domino LTPA 密钥
LTPA Cookie= Base64(LTPA版本号+创建时间+过期时间+用户名+SHA-1)
 
如要解析 LTPA Token,先得使用 密钥密码,生成 3DES密钥;再使用 3DES密钥 解密 Token Cookie。也可以使用公共/私有密钥来签名或验证LTPA Cookie。

2)WebSphere LTPA 生成原理

首先,这个 cookie 由以下部分组成,以%进行分隔:
  • 用户信息,格式为u:user\:<RealmName>/<UserDN>,如:u:user\:VGOLiveRealm/CN=squallzhong,O=VGOLive Technology
  • 过期时间
  • 签名信息,如:

    u:user\:VGOLiveRealm/CN=squallzhong,O=VGOLive Technology%1301558320666%Cy2CAeru5kEElGj0hrvYsKW2ZVsvvcu6Un573aeX55OO4G3EMYWc0e/ZbqDp1z7MS+dLzniuUH4sYWCMpnKdm7ZGabwmV+WcraBl+y+yzwcl722gHVMOnDZAW7U3jEay9Tk2yG4yXkMWU+617xndpVxke2jtS5wIyVVM3q7UDPw=

3)WebSphere LTPA Cookie 的解析

以下代码为解析从 WebSphere 或 Domino 发送过来的 LTPAToken Cookie。以Java为例:

01
02        // LTPA 3DES 密钥
03        String ltpa3DESKey = "7dH4i81YepbVe+gF9XVUzE4C1Ca5g6A4Q69OFobJV9g=";
04        // LTPA 密钥密码
05        String ltpaPassword = "Passw0rd";
06        try {
07            // 第一步,获得加密key
08            byte[] secretKey = getSecretKey(ltpa3DESKey, ltpaPassword);
09            // 第二步,使用加密key解密ltpa Cookie
10            String ltpaPlaintext = new String(decryptLtpaToken(tokenCipher,
11                    secretKey));
12            displayTokenData(ltpaPlaintext);
13        catch (Exception e) {
14            System.out.println("Caught inner: " + e);
15        }
16
17    //获得安全Key
18    private static byte[] getSecretKey(String ltpa3DESKey, String password)
19            throws Exception {
20        // 使用SHA获得key密码的hash值
21        MessageDigest md = MessageDigest.getInstance("SHA");
22        md.update(password.getBytes());
23        byte[] hash3DES = new byte[24];
24        System.arraycopy(md.digest(), 0, hash3DES, 020);
25        // 使用0替换后4个字节
26        Arrays.fill(hash3DES, 2024, (byte0);
27        // BASE64解码 ltpa3DESKey
28        byte[] decode3DES = Base64.decodeBase64(ltpa3DESKey.getBytes());
29        // 使用key密码hash值解密已Base64解码的ltpa3DESKey
30        return decrypt(decode3DES, hash3DES);
31    }
32    //解密LtpaToken
33    public static byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key)
34            throws Exception {
35        // Base64解码LTPAToken
36        final byte[] ltpaByteArray = Base64.decodeBase64(encryptedLtpaToken
37                .getBytes());
38        // 使用key解密已Base64解码的LTPAToken
39        return decrypt(ltpaByteArray, key);
40    }
41    // DESede/ECB/PKC5Padding解方法
42    public static byte[] decrypt(byte[] ciphertext, byte[] key)
43            throws Exception {
44        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
45        final KeySpec keySpec = new DESedeKeySpec(key);
46        final Key secretKey = SecretKeyFactory.getInstance("TripleDES")
47                .generateSecret(keySpec);
48        cipher.init(Cipher.DECRYPT_MODE, secretKey);
49        return cipher.doFinal(ciphertext);
50    }
51

解析出来的LTPAToken信息以%分隔。

 
参考资源:
1)hannover,LTPA Cookie原理

Cookie防伪造防修改 电商课题:cookie防篡改的更多相关文章

  1. SpringBoot微服务电商项目开发实战 --- api接口安全算法、AOP切面及防SQL注入实现

    上一篇主要讲了整个项目的子模块及第三方依赖的版本号统一管理维护,数据库对接及缓存(Redis)接入,今天我来说说过滤器配置及拦截设置.接口安全处理.AOP切面实现等.作为电商项目,不仅要求考虑高并发带 ...

  2. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(四)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(四) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

  3. 电商安全无小事,如何有效地抵御 CSRF 攻击?

    现在,我们绝大多数人都会在网上购物买东西.但是很多人都不清楚的是,很多电商网站会存在安全漏洞.比如乌云就通报过,国内很多家公司的网站都存在 CSRF 漏洞.如果某个网站存在这种安全漏洞的话,那么我们在 ...

  4. Java生鲜电商平台-商家支付系统与对账系统架构实战

    Java生鲜电商平台-商家支付系统与对账系统架构实战 说明:关于生鲜电商平台,支付系统是连接消费者.商家(或平台)和金融机构的桥梁,管理支付数据,调用第三方支付平台接口,记录支付信息(对应订单号,支付 ...

  5. 架构设计 | 基于电商交易流程,图解TCC事务分段提交

    本文源码:GitHub·点这里 || GitEE·点这里 一.场景案例简介 1.场景描述 分布式事务在业务系统中是十分常见的,最经典的场景就是电商架构中的交易业务,如图: 客户端通过请求订单服务,执行 ...

  6. Java生鲜电商平台-API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)

    Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...

  7. .NET Core/.NET5/.NET6 开源项目汇总7:电商项目

    系列目录     [已更新最新开发文章,点击查看详细] 谈起.NET/.NET Core的企业级实战案例,电商项目是典型代表.其中高负载.高并发.高可用性等问题是考核.NET技术性能的重要指标.下面整 ...

  8. Linux-某电商网站流量劫持案例分析与思考

    [前言] 自腾讯与京东建立了战略合作关系之后,笔者网上购物就首选京东了.某天在家里访问京东首页的时候突然吃惊地发现浏览器突然跳到了第三方网站再回到京东,心里第一个反应就是中木马了. 竟然有这样的事,一 ...

  9. 如何一步一步用DDD设计一个电商网站(十一)—— 最后的准备

     阅读目录 前言 准备 实现 结语 一.前言 最近实在太忙,上周停更了一周.按流程一步一步走到现在,到达了整个下单流程的最后一公里——结算页的处理.从整个流程来看,这里需要用户填写的信息是最多的,那么 ...

随机推荐

  1. WebGL 绘制Line的bug(三)

    之前铺垫了许多,今天可以来分享点纯干货了. 上一篇已经讲述了通过面模拟线条时候,每一个顶点的顶点数据包括:端点坐标.偏移量.前一个端点坐标.后一个端点坐标,当然如果我们通过索引的方式来绘制的话,还包括 ...

  2. Apache web服务

    1.apache 1> 世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2> http 超文本协议 HTML超文本标记语言 3> URL 统一资源定位 ...

  3. NTP服务和DNS服务

    1.NTP时间服务器 作用:NTP主要用于对计算机的时间同步管理操作 1.1  NTP部署 服务端:192.168.16.6 客户端:192.168.16.7 [root@localhost ~]# ...

  4. Nowcoder 106 C.Professional Manager(统计并查集的个数)

    题意: 给出四种操作: 1. 合并u,v两棵树 2. 从u所在的集合中删除u 3. 询问u所在集合有多少颗树 4. 询问 u,v是否在同一个集合 分析: 对于删除操作, 只要新开一个点代替原来的点即可 ...

  5. C语言 NULL 是什么鬼

    NULL , 0 , '\0'  之间的区别与联系 1.NULL 结构体的使用中,都可以用NULL表示空,那么NULL是什么 #ifndef __cplusplus #define NULL ((vo ...

  6. [第一波模拟\day2\T1] {病毒分裂}(split.cpp)

    [题目描述] A 学校的实验室新研制出了一种十分厉害的病毒.由于这种病毒太难以人工制造了,所以专家们在一开始只做出了一个这样的病毒.这个病毒被植入了特殊的微型芯片,使其可以具有一些可编程的特殊性能.最 ...

  7. Sql按照字段分组,选取其他字段最值所在的行记录

    引言: 为什么会引入这个问题,在程序中遇到这样的问题,在某个数据表中,相同的AID(项目ID)被多次添加到数据表中,所以对应于不同的时间,只想选取添加时间最早的哪一条记录. 参考:红黑联盟 所用到的数 ...

  8. [AI开发]基于DeepStream的视频结构化解决方案

    视频结构化的定义 利用深度学习技术实时分析视频中有价值的内容,并输出结构化数据.相比数据库中每条结构化数据记录,视频.图片.音频等属于非结构化数据,计算机程序不能直接识别非结构化数据,因此需要先将这些 ...

  9. C#窗体学生成绩管理系统

    c#学生成绩管理系统 实现用户登录.注册 所有成绩查询.个人成绩查询 管理员审核.添加.删除用户 项目源码GIT:https://github.com/soulsjie/StuScoreMa.git

  10. Codeforces 653D Delivery Bears【二分+网络流】

    题目链接: http://codeforces.com/problemset/problem/653/D 题意: x个熊拿着相同重量的物品,从1号结点沿着路走到N号结点,结点之间有边相连,保证可以从1 ...