ionic使用sha1/sha256加密

在開(kāi)發(fā)中遇到網(wǎng)絡(luò)請(qǐng)求時(shí)需要對(duì)密碼進(jìn)行加密處理的需求,在網(wǎng)上花一定的功夫研究整理了sha1和sha256進(jìn)行加密的文件,分享出來(lái)給有需要的人用順便記錄一下ionic中使用js文件的方法

sha1加密:

/**//*  
 * Configurable variables.  
 */  
var hexcase = 0;  /**//* hex output format. 0 - lowercase; 1 - uppercase        */  
var chrsz   = 8;  /**//* bits per input character. 8 - ASCII; 16 - Unicode      */  
   
/**//*  
 * 調(diào)用此方法可以轉(zhuǎn)化為sha1值  
 */  
export function toSha1(s)  
{  
       return binb2hex(core_sha1(AlignSHA1(s)));  
}  
   
   
/**//*  
 * Perform a simple self-test to see if the VM is working  
 */  
function sha1_vm_test()  
{  
  return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";  
}  
   
   
/**//*  
 * Calculate the SHA-1 of an array of big-endian words, and a bit length  
 */  
function core_sha1(blockArray)  
{  
  var x = blockArray;  //append padding  
   
  var w = Array(80);  
  var a =  1732584193;  
  var b = -271733879;  
  var c = -1732584194;  
  var d =  271733878;  
  var e = -1009589776;  
   
  for(var i = 0; i < x.length; i += 16)  //每次處理512位 16*32  
  {  
    var olda = a;  
    var oldb = b;  
    var oldc = c;  
    var oldd = d;  
    var olde = e;  
   
    for(var j = 0; j < 80; j++)  //對(duì)每個(gè)512位進(jìn)行80步操作  
    {  
      if(j < 16) w[j] = x[i + j];  
      else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);  
        
      var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),  
                       safe_add(safe_add(e, w[j]), sha1_kt(j)));  
      e = d;  
      d = c;  
      c = rol(b, 30);  
      b = a;  
      a = t;  
    }  
   
    a = safe_add(a, olda);  
    b = safe_add(b, oldb);  
    c = safe_add(c, oldc);  
    d = safe_add(d, oldd);  
    e = safe_add(e, olde);  
  }  
  return new Array(a, b, c, d, e);  
   
}  
   
   
/**//*  
 * Perform the appropriate triplet combination function for the current iteration  
 * 返回對(duì)應(yīng)F函數(shù)的值  
 */  
function sha1_ft(t, b, c, d)  
{  
  if(t < 20) return (b & c) | ((~b) & d);  
  if(t < 40) return b ^ c ^ d;  
  if(t < 60) return (b & c) | (b & d) | (c & d);  
  return b ^ c ^ d;  //t<80  
}  
   
   
/**//*  
 * Determine the appropriate additive constant for the current iteration  
 * 返回對(duì)應(yīng)的Kt值  
 */  
function sha1_kt(t)  
{  
  return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :  
         (t < 60) ? -1894007588 : -899497514;  
}  
   
   
/**//*  
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally  
 * to work around bugs in some JS interpreters.  
 * 將32位數(shù)拆成高16位和低16位分別進(jìn)行相加牵素,從而實(shí)現(xiàn) MOD 2^32 的加法  
 */  
function safe_add(x, y)  
{  
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);  
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);  
  return (msw << 16) | (lsw & 0xFFFF);  
}  
   
   
/**//*  
 * Bitwise rotate a 32-bit number to the left.  
 * 32位二進(jìn)制數(shù)循環(huán)左移  
 */  
function rol(num, cnt)  
{  
  return (num << cnt) | (num >>> (32 - cnt));  
}  
   
   
/**//*  
 * The standard SHA1 needs the input string to fit into a block  
 * This function align the input string to meet the requirement  
 */  
function AlignSHA1(str){  
  var nblk=((str.length+8)>>6)+1, blks=new Array(nblk*16);  
  for(var i=0;i<nblk*16;i++)blks[i]=0;  
  for(i=0;i<str.length;i++)  
    blks[i>>2]|=str.charCodeAt(i)<<(24-(i&3)*8);  
  blks[i>>2]|=0x80<<(24-(i&3)*8);  
  blks[nblk*16-1]=str.length*8;  
  return blks;  
}  
   
   
/**//*  
 * Convert an array of big-endian words to a hex string.  
 */  
function binb2hex(binarray)  
{  
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";  
  var str = "";  
  for(var i = 0; i < binarray.length * 4; i++)  
  {  
    str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +  
           hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);  
  }  
  return str;  
}  

sha256加密:

/* 把data轉(zhuǎn)化為sha256的方法入口 */
export function toSha256(data) {
    sha256_init();
    sha256_update(data, data.length);
    sha256_final();
        return sha256_encode_hex();
}
/* SHA256 logical functions */
function rotateRight(n,x) {
    return ((x >>> n) | (x << (32 - n)));
}
function choice(x,y,z) {
    return ((x & y) ^ (~x & z));
}
function majority(x,y,z) {
    return ((x & y) ^ (x & z) ^ (y & z));
}
function sha256_Sigma0(x) {
    return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
}
function sha256_Sigma1(x) {
    return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
}
function sha256_sigma0(x) {
    return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
}
function sha256_sigma1(x) {
    return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
}
function sha256_expand(W, j) {
    return (W[j&0x0f] += sha256_sigma1(W[(j+14)&0x0f]) + W[(j+9)&0x0f] + 
sha256_sigma0(W[(j+1)&0x0f]));
}

/* Hash constant words K: */
var K256 = new Array(
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
);

/* global arrays */
var ihash, count, buffer;
var sha256_hex_digits = "0123456789abcdef";

/* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters: 
overflow) */
function safe_add(x, y)
{
    var lsw = (x & 0xffff) + (y & 0xffff);
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return (msw << 16) | (lsw & 0xffff);
}

/* Initialise the SHA256 computation */
function sha256_init() {
    ihash = new Array(8);
    count = new Array(2);
    buffer = new Array(64);
    count[0] = count[1] = 0;
    ihash[0] = 0x6a09e667;
    ihash[1] = 0xbb67ae85;
    ihash[2] = 0x3c6ef372;
    ihash[3] = 0xa54ff53a;
    ihash[4] = 0x510e527f;
    ihash[5] = 0x9b05688c;
    ihash[6] = 0x1f83d9ab;
    ihash[7] = 0x5be0cd19;
}

/* Transform a 512-bit message block */
function sha256_transform() {
    var a, b, c, d, e, f, g, h, T1, T2;
    var W = new Array(16);

    /* Initialize registers with the previous intermediate value */
    a = ihash[0];
    b = ihash[1];
    c = ihash[2];
    d = ihash[3];
    e = ihash[4];
    f = ihash[5];
    g = ihash[6];
    h = ihash[7];

        /* make 32-bit words */
    for(var i=0; i<16; i++)
        W[i] = ((buffer[(i<<2)+3]) | (buffer[(i<<2)+2] << 8) | (buffer[(i<<2)+1] 
<< 16) | (buffer[i<<2] << 24));

        for(var j=0; j<64; j++) {
        T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
        if(j < 16) T1 += W[j];
        else T1 += sha256_expand(W, j);
        T2 = sha256_Sigma0(a) + majority(a, b, c);
        h = g;
        g = f;
        f = e;
        e = safe_add(d, T1);
        d = c;
        c = b;
        b = a;
        a = safe_add(T1, T2);
        }

    /* Compute the current intermediate hash value */
    ihash[0] += a;
    ihash[1] += b;
    ihash[2] += c;
    ihash[3] += d;
    ihash[4] += e;
    ihash[5] += f;
    ihash[6] += g;
    ihash[7] += h;
}

/* Read the next chunk of data and update the SHA256 computation */
function sha256_update(data, inputLen) {
    var i, index, curpos = 0;
    /* Compute number of bytes mod 64 */
    index = ((count[0] >> 3) & 0x3f);
        var remainder = (inputLen & 0x3f);

    /* Update number of bits */
    if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
    count[1] += (inputLen >> 29);

    /* Transform as many times as possible */
    for(i=0; i+63<inputLen; i+=64) {
                for(var j=index; j<64; j++)
            buffer[j] = data.charCodeAt(curpos++);
        sha256_transform();
        index = 0;
    }

    /* Buffer remaining input */
    for(let j=0; j<remainder; j++)
        buffer[j] = data.charCodeAt(curpos++);
}

/* Finish the computation by operations such as padding */
function sha256_final() {
    var index = ((count[0] >> 3) & 0x3f);
        buffer[index++] = 0x80;
        if(index <= 56) {
        for(var i=index; i<56; i++)
            buffer[i] = 0;
        } else {
        for(var i=index; i<64; i++)
            buffer[i] = 0;
                sha256_transform();
                for(var i=0; i<56; i++)
            buffer[i] = 0;
    }
        buffer[56] = (count[1] >>> 24) & 0xff;
        buffer[57] = (count[1] >>> 16) & 0xff;
        buffer[58] = (count[1] >>> 8) & 0xff;
        buffer[59] = count[1] & 0xff;
        buffer[60] = (count[0] >>> 24) & 0xff;
        buffer[61] = (count[0] >>> 16) & 0xff;
        buffer[62] = (count[0] >>> 8) & 0xff;
        buffer[63] = count[0] & 0xff;
        sha256_transform();
}

/* Split the internal hash values into an array of bytes */
function sha256_encode_bytes() {
        var j=0;
        var output = new Array(32);
    for(var i=0; i<8; i++) {
        output[j++] = ((ihash[i] >>> 24) & 0xff);
        output[j++] = ((ihash[i] >>> 16) & 0xff);
        output[j++] = ((ihash[i] >>> 8) & 0xff);
        output[j++] = (ihash[i] & 0xff);
    }
    return output;
}

/* Get the internal hash as a hex string */
function sha256_encode_hex() {
    var output = new String();
    for(var i=0; i<8; i++) {
        for(var j=28; j>=0; j-=4)
            output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
    }
    return output;
}

具體使用方法有兩種:

  • 把上述兩個(gè)js文件放在項(xiàng)目中,然后新建兩個(gè)對(duì)應(yīng)名稱的d.ts文件,聲明兩個(gè)入口文件之后在需要的地方調(diào)用即可
    例子:
    在sha1.js同一文件夾下新建sha1.d.ts文件
    內(nèi)容:
    export declare function toSha1
    然后在需要使用的地方調(diào)用
    import { toSha1} from "../sha1";

    val result=toSha1("zxc)//轉(zhuǎn)化zxc
    

    sha256同理

  • 直接把上面的內(nèi)容copy到一個(gè)ts文件中使用
    import { toSha1,toSha256 } from "../sha";
    val result=toSha1("zxc)//轉(zhuǎn)化zxc-sha1
    val result=toSha256("zxc)//轉(zhuǎn)化zxc-sha256

在通過(guò)d.ts文件聲明js文件中的方法時(shí),遇到Object(...) is not a function說(shuō)明聲明失敗了,失敗的原因可能有兩種:

  • 文件名錯(cuò)誤,文件名一定要和js文件相同 ,且是d.ts而不是ts,之前我就由于馬虎沒(méi)有注意到這個(gè)問(wèn)題導(dǎo)致浪費(fèi)了不少時(shí)間
  • js文件中的方法沒(méi)有export,沒(méi)有export的方法時(shí)不能通過(guò)這種方法來(lái)聲明并調(diào)用的,如果想通過(guò)ts文件聲明的方式來(lái)調(diào)用,必須將js中的方法加上前綴export

最后放上下載鏈接,希望可以幫助到需要的人
[sha]: https://github.com/AdamZero/js-sha.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伙菜,隨后出現(xiàn)的幾起案子碌嘀,更是在濱河造成了極大的恐慌惭缰,老刑警劉巖讨盒,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌习,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡银萍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門恤左,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贴唇,“玉大人,你說(shuō)我怎么就攤上這事飞袋〈疗” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵巧鸭,是天一觀的道長(zhǎng)瓶您。 經(jīng)常有香客問(wèn)我,道長(zhǎng)纲仍,這世上最難降的妖魔是什么呀袱? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮郑叠,結(jié)果婚禮上夜赵,老公的妹妹穿的比我還像新娘。我一直安慰自己乡革,他們只是感情好寇僧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著沸版,像睡著了一般嘁傀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上视粮,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天细办,我揣著相機(jī)與錄音,去河邊找鬼馒铃。 笑死蟹腾,一個(gè)胖子當(dāng)著我的面吹牛痕惋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娃殖,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼值戳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炉爆?” 一聲冷哼從身側(cè)響起堕虹,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芬首,沒(méi)想到半個(gè)月后赴捞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郁稍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年赦政,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耀怜。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恢着,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出财破,到底是詐尸還是另有隱情掰派,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布左痢,位于F島的核電站靡羡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俊性。R本人自食惡果不足惜略步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磅废。 院中可真熱鬧纳像,春花似錦、人聲如沸拯勉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宫峦。三九已至岔帽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間导绷,已是汗流浹背犀勒。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贾费。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓钦购,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親褂萧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子押桃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)导犹,斷路器唱凯,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中,在網(wǎng)絡(luò)通信谎痢、數(shù)據(jù)存儲(chǔ)磕昼、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 2,355評(píng)論 0 6
  • 人生不是一帆風(fēng)順的,有時(shí)你極力想實(shí)現(xiàn)的理想?yún)s總是有著許許多多阻礙节猿。很多人會(huì)勸你放棄票从,要你認(rèn)清現(xiàn)實(shí),這個(gè)時(shí)候滨嘱,自己的...
    臨風(fēng)誦書閱讀 233評(píng)論 1 1
  • 這就是冥想和專注帶來(lái)的感受发框,一種更高層次的專注躺彬、平靜以及對(duì)生命的徹悟。 我喜歡打羽毛球梅惯,當(dāng)我和別人練習(xí)時(shí)宪拥,我一般都...
    蔚來(lái)已來(lái)閱讀 2,887評(píng)論 25 121
  • 曾幾何時(shí),電影院里铣减,片尾曲響起她君,你卻還留在座位上,久久地不肯離去葫哗;曾幾何時(shí)缔刹,床頭案前,書已然合上劣针,你的心校镐,突然抽搐...
    拂曉起航閱讀 668評(píng)論 0 0