概述:
除了 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:%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信息以%分隔。

来源:http://www.cnblogs.com/zhengyun_ustc/archive/2012/11/17/topic3.html

cookie防篡改的更多相关文章

  1. 网站如何防Session冒名顶替和cookie防篡改

    做网站难免要面对安全性的问题,诸如sql注入拉,cookie冒名拉,等等,sql注入算是老生常谈,翻翻旧账有不少优秀的帖子在说明这个问题,所以我们来说说Session冒名顶替的风险以及应对的办法. 首 ...

  2. Cookie防篡改机制

    一.为什么Cookie需要防篡改 为什么要做Cookie防篡改,一个重要原因是 Cookie中存储有判断当前登陆用户会话信息(Session)的会话票据-SessionID和一些用户信息. 当发起一个 ...

  3. Cookie防伪造防修改 电商课题:cookie防篡改

    主要防止非法用户修改cookie信息,以及cookie的超时时间 传统cookie存储,Cookie(name, value),value很容易就被篡改. 防修改cookie存储,Cookie(nam ...

  4. cookie安全隐患及防篡改机制

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  5. Spring Boot如何设计防篡改、防重放攻击接口

    Spring Boot 防篡改.防重放攻击 本示例要内容 请求参数防止篡改攻击 基于timestamp方案,防止重放攻击 使用swagger接口文档自动生成 API接口设计 API接口由于需要供第三方 ...

  6. JavaScript中的防篡改对象

    由于JavaScript共享的特性,任何对象都可以被放在同一环境下运行的代码修改. 例如: var person = {name:"caibin'} person.age = 21; 即使第 ...

  7. WebApi系列~安全校验中的防篡改和防复用

    回到目录 web api越来越火,因为它的跨平台,因为它的简单,因为它支持xml,json等流行的数据协议,我们在开发基于面向服务的API时,有个问题一直在困扰着我们,那就是数据的安全,请求的安全,一 ...

  8. 01WebApi防篡改机制---HMAC机制

    防篡改,顾名思义就是防止有人恶意篡改请求数据URL以达到恶意攻击的目的,那要怎么才能实现这样的目的呢? 很简单,将要请求的数据加上合作号.合作Key按规则组织成一个字符串,获取对应的MD5摘要,然后将 ...

  9. WebAPI 用户认证防篡改实现HMAC(二)签名验证 AbsBaseAuthenticationAttribute--转

    public class ActionFilter : ActionFilterAttribute      {          public override void OnActionExecu ...

随机推荐

  1. 【UVA1633】禁止的回文串(状压DP)

    题意: 输入正整数n和k(1<=n<=400,1<=k<=10),求长度为n的01串中有多少个不含长度至少为k的回文连续子串.例如,n=k=3时只有4个串满足条件:001,01 ...

  2. JSP页面间传递参数的5种方法

    JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...

  3. Copying Linked Lists with Random Pointers

    Copying Linked Lists with Random Pointers 两个方法:方法一: 1.不考虑随机指针的情况下复制链表: 2.在复制过程中建立一个以原链表节点地址为key,相应的复 ...

  4. 2.5.3 使用alertDialog创建自定义对话框

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  5. ORACLE数据缓冲区DB cache

    DB CACHE是以数据块为单位组织的缓冲区,数据库刚刚启动的时候,DB CACHE中几乎没有用户数据的缓冲,当会话访问数据库中的表或索引时,首先会检查DB CACHE中是否存在该数据,如果不存在,就 ...

  6. BJUI 转

    B-JUI 前端框架B-JUI(Bootstrap for DWZ)是一个富客户端框架,基于DWZ-jUI富客户端框架修改. 本文是B-JUI中文使用手册,包括使用示例代码,感兴趣的同学参考下. 概览 ...

  7. 帮助招聘程序员的自动考试网站:Codility

    Automated tests of programming skills. Assessment of software developers. Recruitment software. Codi ...

  8. cubietruck+ vncserver+source+wlan0 分类: cubieboard 2014-11-08 17:25 159人阅读 评论(0) 收藏

    正常ubuntu下直接搜索remote desktop 进行配置,好用而且友好.. modprobe bcmdhd lsmod ifconfig wlan0 up vi /etc/network/in ...

  9. java不求有功,但求无过—异常处理

    在程序开发中,错误往往有两种.一种是编译时出现的错误,该种错误比較easy发现.还有一种是执行时出现的错误,该种错误是开发者比較头疼的.异常就是一个执行时的错误,比如,除数为0 ,数组越界等. 异常处 ...

  10. CHAR 详解

    CHAR(20):20指的是表中的a字段能存储的最大字符个数 CREATE TABLE `a` ( `a` char(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT C ...