You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ExtJS应用中对登录表单提交的密码进行SHA1加密

嘿,这个问题我之前在做ExtJS项目的时候也碰到过!确实,ExtJS本身没有内置SHA1加密的工具函数,但咱们有两种很实用的解决方案,我给你详细说说:

方案1:手动实现SHA1工具类

因为SHA1是公开的标准加密算法,我们可以写一个纯JavaScript的实现,然后封装成ExtJS的单例工具类,方便在整个应用里调用。

首先,创建一个名为Ext.util.SHA1的单例类:

Ext.define('Ext.util.SHA1', {
    singleton: true,
    hash: function(str) {
        // UTF-8编码处理
        function utf8Encode(string) {
            string = string.replace(/\r\n/g, '\n');
            var utftext = '';
            for (var n = 0; n < string.length; n++) {
                var c = string.charCodeAt(n);
                if (c < 128) {
                    utftext += String.fromCharCode(c);
                } else if ((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                } else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
            }
            return utftext;
        }

        // 左旋转操作
        function rotateLeft(n, s) {
            return (n << s) | (n >>> (32 - s));
        }

        // 十六进制转换辅助函数
        function cvtHex(val) {
            var str = '';
            var i, v;
            for (i = 7; i >= 0; i--) {
                v = (val >>> (i * 4)) & 0x0f;
                str += v.toString(16);
            }
            return str;
        }

        var blockstart, i, j;
        var W = new Array(80);
        var H0 = 0x67452301;
        var H1 = 0xEFCDAB89;
        var H2 = 0x98BADCFE;
        var H3 = 0x10325476;
        var H4 = 0xC3D2E1F0;
        var A, B, C, D, E, temp;

        str = utf8Encode(str);
        var strLen = str.length;
        var wordArray = [];

        // 转换为32位字数组
        for (i = 0; i < strLen - 3; i += 4) {
            j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3);
            wordArray.push(j);
        }

        // 处理剩余字节
        switch (strLen % 4) {
            case 0: i = 0x080000000; break;
            case 1: i = str.charCodeAt(strLen - 1) << 24 | 0x0800000; break;
            case 2: i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000; break;
            case 3: i = str.charCodeAt(strLen - 3) << 24 | str.charCodeAt(strLen - 2) << 16 | str.charCodeAt(strLen - 1) << 8 | 0x80; break;
        }
        wordArray.push(i);

        // 填充到满足长度要求
        while ((wordArray.length % 16) != 14) wordArray.push(0);
        wordArray.push(strLen >>> 29);
        wordArray.push((strLen << 3) & 0x0ffffffff);

        // 主循环计算哈希
        for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) {
            for (i = 0; i < 16; i++) W[i] = wordArray[blockstart + i];
            for (i = 16; i <= 79; i++) W[i] = rotateLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);

            A = H0; B = H1; C = H2; D = H3; E = H4;

            for (i = 0; i <= 19; i++) {
                temp = (rotateLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
                E = D; D = C; C = rotateLeft(B, 30); B = A; A = temp;
            }
            for (i = 20; i <= 39; i++) {
                temp = (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
                E = D; D = C; C = rotateLeft(B, 30); B = A; A = temp;
            }
            for (i = 40; i <= 59; i++) {
                temp = (rotateLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
                E = D; D = C; C = rotateLeft(B, 30); B = A; A = temp;
            }
            for (i = 60; i <= 79; i++) {
                temp = (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
                E = D; D = C; C = rotateLeft(B, 30); B = A; A = temp;
            }

            H0 = (H0 + A) & 0x0ffffffff;
            H1 = (H1 + B) & 0x0ffffffff;
            H2 = (H2 + C) & 0x0ffffffff;
            H3 = (H3 + D) & 0x0ffffffff;
            H4 = (H4 + E) & 0x0ffffffff;
        }

        return (cvtHex(H0) + cvtHex(H1) + cvtHex(H2) + cvtHex(H3) + cvtHex(H4)).toLowerCase();
    }
});

然后在登录表单提交时,就可以直接调用这个工具类:

// 获取密码字段的值
var rawPassword = Ext.getCmp('loginPasswordField').getValue();
// 生成SHA1哈希
var hashedPassword = Ext.util.SHA1.hash(rawPassword);
// 将hashedPassword作为密码提交到后台
方案2:使用CryptoJS库(更简洁)

如果不想自己维护加密算法的代码,可以用成熟的CryptoJS库,它对SHA1等多种加密算法有完善的实现。

步骤如下:

  1. 下载CryptoJS的SHA1模块(或完整库),放到你的项目资源目录中。
  2. 在ExtJS应用中引入该脚本,可以通过Ext.Loader动态加载,或者在HTML页面中直接用<script>标签引入:
// 动态加载示例
Ext.Loader.loadScript({
    url: 'resources/js/crypto-js-sha1.min.js',
    onLoad: function() {
        // 加载完成后即可使用
    }
});
  1. 调用加密方法:
var rawPassword = Ext.getCmp('loginPasswordField').getValue();
var hashedPassword = CryptoJS.SHA1(rawPassword).toString();
// 提交加密后的密码
重要提醒
  • 无论使用哪种方式,一定要配合HTTPS协议传输数据,即使是加密后的哈希值,也能避免中间人攻击。
  • 如果后台需要Base64格式的SHA1结果,可以把十六进制哈希转成Base64,比如用ExtJS内置的Ext.util.Base64.encode()函数:
var base64Hashed = Ext.util.Base64.encode(hexHashedPassword);

内容的提问来源于stack exchange,提问作者SpazioInfo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:12:31