-
-
Save isayme/44a82a15dc49c356743c95223cb7166a to your computer and use it in GitHub Desktop.
linux password sha512 encrypt with nodejs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const crypto = require('crypto') | |
const SALT_LEN_MAX = 16 | |
const DEFAULT_ROUNDS = 5000 | |
function sha512crypt(key, salt) { | |
salt = salt.slice(0, SALT_LEN_MAX) | |
let cnt = 0 | |
// step 1-3 | |
const hashA = crypto.createHash('sha512') | |
hashA.update(key) | |
hashA.update(salt) | |
// step 4-8 | |
const hashB = crypto.createHash('sha512') | |
hashB.update(key) | |
hashB.update(salt) | |
hashB.update(key) | |
let altResult = hashB.digest() | |
// step: 9-10 | |
for (cnt = key.length; cnt > 64; cnt -= 64) { | |
hashA.update(altResult) | |
} | |
hashA.update(altResult.slice(0, cnt)) | |
// setp: 11-12 | |
for (cnt = key.length; cnt > 0; cnt >>= 1) { | |
if ((cnt & 1) != 0) { | |
hashA.update(altResult) | |
} else { | |
hashA.update(key) | |
} | |
} | |
altResult = hashA.digest() | |
// step: 13-15 | |
const hashDP = crypto.createHash('sha512') | |
for (cnt = 0; cnt < key.length; cnt++) { | |
hashDP.update(password) | |
} | |
let tempResult = hashDP.digest() | |
// step: 16 | |
let P = Buffer.from('') | |
for (cnt = key.length; cnt > 64; cnt -= 64) { | |
P = Buffer.concat([P, tempResult]) | |
} | |
P = Buffer.concat([P, tempResult.slice(0, cnt)]) | |
// step: 17-19 | |
const hashDS = crypto.createHash('sha512') | |
for (cnt = 0; cnt < 16 + altResult[0]; ++cnt) hashDS.update(salt) | |
tempResult = hashDS.digest() | |
// step: 20 | |
let S = Buffer.from('') | |
for (cnt = salt.length; cnt >= 64; cnt -= 64) { | |
S = Buffer.concat([S, tempResult]) | |
} | |
S = Buffer.concat([S, tempResult.slice(0, cnt)]) | |
// step: 21 | |
for (cnt = 0; cnt < DEFAULT_ROUNDS; ++cnt) { | |
const hashC = crypto.createHash('sha512') | |
if ((cnt & 1) != 0) { | |
hashC.update(P.slice(0, key.length)) | |
} else { | |
hashC.update(altResult) | |
} | |
if (cnt % 3 != 0) { | |
hashC.update(S.slice(0, salt.length)) | |
} | |
if (cnt % 7 != 0) { | |
hashC.update(P.slice(0, key.length)) | |
} | |
if ((cnt & 1) != 0) { | |
hashC.update(altResult) | |
} else { | |
hashC.update(P.slice(0, key.length)) | |
} | |
altResult = hashC.digest() | |
} | |
// step: 22 | |
const result = [ | |
radix64(Buffer.from([altResult[0], altResult[21], altResult[42]])), | |
radix64(Buffer.from([altResult[22], altResult[43], altResult[1]])), | |
radix64(Buffer.from([altResult[44], altResult[2], altResult[23]])), | |
radix64(Buffer.from([altResult[3], altResult[24], altResult[45]])), | |
radix64(Buffer.from([altResult[25], altResult[46], altResult[4]])), | |
radix64(Buffer.from([altResult[47], altResult[5], altResult[26]])), | |
radix64(Buffer.from([altResult[6], altResult[27], altResult[48]])), | |
radix64(Buffer.from([altResult[28], altResult[49], altResult[7]])), | |
radix64(Buffer.from([altResult[50], altResult[8], altResult[29]])), | |
radix64(Buffer.from([altResult[9], altResult[30], altResult[51]])), | |
radix64(Buffer.from([altResult[31], altResult[52], altResult[10]])), | |
radix64(Buffer.from([altResult[53], altResult[11], altResult[32]])), | |
radix64(Buffer.from([altResult[12], altResult[33], altResult[54]])), | |
radix64(Buffer.from([altResult[34], altResult[55], altResult[13]])), | |
radix64(Buffer.from([altResult[56], altResult[14], altResult[35]])), | |
radix64(Buffer.from([altResult[15], altResult[36], altResult[57]])), | |
radix64(Buffer.from([altResult[37], altResult[58], altResult[16]])), | |
radix64(Buffer.from([altResult[59], altResult[17], altResult[38]])), | |
radix64(Buffer.from([altResult[18], altResult[39], altResult[60]])), | |
radix64(Buffer.from([altResult[40], altResult[61], altResult[19]])), | |
radix64(Buffer.from([altResult[62], altResult[20], altResult[41]])), | |
radix64(Buffer.from([0, 0, altResult[63]])).slice(0, 2), | |
].join('') | |
return result | |
} | |
const radix64Encoder = | |
'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' | |
function radix64(buffer) { | |
let v = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2] | |
const c1Idx = v & 0x3f | |
v = v >> 6 | |
const c2Idx = v & 0x3f | |
v = v >> 6 | |
const c3Idx = v & 0x3f | |
v = v >> 6 | |
const c4Idx = v & 0x3f | |
v = v >> 6 | |
return ( | |
radix64Encoder[c1Idx] + | |
radix64Encoder[c2Idx] + | |
radix64Encoder[c3Idx] + | |
radix64Encoder[c4Idx] | |
) | |
} | |
const password = '123456' | |
const salt = 'PCjFvrAA/NnyKdMp' | |
const encryptPassword = sha512crypt(password, salt) | |
console.log(encryptPassword) |
Author
isayme
commented
Jan 5, 2021
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment