文档章节

电商课题:cookie防篡改

旁观者-郑昀
 旁观者-郑昀
发布于 2012/11/24 14:02
字数 921
阅读 139
收藏 4

@郑昀汇总 

关键词: 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, 0, 20);
25        // 使用0替换后4个字节
26        Arrays.fill(hash3DES, 20, 24, (byte) 0);
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原理

© 著作权归作者所有

旁观者-郑昀
粉丝 100
博文 77
码字总数 162700
作品 0
朝阳
私信 提问
加载中

评论(1)

z
zx32342342
赞, 这个还是很有用的, 不过很多情况下, cookie都会加密后存储的, 敏感也没人能获取到真实内容
关于 Multiget hole:spymemcached对此的实现方法

火丁说: 『 Multiget的无底洞问题 Facebook在Memcached的实际应用中,发现了Multiget无底洞问 题,具体表现为:出于效率的考虑,很多Memcached应用都已Multiget操作为主,随着访问量的增加,...

旁观者-郑昀
2013/02/08
127
0
spymemcached :某个mc节点操作连续超时超过998次就 Auto-Reconne...

spymemcached 中,一个 mc client 与某一个 mc node 之间已建立的 connection 上, 如果执行操作屡屡超时(net.spy.memcached.OperationTimeoutException), 那么,有一个计数器专门记录超时...

旁观者-郑昀
2013/02/08
162
0
spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据

先说一下结论。 如果你没有特意在 spymemcached 的 client bean definition 里配置 useNagleAlgorithm 属性为 True, 那么默认 spymemcached 是不启用 Nagle 算法的。 所以默认情况下不会引发...

旁观者-郑昀
2013/02/08
167
0
SEnginx配置cookie防篡改、网页防篡改、机器人挑战后如何验证

小女子职场新人,向各位大侠请教一个问题: SEnginx上配置cookie防篡改、网页防篡改、机器人挑战后如何验证?

小苏1106
2014/06/12
722
2
Express cookie-parser

Cookie 防篡改机制 服务器可以为每个Cookie项生成签名,由于用户篡改Cookie后无法生成对应的签名, 服务器便可以得知用户对Cookie进行了篡改。 1. 在服务器中配置一个不为人知的字符串(我们...

博为峰教研组
2016/12/02
1
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 你已经是个成熟的熊猫了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Sharon啊 :#今日歌曲推荐# 分享黑鸭子的单曲《羞答答的玫瑰静悄悄的开》 《羞答答的玫瑰静悄悄的开》- 黑鸭子 手机党少年们想听歌,请使劲儿...

小小编辑
26分钟前
104
5
结合Spring Security进行web应用会话安全管理

在本文中,将为大家说明如何结合Spring Security 和Spring Session管理web应用的会话。 一、Spring Security创建使用session的方法 Spring Security提供4种方式精确的控制会话的创建: alwa...

fightinging
31分钟前
3
0
83、Mybatis和Hibernate重要区别

Mybatis;入门简单,程序容易上手开发,节省开发成本。Mybatis需要程序猿自己编写sql语句,是一个不完全的ORM框架,对sql修改和优化非常容易实现。 Mybatis适合开发需求变更频繁的系统,比如...

lianbang_W
今天
5
0
设计模式之状态模式

定义 Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改...

陈年之后是青葱
今天
6
0
Python常用模块之os.path

os.path.abspath(path) 输入相对路径,返回绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32Type "copyright", "credits" or "lic......

松鼠大帝
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部