- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-21-2018 11:41 AM
Does anyone know a way to generate SHA256 Hash for a given Sting ?
Say my String is "ABC"
and my Key is "KEY"
Solved! Go to Solution.
- Labels:
-
Scripting and Coding
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2019 07:52 AM
So, I finally got it.
SHA256 is a hashing algorithm. So there is no KEY involved, and SHA256 is not an encryption algorithm but its a hashing algorithm.
The below script include will do the trick:
var SHA256Hashing = Class.create();
SHA256Hashing.prototype =
{
initialize: function()
{
var chrsz = 8;
var hexcase = 0;
},
SHA256:function(s)
{
var chrsz = 8;
var hexcase = 0;
s = this.Utf8Encode(s);
return this.binb2hex(this.core_sha256(this.str2binb(s), s.length * chrsz));
},
safe_add:function (x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
},
S :function(X, n) { return ( X >>> n ) | (X << (32 - n)); },
R :function(X, n) { return ( X >>> n ); },
Ch:function(x, y, z) { return ((x & y) ^ ((~x) & z)); },
Maj:function(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); },
Sigma0256:function(x) { return (this.S(x, 2) ^ this.S(x, 13) ^ this.S(x, 22)); },
Sigma1256:function(x) { return (this.S(x, 6) ^ this.S(x, 11) ^ this.S(x, 25)); },
Gamma0256:function(x) { return (this.S(x, 7) ^ this.S(x, 18) ^ this.R(x, 3)); },
Gamma1256:function(x) { return (this.S(x, 17) ^ this.S(x, 19) ^ this.R(x, 10)); },
core_sha256 :function(m, l)
{
var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 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);
var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
var W = new Array(64);
var a, b, c, d, e, f, g, h, i, j;
var T1, T2;
m[l >> 5] |= 0x80 << (24 - l % 32);
m[((l + 64 >> 9) << 4) + 15] = l;
for ( var i = 0; i<m.length; i+=16 )
{
a = HASH[0];
b = HASH[1];
c = HASH[2];
d = HASH[3];
e = HASH[4];
f = HASH[5];
g = HASH[6];
h = HASH[7];
for ( var j = 0; j<64; j++)
{
if (j < 16) W[j] = m[j + i];
else W[j] = this.safe_add(this.safe_add(this.safe_add(this.Gamma1256(W[j - 2]), W[j - 7]), this.Gamma0256(W[j - 15])), W[j - 16]);
T1 = this.safe_add(this.safe_add(this.safe_add(this.safe_add(h, this.Sigma1256(e)), this.Ch(e, f, g)), K[j]), W[j]);
T2 = this.safe_add(this.Sigma0256(a), this.Maj(a, b, c));
h = g;
g = f;
f = e;
e = this.safe_add(d, T1);
d = c;
c = b;
b = a;
a = this.safe_add(T1, T2);
}
HASH[0] = this.safe_add(a, HASH[0]);
HASH[1] = this.safe_add(b, HASH[1]);
HASH[2] = this.safe_add(c, HASH[2]);
HASH[3] = this.safe_add(d, HASH[3]);
HASH[4] = this.safe_add(e, HASH[4]);
HASH[5] = this.safe_add(f, HASH[5]);
HASH[6] = this.safe_add(g, HASH[6]);
HASH[7] = this.safe_add(h, HASH[7]);
}
return HASH;
},
str2binb :function(str)
{
var chrsz = 8;
var bin = Array();
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz)
{
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
}
return bin;
},
Utf8Encode:function(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;
},
binb2hex :function(binarray)
{
var hexcase = 0;
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;
}
};
Usage :
var sha256Obj = new SHA256Hashing();
var stringToBeHashed = "hash me";
var hash = sha256Obj.SHA256(stringToBeHashed);
gs.print(hash);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2019 09:47 PM
Thank you for sharing back 🙂

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
11-04-2019 10:32 PM
Honestly, I would never use such code. It is interesting from an educational point of view, but rolling your own crypto functions is downright irresponsible.
As expected, Service Now provides such functions in the API:
https://developer.servicenow.com/app.do#!/api_doc?v=madrid&id=c_GlideDigestScopedAPI
I really recommend to use those.
If this answer was helpful, I would appreciate if you marked it as such - thanks!
Best
Daniel