uniapp无法获取阿里云oss文件Buket(防盗链)签名

uniapp无法获取阿里云oss文件Buket签名

当阿里云oss将文件权限设为私有时,需要获取到正确的签名才能访问到,这样可以防止私密数据外泄,官文地址: 阿里云URL签名

web端的使用

  • 先装依赖 npm install ali-oss
  • 再根据文档获取正确地址
const OSS = require('ali-oss');
 
const client = new OSS({
    
     
  // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourRegion',
  // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // 从STS服务获取的安全令牌(SecurityToken)。
  stsToken: 'yoursecurityToken',
  // 填写Bucket名称。
  bucket: 'examplebucket',
});
 
let url;
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。文件URL的有效时长默认为1800秒,即30分钟。
url = client.signatureUrl('exampleobject.txt');
console.log(url);
 
// 设置URL的有效时长为3600,单位为秒。如果不设置有效时长,则默认值为1800。
//url = client.signatureUrl('exampleobject.txt', {expires: 3600});
//console.log(url);  

APP端的使用

如果你的项目只有小程序或H5,也能使用上述方案,但如果是在APP端或希望项目体积更小,则需使用下面的方法

关键文件

新建crypto文件夹,并创建以下js文件
在这里插入图片描述

  • crypto.js
//crypto.js
 
var Buffer = require('buffer').Buffer;
var sha = require('./sha');
var md5 = require('./md5');
 
var algorithms = {
    
    
  sha1: sha,
  md5: md5
};
 
var blocksize = 64;
var zeroBuffer = Buffer.alloc(blocksize);
zeroBuffer.fill(0);
 
function hmac(fn, key, data) {
    
    
  if(!Buffer.isBuffer(key)) key = Buffer.from(key);
  if(!Buffer.isBuffer(data)) data = Buffer.from(data);
 
  if(key.length > blocksize) {
    
    
    key = fn(key)
  } else if(key.length < blocksize) {
    
    
    key = Buffer.concat([key, zeroBuffer], blocksize)
  }
 
  var ipad = Buffer.alloc(blocksize), opad = Buffer.alloc(blocksize);
  for(var i = 0; i < blocksize; i++) {
    
    
    ipad[i] = key[i] ^ 0x36
    opad[i] = key[i] ^ 0x5C
  }
 
  var hash = fn(Buffer.concat([ipad, data]))
  return fn(Buffer.concat([opad, hash]))
}
 
function hash(alg, key) {
    
    
  alg = alg || 'sha1';
  var fn = algorithms[alg];
  var bufs = [];
  var length = 0;
  if(!fn) error('algorithm:', alg, 'is not yet supported');
  return {
    
    
    update: function (data) {
    
    
      if(!Buffer.isBuffer(data)) data = Buffer.from(data);
 
      bufs.push(data);
      length += data.length;
      return this
    },
    digest: function (enc) {
    
    
      var buf = Buffer.concat(bufs);
      var r = key ? hmac(fn, key, buf) : fn(buf);
      bufs = null;
      return enc ? r.toString(enc) : r
    }
  }
}
 
function error () {
    
    
  var m = [].slice.call(arguments).join(' ')
  throw new Error([
    m,
    'we accept pull requests',
    'http://github.com/dominictarr/crypto-browserify'
  ].join('\n'))
}
 
exports.createHash = function (alg) {
    
     return hash(alg) };
exports.createHmac = function (alg, key) {
    
     return hash(alg, key) };
 
exports.createCredentials = () => {
    
    
  error('sorry,createCredentials is not implemented yet');
};
exports.createCipher = () => {
    
    
  error('sorry,createCipher is not implemented yet');
};
exports.createCipheriv = () => {
    
    
  error('sorry,createCipheriv is not implemented yet');
};
exports.createDecipher = () => {
    
    
  error('sorry,createDecipher is not implemented yet');
};
exports.createDecipheriv = () => {
    
    
  error('sorry,createDecipheriv is not implemented yet');
};
exports.createSign = () => {
    
    
  error('sorry,createSign is not implemented yet');
};
exports.createVerify = () => {
    
    
  error('sorry,createVerify is not implemented yet');
};
exports.createDiffieHellman = () => {
    
    
  error('sorry,createDiffieHellman is not implemented yet');
};
exports.pbkdf2 = () => {
    
    
  error('sorry,pbkdf2 is not implemented yet');
};
  • helpers.js
//helpers.js
var Buffer = require('buffer').Buffer;
var intSize = 4;
var zeroBuffer = Buffer.alloc(intSize); zeroBuffer.fill(0);
var chrsz = 8;
 
function toArray(buf, bigEndian) {
    
    
  if ((buf.length % intSize) !== 0) {
    
    
    var len = buf.length + (intSize - (buf.length % intSize));
    buf = Buffer.concat([buf, zeroBuffer], len);
  }
 
  var arr = [];
  var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE;
  for (var i = 0; i < buf.length; i += intSize) {
    
    
    arr.push(fn.call(buf, i));
  }
  return arr;
}
 
function toBuffer(arr, size, bigEndian) {
    
    
  var buf = Buffer.alloc(size);
  var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE;
  for (var i = 0; i < arr.length; i++) {
    
    
    fn.call(buf, arr[i], i * 4, true);
  }
  return buf;
}
 
function hash(buf, fn, hashSize, bigEndian) {
    
    
  if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf);
  var arr = fn(toArray(buf, bigEndian), buf.length * chrsz);
  return toBuffer(arr, hashSize, bigEndian);
}
 
module.exports = {
    
     hash: hash };
  • md5.js
//md5.js
/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
 
var helpers = require('./helpers');
 
/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
    
    
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
 
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
function core_md5(x, len)
{
    
    
  /* append padding */
  x[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;
 
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;
 
  for(var i = 0; i < x.length; i += 16)
  {
    
    
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
 
    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
 
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
 
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
 
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
 
    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);
 
}
 
/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn(q, a, b, x, s, t)
{
    
    
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
    
    
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
    
    
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
    
    
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
    
    
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
 
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
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.
 */
function bit_rol(num, cnt)
{
    
    
  return (num << cnt) | (num >>> (32 - cnt));
}
 
module.exports = function md5(buf) {
    
    
  return helpers.hash(buf, core_md5, 16);
};
  • sha.js
//sha.js
/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS PUB 180-1
 * Version 2.1a Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */
 
var helpers = require('./helpers');
 
/*
 * Calculate the SHA-1 of an array of big-endian words, and a bit length
 */
function core_sha1(x, len)
{
    
    
  /* append padding */
  x[len >> 5] |= 0x80 << (24 - len % 32);
  x[((len + 64 >> 9) << 4) + 15] = len;
 
  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)
  {
    
    
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    var olde = e;
 
    for(var j = 0; j < 80; j++)
    {
    
    
      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 Array(a, b, c, d, e);
 
}
 
/*
 * Perform the appropriate triplet combination function for the current
 * iteration
 */
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;
}
 
/*
 * Determine the appropriate additive constant for the current iteration
 */
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.
 */
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.
 */
function rol(num, cnt)
{
    
    
  return (num << cnt) | (num >>> (32 - cnt));
}
 
module.exports = function sha1(buf) {
    
    
  return helpers.hash(buf, core_sha1, 20, true);
};

使用

import crypto2 from '@/crypto/crypto.js'
function signatureUrl(e) {
    
    
	//e中包含从后端获取的必要参数和加密文件存在桶里的路径
	// 过期时间是半个小时后,所以加1800秒
	const EXPIRES = Date.parse(new Date()) / 1000 + 1800 //当前时间的1800秒以后,必须是时间戳格式
	let {
    
    
		bucket,
		加密文件桶路径,
		securityToken,
		accessKeySecret,
		accessKeyId,
		endPoint,
		region,
		// apiPrefix
	} = e;
	let canonicalString = `GET\n\n\n${
      
      EXPIRES}\n/${
      
      bucket}/${
      
      img}?security-token=${
      
      securityToken}`
		//签名拼接的字符串按照官方的要求。
		//要注意的是,如果你的图片下载需要临时授权的STS凭证,要把这个凭证也放进来签名。不然签名校验会失败
		let signature = crypto2.createHmac('sha1', accessKeySecret);
		let SignatureStr = encodeURIComponent(signature.update(Buffer.from(canonicalString, 'utf-8')).digest('base64'));
		//SignatureStr 就是你签名出来的东西
		//最后拼接起来
		return `${
      
      endPoint.slice(0, endPoint.indexOf(':'))}://${
      
      bucket}.${
      
      region}.aliyuncs.com/${
      
      加密文件桶路径}?OSSAccessKeyId=${
      
      accessKeyId}&Expires=${
      
      EXPIRES}&Signature=${
      
      SignatureStr}&security-token=${
      
      encodeURIComponent(securityToken)}`
	}

猜你喜欢

转载自blog.csdn.net/weixin_48888726/article/details/127775027