作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我在考虑构建一个小型的安全服务,让用户上传文件并使用接收方的公钥对该文件进行编码。关键是我想即时执行此操作,因此上传前无需编码,而是作为其中的一部分。我开始在网上搜索,但找不到任何直接的答案。这可能吗?
最佳答案
您必须在上传文件之前执行加密。
我提供了一个客户端加密/解密的简单示例(使用凯撒加密)。
本质上,它使用 FileReader
API 将文件的内容转换为 ArrayBuffer
。使用类型化数组(在本例中为 Uint8Array
),您可以修改原始 ArrayBuffer
的每个字节,并执行加密。
加密完成后,您就可以继续发送数据了。
let input = document.getElementById('input');
let img = document.getElementById('myImg');
let caesarKey = document.getElementById('caesarKey');
let log = document.getElementById('log');
document.getElementById('encrypt').addEventListener('click',encrypt);
document.getElementById('decrypt').addEventListener('click',decrypt);
// variables to store the image data, a d the encrypted image data
let imgData;
let encryptedData;
// prepare the file reader, and the onload callback
let reader = new FileReader();
reader.onload = e=>{
log.innerHTML='Image ready! Press encrypt button...'
imgData = reader.result;
}
// declare the file input onchangen handler
input.addEventListener('change', e=> {
log.innerHTML='...processing image'
reader.readAsArrayBuffer(e.target.files[0]);
});
// caesar encrypt function
function encrypt(){
log.innerHTML='Encrypting...'
let key = Number( caesarKey.value )
encryptedData = new Uint8Array(imgData);
for(let i=0;i<encryptedData.byteLength;i++){
encryptedData[i] = encryptedData[i]+key;
}
log.innerHTML='Image encrypted! Press decrypt...'
}
// caesar decrypt function, and image output
function decrypt(){
log.innerHTML='Decrypting...'
let key = Number( caesarKey.value );
for(let i=0;i<encryptedData.byteLength;i++){
encryptedData[i] = encryptedData[i]-key;
}
// output the image
var blob = new Blob( [ encryptedData ], { type: "image/jpeg" } );
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL( blob );
img.src = imageUrl;
log.innerHTML='Image decrypted! '
}
#log{
padding:5px;
text-align:center;
background-color:blue;
color:white;
margin:5px;
}
<div id="log">--Select a jpg Image--</div>
<input type="file" accept=".jpg" id="input"><br>
Caesar Shift value:
<input type="text" id="caesarKey" value="5"><br>
<input type="button" value="Caesar Encrypt" id="encrypt">
<input type="button" value="Caesar Decrypt" id="decrypt">
<img id="myImg">
关于javascript - 是否可以动态编码/解码上传的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52691079/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!