Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

99 lignes
3.3 KiB

  1. const { createHash, createHmac, createCipheriv, createDecipheriv, randomBytes, scryptSync, randomUUID } = require('crypto');
  2. const { v4: uuidv4 } = require('uuid');
  3. module.exports = {
  4. randomUUID: function() {
  5. return randomUUID ? randomUUID() : uuidv4();
  6. },
  7. md5: function(data, salt, enc) {
  8. return hash('md5', data, salt, enc)
  9. },
  10. sha1: function(data, salt, enc) {
  11. return hash('sha1', data, salt, enc)
  12. },
  13. sha256: function(data, salt, enc) {
  14. return hash('sha256', data, salt, enc)
  15. },
  16. sha512: function(data, salt, enc) {
  17. return hash('sha512', data, salt, enc)
  18. },
  19. hash: function(data, alg, enc) {
  20. return hash(alg, data, '', enc);
  21. },
  22. hmac: function(data, alg, secret, enc) {
  23. return hmac(alg, data, secret, enc);
  24. },
  25. transform: function(data, from, to) {
  26. return transform(data, from, to);
  27. },
  28. encodeBase64: function(data, enc) {
  29. enc = typeof enc == 'string' ? enc : 'utf8';
  30. return transform(data, enc, 'base64');
  31. },
  32. decodeBase64: function(data, enc) {
  33. enc = typeof enc == 'string' ? enc : 'utf8';
  34. return transform(data, 'base64', enc);
  35. },
  36. encodeBase64Url: function(data, enc) {
  37. enc = typeof enc == 'string' ? enc : 'utf8';
  38. return transform(data, enc, 'base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
  39. },
  40. decodeBase64Url: function(data, enc) {
  41. enc = typeof enc == 'string' ? enc : 'utf8';
  42. return transform(data.replace(/-/g, '+').replace(/_/g, '/'), 'base64', enc);
  43. },
  44. encrypt: function(data, password, enc) {
  45. const config = require('../setup/config');
  46. password = typeof password == 'string' ? password : config.secret;
  47. enc = typeof enc == 'string' ? enc : 'base64';
  48. const iv = randomBytes(16);
  49. const key = scryptSync(password, iv, 32);
  50. const cipher = createCipheriv('aes-256-cbc', key, iv);
  51. const encrypted = cipher.update(data, 'utf8', enc);
  52. return iv.toString(enc) + '.' + encrypted + cipher.final(enc);
  53. },
  54. decrypt: function(data, password, enc) {
  55. const config = require('../setup/config');
  56. password = typeof password == 'string' ? password : config.secret;
  57. enc = typeof enc == 'string' ? enc : 'base64';
  58. const iv = Buffer.from(data.split('.')[0], enc);
  59. const key = scryptSync(password, iv, 32);
  60. const decipher = createDecipheriv('aes-256-cbc', key, iv);
  61. const decrypted = decipher.update(data.split('.')[1], enc, 'utf8');
  62. return decrypted + decipher.final('utf8');
  63. },
  64. };
  65. function hash(alg, data, salt, enc) {
  66. if (data == null) return data;
  67. salt = typeof salt == 'string' ? salt : '';
  68. enc = typeof enc == 'string' ? enc : 'hex';
  69. return createHash(alg).update(data + salt).digest(enc);
  70. }
  71. function hmac(alg, data, secret, enc) {
  72. if (data == null) return data;
  73. secret = typeof secret == 'string' ? secret : '';
  74. enc = typeof enc == 'string' ? enc : 'hex';
  75. return createHmac(alg, secret).update(data).digest(enc);
  76. }
  77. function transform(data, from, to) {
  78. if (data == null) return data;
  79. return Buffer.from(String(data), from).toString(to);
  80. }