thảo luận Tổng hợp app 2FA, ưu và nhược điểm.

Cái anh cần t liệt kê cho anh hết 80% app 2fa đều hỗ trợ. Cần t liệt kê không? Hay anh chả thèm đọc luôn #1?

Vì không có app gì tính năng tương tư để thay thế google cả. Còn authy thì có đầy ra.

Tin tặc đầy rẫy ra thì anh cần phải bảo vệ bản thân mình mạnh hơn chứ. App đã bị hack mà anh còn nhảy vào dùng thì là anh coi thường tin tặc rồi còn gì. Anh coi thường thì t chả nói anh làm gì, tài khoản anh, anh chịu. Còn anh seeder xúi người khác dùng là tầm bậy t nói cho người ta biết.

Bitwarden, 2fas, microsoft auth

Đang dùng cả 3 luôn, ms thì chỉ cho acc ms, còn bit authen, authy và 2fas thì cho đủ loại tk nhưng ưng thằng 2fas nhất vì nó cho search cả tên web lẫn acc.
 
App đóng rồi thì xuất như nào vậy bạn ơi, mình hỏi cách làm đó, không phải troll gì cả
1. Bạn cài Authy desktop đăng nhập các thứ cho nó sync data về xong tắt đi
2. Giải nén file đính kèm rồi mở shortcut này lên
2.1 Kiểm tra list xem có cái nào có biểu tượng khoá thì click vào nhập password vào nhé
3. Vào link này: http://localhost:5858/ rồi chọn Twilio Authy
4. Chọn Sources => Snippets => new Snippets như hình dưới
1719157337432.png

5. paste đoạn code này vào
Nếu nhập vào Bitwarden
Code:
// Based on https://github.com/LinusU/base32-encode/blob/master/index.js
function hex_to_b32(hex) { let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; let bytes = []; for (let i = 0; i < hex.length; i += 2) { bytes.push(parseInt(hex.substr(i, 2), 16)); } let bits = 0; let value = 0; let output = ''; for (let i = 0; i < bytes.length; i++) { value = (value << 8) | bytes[i]; bits += 8; while (bits >= 5) { output += alphabet[(value >>> (bits - 5)) & 31]; bits -= 5; } } if (bits > 0) { output += alphabet[(value << (5 - bits)) & 31]; } return output; }

// from https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid#answer-2117523
function uuidv4() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }

// from https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93
function saveToFile(data, filename) { if (!data) { console.error('Console.save: No data'); return; } if (typeof data === "object") { data = JSON.stringify(data, undefined, 4) } const blob = new Blob([data], { type: 'text/json' }); const e = document.createEvent('MouseEvents'); const a = document.createElement('a'); a.download = filename; a.href = window.URL.createObjectURL(blob); a.dataset.downloadurl = ['text/json', a.download, a.href].join(':'); e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e); }

function deEncrypt({ log = false, save = false }) {
    const folder = {
        id: uuidv4(),
        name: 'Imported from Authy'
    };

    const bw = {
        "encrypted": false,
        "folders": [
            folder
        ],
        "items": appManager.getModel().map((i) => {
            let secretSeed = i.secretSeed;
            if (typeof secretSeed == "undefined") {
                secretSeed = i.encryptedSeed;
            }
            const secret = (i.markedForDeletion === false ? i.decryptedSeed : hex_to_b32(secretSeed));
            const period = (i.digits === 7 ? 10 : 30);

            const [issuer, rawName] = (i.name.includes(":"))
                ? i.name.split(":")
                : ["", i.name];
            const name = [issuer, rawName].filter(Boolean).join(": ");
            const totp = `otpauth://totp/${name}?secret=${secret}&digits=${i.digits}&period=${period}${issuer ? '&issuer=' + issuer : ''}`;

            return ({
                id: uuidv4(),
                organizationId: null,
                folderId: folder.id,
                type: 1,
                reprompt: 0,
                name,
                notes: null,
                favorite: false,
                login: {
                    username: null,
                    password: null,
                    totp
                },
                collectionIds: null
            });
        }),
    };

    if (log) console.log(JSON.stringify(bw));
    if (save) saveToFile(bw, 'authy-to-bitwarden-export.json');
}

deEncrypt({
    log: true,
    save: true,
});

Nếu nhập vào 2FSA/Raivo
Code:
// Based on https://github.com/LinusU/base32-encode/blob/master/index.js
function hex_to_b32(hex) {
  let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
  let bytes = [];
  for (let i = 0; i < hex.length; i += 2) {
    bytes.push(parseInt(hex.substr(i, 2), 16));
  }
  let bits = 0;
  let value = 0;
  let output = "";
  for (let i = 0; i < bytes.length; i++) {
    value = (value << 8) | bytes[i];
    bits += 8;
    while (bits >= 5) {
      output += alphabet[(value >>> (bits - 5)) & 31];
      bits -= 5;
    }
  }
  if (bits > 0) {
    output += alphabet[(value << (5 - bits)) & 31];
  }
  return output;
}

// from https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93
function saveToFile(data, filename) {
  if (!data) {
    console.error("Console.save: No data");
    return;
  }

  if (typeof data === "object") {
    data = JSON.stringify(data, undefined, 4);
  }

  const blob = new Blob([data], {
    type: "text/json",
  });

  const e = document.createEvent("MouseEvents");
  const a = document.createElement("a");
  a.download = filename;
  a.href = window.URL.createObjectURL(blob);
  a.dataset.downloadurl = ["text/json", a.download, a.href].join(":");

  e.initMouseEvent(
    "click",
    true,
    false,
    window,
    0,
    0,
    0,
    0,
    0,
    false,
    false,
    false,
    false,
    0,
    null
  );

  a.dispatchEvent(e);
}

const items = appManager.getModel().map((i) => {
    let secretSeed = i.secretSeed;
    if (typeof secretSeed == "undefined") {
        secretSeed = i.encryptedSeed;
    }
    const period = i.digits === 7 ? 10 : 30;
    const secret =
        i.markedForDeletion === false ? i.decryptedSeed : hex_to_b32(secretSeed);
    const [issuer, rawName] = i.name.includes(":")
        ? i.name.split(":")
        : ["", i.name];
    const name = [issuer, rawName].filter(Boolean).join(": ");
   
    return {
        account: name,
        algorithm: "SHA1",
        counter: "0",
        digits: `${i.digits}`,
        iconType: "",
        iconValue: "",
        issuer: name,
        kind: "TOTP",
        pinned: "false",
        secret,
        timer: `${period}`,
    };
});

saveToFile(items, "Authy-To-Raivo-OTP-Export.json");

Hoặc export ra json ko mã hoá (nhập vào Aegis và 1 số app khác chẳng hặn)
Code:
// Based on https://github.com/LinusU/base32-encode/blob/master/index.js
function hex_to_b32(hex) {
  let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
  let bytes = [];
  for (let i = 0; i < hex.length; i += 2) {
    bytes.push(parseInt(hex.substr(i, 2), 16));
  }
  let bits = 0;
  let value = 0;
  let output = "";
  for (let i = 0; i < bytes.length; i++) {
    value = (value << 8) | bytes[i];
    bits += 8;
    while (bits >= 5) {
      output += alphabet[(value >>> (bits - 5)) & 31];
      bits -= 5;
    }
  }
  if (bits > 0) {
    output += alphabet[(value << (5 - bits)) & 31];
  }
  return output;
}

const items = appManager.getModel().map((i) => {
  let secretSeed = i.secretSeed;
  if (typeof secretSeed == "undefined") {
    secretSeed = i.encryptedSeed;
  }
  // @brenc: All of my Authy accounts have a 20 second period. Not sure why
  //         this was 10.
  const period = i.digits === 7 ? 20 : 30;
  const secret =
    i.markedForDeletion === false ? i.decryptedSeed : hex_to_b32(secretSeed);
  const [issuer, rawName] = i.name.includes(":")
    ? i.name.split(":")
    : ["", i.name];
  const name = [issuer, rawName].filter(Boolean).join(": ");

  return {
    type: "totp",
    // NOTE: Aegis generates a fresh UUID if we skip this property
    // uuid: null,
    name,
    issuer: name,
    icon: null,
    info: {
      secret,
      algo: "SHA1",
      digits: i.digits,
      period: period
    }
  };
});

// Example from https://github.com/beemdevelopment/Aegis/blob/master/app/src/test/resources/com/beemdevelopment/aegis/importers/aegis_plain.json
const aegis_data = {
  version: 1,
  header: {
    slots: null,
    params: null
  },
  db: {
    version: 1,
    entries: items
  }
};

// dumps entries to console in Aegis JSON format
console.log(JSON.stringify(aegis_data, undefined, 4));

Trong trường hợp muốn export ra QRcode thì nhập mã này
Code:
// QRious v4.0.2 | (C) 2017 Alasdair Mercer | GPL v3 License Based on jsqrencode | (C) 2010 [email protected] | GPL v3 License
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.QRious=e()}(this,function(){"use strict";function t(t,e){var n;return"function"==typeof Object.create?n=Object.create(t):(s.prototype=t,n=new s,s.prototype=null),e&&i(!0,n,e),n}function e(e,n,s,r){var o=this;return"string"!=typeof e&&(r=s,s=n,n=e,e=null),"function"!=typeof n&&(r=s,s=n,n=function(){return o.apply(this,arguments)}),i(!1,n,o,r),n.prototype=t(o.prototype,s),n.prototype.constructor=n,n.class_=e||o.class_,n.super_=o,n}function i(t,e,i){for(var n,s,a=0,h=(i=o.call(arguments,2)).length;a<h;a++){s=i[a];for(n in s)t&&!r.call(s,n)||(e[n]=s[n])}}function n(){}var s=function(){},r=Object.prototype.hasOwnProperty,o=Array.prototype.slice,a=e;n.class_="Nevis",n.super_=Object,n.extend=a;var h=n,f=h.extend(function(t,e,i){this.qrious=t,this.element=e,this.element.qrious=t,this.enabled=Boolean(i)},{draw:function(t){},getElement:function(){return this.enabled||(this.enabled=!0,this.render()),this.element},getModuleSize:function(t){var e=this.qrious,i=e.padding||0,n=Math.floor((e.size-2*i)/t.width);return Math.max(1,n)},getOffset:function(t){var e=this.qrious,i=e.padding;if(null!=i)return i;var n=this.getModuleSize(t),s=Math.floor((e.size-n*t.width)/2);return Math.max(0,s)},render:function(t){this.enabled&&(this.resize(),this.reset(),this.draw(t))},reset:function(){},resize:function(){}}),c=f.extend({draw:function(t){var e,i,n=this.qrious,s=this.getModuleSize(t),r=this.getOffset(t),o=this.element.getContext("2d");for(o.fillStyle=n.foreground,o.globalAlpha=n.foregroundAlpha,e=0;e<t.width;e++)for(i=0;i<t.width;i++)t.buffer[i*t.width+e]&&o.fillRect(s*e+r,s*i+r,s,s)},reset:function(){var t=this.qrious,e=this.element.getContext("2d"),i=t.size;e.lineWidth=1,e.clearRect(0,0,i,i),e.fillStyle=t.background,e.globalAlpha=t.backgroundAlpha,e.fillRect(0,0,i,i)},resize:function(){var t=this.element;t.width=t.height=this.qrious.size}}),u=h.extend(null,{BLOCK:[0,11,15,19,23,27,31,16,18,20,22,24,26,28,20,22,24,24,26,28,28,22,24,24,26,26,28,28,24,24,26,26,26,28,28,24,26,26,26,28,28]}),l=h.extend(null,{BLOCKS:[1,0,19,7,1,0,16,10,1,0,13,13,1,0,9,17,1,0,34,10,1,0,28,16,1,0,22,22,1,0,16,28,1,0,55,15,1,0,44,26,2,0,17,18,2,0,13,22,1,0,80,20,2,0,32,18,2,0,24,26,4,0,9,16,1,0,108,26,2,0,43,24,2,2,15,18,2,2,11,22,2,0,68,18,4,0,27,16,4,0,19,24,4,0,15,28,2,0,78,20,4,0,31,18,2,4,14,18,4,1,13,26,2,0,97,24,2,2,38,22,4,2,18,22,4,2,14,26,2,0,116,30,3,2,36,22,4,4,16,20,4,4,12,24,2,2,68,18,4,1,43,26,6,2,19,24,6,2,15,28,4,0,81,20,1,4,50,30,4,4,22,28,3,8,12,24,2,2,92,24,6,2,36,22,4,6,20,26,7,4,14,28,4,0,107,26,8,1,37,22,8,4,20,24,12,4,11,22,3,1,115,30,4,5,40,24,11,5,16,20,11,5,12,24,5,1,87,22,5,5,41,24,5,7,24,30,11,7,12,24,5,1,98,24,7,3,45,28,15,2,19,24,3,13,15,30,1,5,107,28,10,1,46,28,1,15,22,28,2,17,14,28,5,1,120,30,9,4,43,26,17,1,22,28,2,19,14,28,3,4,113,28,3,11,44,26,17,4,21,26,9,16,13,26,3,5,107,28,3,13,41,26,15,5,24,30,15,10,15,28,4,4,116,28,17,0,42,26,17,6,22,28,19,6,16,30,2,7,111,28,17,0,46,28,7,16,24,30,34,0,13,24,4,5,121,30,4,14,47,28,11,14,24,30,16,14,15,30,6,4,117,30,6,14,45,28,11,16,24,30,30,2,16,30,8,4,106,26,8,13,47,28,7,22,24,30,22,13,15,30,10,2,114,28,19,4,46,28,28,6,22,28,33,4,16,30,8,4,122,30,22,3,45,28,8,26,23,30,12,28,15,30,3,10,117,30,3,23,45,28,4,31,24,30,11,31,15,30,7,7,116,30,21,7,45,28,1,37,23,30,19,26,15,30,5,10,115,30,19,10,47,28,15,25,24,30,23,25,15,30,13,3,115,30,2,29,46,28,42,1,24,30,23,28,15,30,17,0,115,30,10,23,46,28,10,35,24,30,19,35,15,30,17,1,115,30,14,21,46,28,29,19,24,30,11,46,15,30,13,6,115,30,14,23,46,28,44,7,24,30,59,1,16,30,12,7,121,30,12,26,47,28,39,14,24,30,22,41,15,30,6,14,121,30,6,34,47,28,46,10,24,30,2,64,15,30,17,4,122,30,29,14,46,28,49,10,24,30,24,46,15,30,4,18,122,30,13,32,46,28,48,14,24,30,42,32,15,30,20,4,117,30,40,7,47,28,43,22,24,30,10,67,15,30,19,6,118,30,18,31,47,28,34,34,24,30,20,61,15,30],FINAL_FORMAT:[30660,29427,32170,30877,26159,25368,27713,26998,21522,20773,24188,23371,17913,16590,20375,19104,13663,12392,16177,14854,9396,8579,11994,11245,5769,5054,7399,6608,1890,597,3340,2107],LEVELS:{L:1,M:2,Q:3,H:4}}),_=h.extend(null,{EXPONENT:[1,2,4,8,16,32,64,128,29,58,116,232,205,135,19,38,76,152,45,90,180,117,234,201,143,3,6,12,24,48,96,192,157,39,78,156,37,74,148,53,106,212,181,119,238,193,159,35,70,140,5,10,20,40,80,160,93,186,105,210,185,111,222,161,95,190,97,194,153,47,94,188,101,202,137,15,30,60,120,240,253,231,211,187,107,214,177,127,254,225,223,163,91,182,113,226,217,175,67,134,17,34,68,136,13,26,52,104,208,189,103,206,129,31,62,124,248,237,199,147,59,118,236,197,151,51,102,204,133,23,46,92,184,109,218,169,79,158,33,66,132,21,42,84,168,77,154,41,82,164,85,170,73,146,57,114,228,213,183,115,230,209,191,99,198,145,63,126,252,229,215,179,123,246,241,255,227,219,171,75,150,49,98,196,149,55,110,220,165,87,174,65,130,25,50,100,200,141,7,14,28,56,112,224,221,167,83,166,81,162,89,178,121,242,249,239,195,155,43,86,172,69,138,9,18,36,72,144,61,122,244,245,247,243,251,235,203,139,11,22,44,88,176,125,250,233,207,131,27,54,108,216,173,71,142,0],LOG:[255,0,1,25,2,50,26,198,3,223,51,238,27,104,199,75,4,100,224,14,52,141,239,129,28,193,105,248,200,8,76,113,5,138,101,47,225,36,15,33,53,147,142,218,240,18,130,69,29,181,194,125,106,39,249,185,201,154,9,120,77,228,114,166,6,191,139,98,102,221,48,253,226,152,37,179,16,145,34,136,54,208,148,206,143,150,219,189,241,210,19,92,131,56,70,64,30,66,182,163,195,72,126,110,107,58,40,84,250,133,186,61,202,94,155,159,10,21,121,43,78,212,229,172,115,243,167,87,7,112,192,247,140,128,99,13,103,74,222,237,49,197,254,24,227,165,153,119,38,184,180,124,17,68,146,217,35,32,137,46,55,63,209,91,149,188,207,205,144,135,151,178,220,252,190,97,242,86,211,171,20,42,93,158,132,60,57,83,71,109,65,162,31,45,67,216,183,123,164,118,196,23,73,236,127,12,111,246,108,161,59,82,41,157,85,170,251,96,134,177,187,204,62,90,203,89,95,176,156,169,160,81,11,245,22,235,122,117,44,215,79,174,213,233,230,231,173,232,116,214,244,234,168,80,88,175]}),d=h.extend(null,{BLOCK:[3220,1468,2713,1235,3062,1890,2119,1549,2344,2936,1117,2583,1330,2470,1667,2249,2028,3780,481,4011,142,3098,831,3445,592,2517,1776,2234,1951,2827,1070,2660,1345,3177]}),v=h.extend(function(t){var e,i,n,s,r,o=t.value.length;for(this._badness=[],this._level=l.LEVELS[t.level],this._polynomial=[],this._value=t.value,this._version=0,this._stringBuffer=[];this._version<40&&(this._version++,n=4*(this._level-1)+16*(this._version-1),s=l.BLOCKS[n++],r=l.BLOCKS[n++],e=l.BLOCKS[n++],i=l.BLOCKS[n],n=e*(s+r)+r-3+(this._version<=9),!(o<=n)););this._dataBlock=e,this._eccBlock=i,this._neccBlock1=s,this._neccBlock2=r;var a=this.width=17+4*this._version;this.buffer=v._createArray(a*a),this._ecc=v._createArray(e+(e+i)*(s+r)+r),this._mask=v._createArray((a*(a+1)+1)/2),this._insertFinders(),this._insertAlignments(),this.buffer[8+a*(a-8)]=1,this._insertTimingGap(),this._reverseMask(),this._insertTimingRowAndColumn(),this._insertVersion(),this._syncMask(),this._convertBitStream(o),this._calculatePolynomial(),this._appendEccToData(),this._interleaveBlocks(),this._pack(),this._finish()},{_addAlignment:function(t,e){var i,n=this.buffer,s=this.width;for(n[t+s*e]=1,i=-2;i<2;i++)n[t+i+s*(e-2)]=1,n[t-2+s*(e+i+1)]=1,n[t+2+s*(e+i)]=1,n[t+i+1+s*(e+2)]=1;for(i=0;i<2;i++)this._setMask(t-1,e+i),this._setMask(t+1,e-i),this._setMask(t-i,e-1),this._setMask(t+i,e+1)},_appendData:function(t,e,i,n){var s,r,o,a=this._polynomial,h=this._stringBuffer;for(r=0;r<n;r++)h[i+r]=0;for(r=0;r<e;r++){if(255!==(s=_.LOG[h[t+r]^h[i]]))for(o=1;o<n;o++)h[i+o-1]=h[i+o]^_.EXPONENT[v._modN(s+a[n-o])];else for(o=i;o<i+n;o++)h[o]=h[o+1];h[i+n-1]=255===s?0:_.EXPONENT[v._modN(s+a[0])]}},_appendEccToData:function(){var t,e=0,i=this._dataBlock,n=this._calculateMaxLength(),s=this._eccBlock;for(t=0;t<this._neccBlock1;t++)this._appendData(e,i,n,s),e+=i,n+=s;for(t=0;t<this._neccBlock2;t++)this._appendData(e,i+1,n,s),e+=i+1,n+=s},_applyMask:function(t){var e,i,n,s,r=this.buffer,o=this.width;switch(t){case 0:for(s=0;s<o;s++)for(n=0;n<o;n++)n+s&1||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 1:for(s=0;s<o;s++)for(n=0;n<o;n++)1&s||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 2:for(s=0;s<o;s++)for(e=0,n=0;n<o;n++,e++)3===e&&(e=0),e||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 3:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=i,n=0;n<o;n++,e++)3===e&&(e=0),e||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 4:for(s=0;s<o;s++)for(e=0,i=s>>1&1,n=0;n<o;n++,e++)3===e&&(e=0,i=!i),i||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 5:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=0,n=0;n<o;n++,e++)3===e&&(e=0),(n&s&1)+!(!e|!i)||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 6:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=0,n=0;n<o;n++,e++)3===e&&(e=0),(n&s&1)+(e&&e===i)&1||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 7:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=0,n=0;n<o;n++,e++)3===e&&(e=0),(e&&e===i)+(n+s&1)&1||this._isMasked(n,s)||(r[n+s*o]^=1)}},_calculateMaxLength:function(){return this._dataBlock*(this._neccBlock1+this._neccBlock2)+this._neccBlock2},_calculatePolynomial:function(){var t,e,i=this._eccBlock,n=this._polynomial;for(n[0]=1,t=0;t<i;t++){for(n[t+1]=1,e=t;e>0;e--)n[e]=n[e]?n[e-1]^_.EXPONENT[v._modN(_.LOG[n[e]]+t)]:n[e-1];n[0]=_.EXPONENT[v._modN(_.LOG[n[0]]+t)]}for(t=0;t<=i;t++)n[t]=_.LOG[n[t]]},_checkBadness:function(){var t,e,i,n,s,r=0,o=this._badness,a=this.buffer,h=this.width;for(s=0;s<h-1;s++)for(n=0;n<h-1;n++)(a[n+h*s]&&a[n+1+h*s]&&a[n+h*(s+1)]&&a[n+1+h*(s+1)]||!(a[n+h*s]||a[n+1+h*s]||a[n+h*(s+1)]||a[n+1+h*(s+1)]))&&(r+=v.N2);var f=0;for(s=0;s<h;s++){for(i=0,o[0]=0,t=0,n=0;n<h;n++)t===(e=a[n+h*s])?o[i]++:o[++i]=1,f+=(t=e)?1:-1;r+=this._getBadness(i)}f<0&&(f=-f);var c=0,u=f;for(u+=u<<2,u<<=1;u>h*h;)u-=h*h,c++;for(r+=c*v.N4,n=0;n<h;n++){for(i=0,o[0]=0,t=0,s=0;s<h;s++)t===(e=a[n+h*s])?o[i]++:o[++i]=1,t=e;r+=this._getBadness(i)}return r},_convertBitStream:function(t){var e,i,n=this._ecc,s=this._version;for(i=0;i<t;i++)n[i]=this._value.charCodeAt(i);var r=this._stringBuffer=n.slice(),o=this._calculateMaxLength();t>=o-2&&(t=o-2,s>9&&t--);var a=t;if(s>9){for(r[a+2]=0,r[a+3]=0;a--;)e=r[a],r[a+3]|=255&e<<4,r[a+2]=e>>4;r[2]|=255&t<<4,r[1]=t>>4,r[0]=64|t>>12}else{for(r[a+1]=0,r[a+2]=0;a--;)e=r[a],r[a+2]|=255&e<<4,r[a+1]=e>>4;r[1]|=255&t<<4,r[0]=64|t>>4}for(a=t+3-(s<10);a<o;)r[a++]=236,r[a++]=17},_getBadness:function(t){var e,i=0,n=this._badness;for(e=0;e<=t;e++)n[e]>=5&&(i+=v.N1+n[e]-5);for(e=3;e<t-1;e+=2)n[e-2]===n[e+2]&&n[e+2]===n[e-1]&&n[e-1]===n[e+1]&&3*n[e-1]===n[e]&&(0===n[e-3]||e+3>t||3*n[e-3]>=4*n[e]||3*n[e+3]>=4*n[e])&&(i+=v.N3);return i},_finish:function(){this._stringBuffer=this.buffer.slice();var t,e,i=0,n=3e4;for(e=0;e<8&&(this._applyMask(e),(t=this._checkBadness())<n&&(n=t,i=e),7!==i);e++)this.buffer=this._stringBuffer.slice();i!==e&&this._applyMask(i),n=l.FINAL_FORMAT[i+(this._level-1<<3)];var s=this.buffer,r=this.width;for(e=0;e<8;e++,n>>=1)1&n&&(s[r-1-e+8*r]=1,e<6?s[8+r*e]=1:s[8+r*(e+1)]=1);for(e=0;e<7;e++,n>>=1)1&n&&(s[8+r*(r-7+e)]=1,e?s[6-e+8*r]=1:s[7+8*r]=1)},_interleaveBlocks:function(){var t,e,i=this._dataBlock,n=this._ecc,s=this._eccBlock,r=0,o=this._calculateMaxLength(),a=this._neccBlock1,h=this._neccBlock2,f=this._stringBuffer;for(t=0;t<i;t++){for(e=0;e<a;e++)n[r++]=f[t+e*i];for(e=0;e<h;e++)n[r++]=f[a*i+t+e*(i+1)]}for(e=0;e<h;e++)n[r++]=f[a*i+t+e*(i+1)];for(t=0;t<s;t++)for(e=0;e<a+h;e++)n[r++]=f[o+t+e*s];this._stringBuffer=n},_insertAlignments:function(){var t,e,i,n=this._version,s=this.width;if(n>1)for(t=u.BLOCK[n],i=s-7;;){for(e=s-7;e>t-3&&(this._addAlignment(e,i),!(e<t));)e-=t;if(i<=t+9)break;i-=t,this._addAlignment(6,i),this._addAlignment(i,6)}},_insertFinders:function(){var t,e,i,n,s=this.buffer,r=this.width;for(t=0;t<3;t++){for(e=0,n=0,1===t&&(e=r-7),2===t&&(n=r-7),s[n+3+r*(e+3)]=1,i=0;i<6;i++)s[n+i+r*e]=1,s[n+r*(e+i+1)]=1,s[n+6+r*(e+i)]=1,s[n+i+1+r*(e+6)]=1;for(i=1;i<5;i++)this._setMask(n+i,e+1),this._setMask(n+1,e+i+1),this._setMask(n+5,e+i),this._setMask(n+i+1,e+5);for(i=2;i<4;i++)s[n+i+r*(e+2)]=1,s[n+2+r*(e+i+1)]=1,s[n+4+r*(e+i)]=1,s[n+i+1+r*(e+4)]=1}},_insertTimingGap:function(){var t,e,i=this.width;for(e=0;e<7;e++)this._setMask(7,e),this._setMask(i-8,e),this._setMask(7,e+i-7);for(t=0;t<8;t++)this._setMask(t,7),this._setMask(t+i-8,7),this._setMask(t,i-8)},_insertTimingRowAndColumn:function(){var t,e=this.buffer,i=this.width;for(t=0;t<i-14;t++)1&t?(this._setMask(8+t,6),this._setMask(6,8+t)):(e[8+t+6*i]=1,e[6+i*(8+t)]=1)},_insertVersion:function(){var t,e,i,n,s=this.buffer,r=this._version,o=this.width;if(r>6)for(t=d.BLOCK[r-7],e=17,i=0;i<6;i++)for(n=0;n<3;n++,e--)1&(e>11?r>>e-12:t>>e)?(s[5-i+o*(2-n+o-11)]=1,s[2-n+o-11+o*(5-i)]=1):(this._setMask(5-i,2-n+o-11),this._setMask(2-n+o-11,5-i))},_isMasked:function(t,e){var i=v._getMaskBit(t,e);return 1===this._mask[i]},_pack:function(){var t,e,i,n=1,s=1,r=this.width,o=r-1,a=r-1,h=(this._dataBlock+this._eccBlock)*(this._neccBlock1+this._neccBlock2)+this._neccBlock2;for(e=0;e<h;e++)for(t=this._stringBuffer[e],i=0;i<8;i++,t<<=1){128&t&&(this.buffer[o+r*a]=1);do{s?o--:(o++,n?0!==a?a--:(n=!n,6===(o-=2)&&(o--,a=9)):a!==r-1?a++:(n=!n,6===(o-=2)&&(o--,a-=8))),s=!s}while(this._isMasked(o,a))}},_reverseMask:function(){var t,e,i=this.width;for(t=0;t<9;t++)this._setMask(t,8);for(t=0;t<8;t++)this._setMask(t+i-8,8),this._setMask(8,t);for(e=0;e<7;e++)this._setMask(8,e+i-7)},_setMask:function(t,e){var i=v._getMaskBit(t,e);this._mask[i]=1},_syncMask:function(){var t,e,i=this.width;for(e=0;e<i;e++)for(t=0;t<=e;t++)this.buffer[t+i*e]&&this._setMask(t,e)}},{_createArray:function(t){var e,i=[];for(e=0;e<t;e++)i[e]=0;return i},_getMaskBit:function(t,e){var i;return t>e&&(i=t,t=e,e=i),i=e,i+=e*e,i>>=1,i+=t},_modN:function(t){for(;t>=255;)t=((t-=255)>>8)+(255&t);return t},N1:3,N2:3,N3:40,N4:10}),p=v,m=f.extend({draw:function(){this.element.src=this.qrious.toDataURL()},reset:function(){this.element.src=""},resize:function(){var t=this.element;t.width=t.height=this.qrious.size}}),g=h.extend(function(t,e,i,n){this.name=t,this.modifiable=Boolean(e),this.defaultValue=i,this._valueTransformer=n},{transform:function(t){var e=this._valueTransformer;return"function"==typeof e?e(t,this):t}}),k=h.extend(null,{abs:function(t){return null!=t?Math.abs(t):null},hasOwn:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},noop:function(){},toUpperCase:function(t){return null!=t?t.toUpperCase():null}}),w=h.extend(function(t){this.options={},t.forEach(function(t){this.options[t.name]=t},this)},{exists:function(t){return null!=this.options[t]},get:function(t,e){return w._get(this.options[t],e)},getAll:function(t){var e,i=this.options,n={};for(e in i)k.hasOwn(i,e)&&(n[e]=w._get(i[e],t));return n},init:function(t,e,i){"function"!=typeof i&&(i=k.noop);var n,s;for(n in this.options)k.hasOwn(this.options,n)&&(s=this.options[n],w._set(s,s.defaultValue,e),w._createAccessor(s,e,i));this._setAll(t,e,!0)},set:function(t,e,i){return this._set(t,e,i)},setAll:function(t,e){return this._setAll(t,e)},_set:function(t,e,i,n){var s=this.options[t];if(!s)throw new Error("Invalid option: "+t);if(!s.modifiable&&!n)throw new Error("Option cannot be modified: "+t);return w._set(s,e,i)},_setAll:function(t,e,i){if(!t)return!1;var n,s=!1;for(n in t)k.hasOwn(t,n)&&this._set(n,t[n],e,i)&&(s=!0);return s}},{_createAccessor:function(t,e,i){var n={get:function(){return w._get(t,e)}};t.modifiable&&(n.set=function(n){w._set(t,n,e)&&i(n,t)}),Object.defineProperty(e,t.name,n)},_get:function(t,e){return e["_"+t.name]},_set:function(t,e,i){var n="_"+t.name,s=i[n],r=t.transform(null!=e?e:t.defaultValue);return i[n]=r,r!==s}}),M=w,b=h.extend(function(){this._services={}},{getService:function(t){var e=this._services[t];if(!e)throw new Error("Service is not being managed with name: "+t);return e},setService:function(t,e){if(this._services[t])throw new Error("Service is already managed with name: "+t);e&&(this._services[t]=e)}}),B=new M([new g("background",!0,"white"),new g("backgroundAlpha",!0,1,k.abs),new g("element"),new g("foreground",!0,"black"),new g("foregroundAlpha",!0,1,k.abs),new g("level",!0,"L",k.toUpperCase),new g("mime",!0,"image/png"),new g("padding",!0,null,k.abs),new g("size",!0,100,k.abs),new g("value",!0,"")]),y=new b,O=h.extend(function(t){B.init(t,this,this.update.bind(this));var e=B.get("element",this),i=y.getService("element"),n=e&&i.isCanvas(e)?e:i.createCanvas(),s=e&&i.isImage(e)?e:i.createImage();this._canvasRenderer=new c(this,n,!0),this._imageRenderer=new m(this,s,s===e),this.update()},{get:function(){return B.getAll(this)},set:function(t){B.setAll(t,this)&&this.update()},toDataURL:function(t){return this.canvas.toDataURL(t||this.mime)},update:function(){var t=new p({level:this.level,value:this.value});this._canvasRenderer.render(t),this._imageRenderer.render(t)}},{use:function(t){y.setService(t.getName(),t)}});Object.defineProperties(O.prototype,{canvas:{get:function(){return this._canvasRenderer.getElement()}},image:{get:function(){return this._imageRenderer.getElement()}}});var A=O,L=h.extend({getName:function(){}}).extend({createCanvas:function(){},createImage:function(){},getName:function(){return"element"},isCanvas:function(t){},isImage:function(t){}}).extend({createCanvas:function(){return document.createElement("canvas")},createImage:function(){return document.createElement("img")},isCanvas:function(t){return t instanceof HTMLCanvasElement},isImage:function(t){return t instanceof HTMLImageElement}});return A.use(new L),A});

// Based on https://github.com/LinusU/base32-encode/blob/master/index.js
function hex_to_b32(hex) { let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; let bytes = []; for (let i = 0; i < hex.length; i += 2) { bytes.push(parseInt(hex.substr(i, 2), 16)); } let bits = 0; let value = 0; let output = ''; for (let i = 0; i < bytes.length; i++) { value = (value << 8) | bytes[i]; bits += 8; while (bits >= 5) { output += alphabet[(value >>> (bits - 5)) & 31]; bits -= 5; } } if (bits > 0) { output += alphabet[(value << (5 - bits)) & 31]; } return output; }

// Based on https://github.com/adriancooney/console.image
function console_image(url, size) { console.log("%c+", "font-size: 1px; padding: " + Math.floor(size / 2) + "px " + Math.floor(size / 2) + "px; line-height: " + size + "px; background: url(" + url + "); color: transparent;"); }

(function(console) { console.save = function(data, filename) { if (!data) { console.error('Console.save: No data'); return; } if (typeof data === "object") { data = JSON.stringify(data, undefined, 4) } var blob = new Blob([data], {type: 'text/json'}), e = document.createEvent('MouseEvents'), a = document.createElement('a'); a.download = filename; a.href = window.URL.createObjectURL(blob); a.dataset.downloadurl =  ['text/json', a.download, a.href].join(':'); e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e); } })(console);

console.clear();
console.warn("Here's your Authy tokens:");
var data = appManager.getModel().map(function(i) {
    var secretSeed = i.secretSeed;
    if (typeof secretSeed == 'undefined') {
        secretSeed = i.encryptedSeed;
    }
    var secret = (i.markedForDeletion === false ? i.decryptedSeed : hex_to_b32(secretSeed));
    var period = (i.digits === 7 ? 10 : 30);
    var totp_uri = `otpauth://totp/${encodeURIComponent(i.name)}?secret=${secret}&digits=${i.digits}&period=${period}`;
    var qr_size = 250;
    var qr_url = (new QRious({value: totp_uri, size: qr_size})).toDataURL();
    console.group(`${i.originalName} / ${i.name}`);
        console.log('TOTP secret:', secret);
        console.log('TOTP URI:', totp_uri);
        console_image(qr_url, qr_size);
    console.groupEnd();
    return {name: i.name, secret: secret, uri: totp_uri};
});
//console.save(data, 'authy_backup.json');

Chọn code thích hợp paste vào xong chuột phải vào snippet chọn Run là okay.
 

Attachments

  • Authy Desktop 2.2.3.zip
    1.2 KB · Views: 2
Đang dùng cả 3 luôn, ms thì chỉ cho acc ms, còn bit authen, authy và 2fas thì cho đủ loại tk nhưng ưng thằng 2fas nhất vì nó cho search cả tên web lẫn acc.
ms vẫn cho dùng app khác ms auth để dùng mà? Cần gì phải cồng kềnh thế :D
 
Đang dùng cả 3 luôn, ms thì chỉ cho acc ms, còn bit authen, authy và 2fas thì cho đủ loại tk nhưng ưng thằng 2fas nhất vì nó cho search cả tên web lẫn acc.
Authy với Bitwarden cũng thế mà, nó search theo ký tự có trong chuỗi nên rất tiện, Bitwarden còn ko cần phải ấn chọn, chỉ cần click copy là okay. VD ntn:
1719158235815.png
 
t dùng bit authen riêng không chung với thằng bit quản lý pass. :shame:
Bitwarden Authenticator mới làm nên phò lắm, xài như hạch, phải 1 tgian nữa mới ngon được. Phải như pop out của Bitwarden hiện tại mới okay.
 
Anh em thử app Bitwarden beta chưa? Thấy khen trên iOS siêu mượt mà nhẹ nữa.

Ngoài ra thằng Proton Pass app giao diện đẹp quá trời mà xài free nhiều hạn chế quá chịu thua

via theNEXTvoz for iPhone
 
Anh em thử app Bitwarden beta chưa? Thấy khen trên iOS siêu mượt mà nhẹ nữa.

Ngoài ra thằng Proton Pass app giao diện đẹp quá trời mà xài free nhiều hạn chế quá chịu thua

via theNEXTvoz for iPhone
Bitwarden trên iOS UX tệ lắm, lởm.
Cài app vào chỉ để hệ thống nó lấy làm autofill thôi chứ chả mở app lên xài bao giờ. UI/UX tệ.
 
Bitwarden trên iOS UX tệ lắm, lởm.
Cài app vào chỉ để hệ thống nó lấy làm autofill thôi chứ chả mở app lên xài bao giờ. UI/UX tệ.

trên pc tôi còn thấy nó kém, trước quen dùng lastpass ấn vào trường nhập là nó hiện pop up luôn, bit thì không thế.
 
Anh em thử app Bitwarden beta chưa? Thấy khen trên iOS siêu mượt mà nhẹ nữa.

Ngoài ra thằng Proton Pass app giao diện đẹp quá trời mà xài free nhiều hạn chế quá chịu thua

via theNEXTvoz for iPhone
bữa dùng thử bản android thấy nó bị lỗi leak pass: fill ID/ pass xong nhưng không bấm login mà xoá hết để nhập lại thì nó auto xuất hiện cái bảng để fill ID/pass mà không cần xác nhận lại mã pin hay vân tay.
 
Bitwarden trên iOS UX tệ lắm, lởm.
Cài app vào chỉ để hệ thống nó lấy làm autofill thôi chứ chả mở app lên xài bao giờ. UI/UX tệ.
Đồng ý với fence. Vì UI/UX xấu tệ nên mình mới thử mấy app khác. Quan điểm mình là app phải đẹp mới có hứng xài. Mà nói gì nói chứ Bit xài free thì chức năng quá bá rồi

trước quen dùng lastpass ấn vào trường nhập là nó hiện pop up luôn, bit thì không thế.
Mình thấy ấn vào ô id hay pass có hiện popup mà fence (macOS)
 
Last edited:
microsoft authenticator, bitwarden đồng bộ hóa bằng server của họ mà, thật sự là anh cần phải liệt kê luôn à, dài lắm t lười vl. Hay thế giới 2fa của anh chỉ có mỗi authy?

Giữa một quán cơm lề đường gần ống cống, chắc ăn không đau bụng. Nhưng nó sẽ ngang chất lượng với quán cơm trong siêu thị, nhà hàng? Ý anh là vậy đúng không
Bản thân anh cũng ăn quán cơm lề đường gần cống nhưng anh bảo người khác đừng ăn, anh có lý do của anh nhưng lý do của người khác thì ko chấp nhận. Tiêu chuẩn kép cái đéo gì cũng nói được.

Bitwarden thì mới ra mắt chưa biết tròn méo thế nào, mic authen thì chỉ restore được trên cùng loại device (ios hoặc android, vãi nhái). Hỏi thật anh có dùng cái gì ko vậy?

À, còn thằng đầu tiên lôi google vào đây nhé trí nhớ ngắn hạn

Quan trọng là lỗ hổng bảo mật ảnh hưởng gì 1 cái app lưu trữ offline như aegis hoặc một app sync bằng cloud google drive như 2fas. Dữ liệu người dùng truyền đi lưu lại trên server uy tín bậc nhất trên thế giới rồi.

Hí hửng lôi google vào khoe, đến lúc bóc phốt google cũng bị hack thì lại bảo google liên quan gì mà lôi vào. Đầu óc bất nhất thì cứ tự vả mồm thôi :LOL:
 
Last edited:
Bị hack thì data của a có thể nằm trong tay của a nào đó chứ việc gì nó phải xóa data của a rồi để a đổi thông tin ? Link Search ở dưới a có thể tham khảo cái hãng T của a đã từng bị hack hay chưa
tôi thấy a toàn chỉ trích cá nhân. Tranh luận thì mang luận điểm ra. Lúc a chê cộng đồng mã mở là thứ lắm bug hung hăng lắm cơ mà ? Sao giờ hết nhét chữ vào mồm lại cứ công kích cá nhân thế ?

twilio got hacked at DuckDuckGo (https://duckduckgo.com/?q=twilio+got+hacked&t=h_&ia=web) Còn a bảo tìm ra 2 vụ gì tôi trình kém tìm k ra cho tôi thông tin với ? Rồi a lại lôi kéo cái vi phạm quyền riêng tư (A phải hiểu là thằng G là 1 thằng chuyên bán quảng cáo và chả ai xa lạ gì thằng này). Mà tôi cũng chả hiểu tsao a lại lôi thằng G vào làm gì ? Để chứng tỏ sản phẩm Authy của a là đẳng cấp k phải là rác rưởi à ?

À mà nói luôn cái vụ a bảo Authy này xịn vì cấp api cho mấy Big Tech thì a còn k phân biệt được (hoặc cố tình đánh đồng) việc được hỗ trợ Authy (vì thằng này có 1 cơ chế tạo totp khác) với Authy cung cấp API cho các ông lớn như a nói thì tôi cũng thưa với a là thằng Steam (tự mình tạo ra 2fa) riêng chắc cũng là thứ rác rưởi vì chả được cung cấp API cho thằng nào nhỉ ?
2 vụ google là 1 vụ google+ 2018 và 1 vụ lộ 5 triệu combo tài khoản + mật khẩu gmail, còn data ngưòi dùng thì google nó dùng luôn rồi cần gì bán, bị kiện vài vụ trong đó có 1 vụ đền mấy trăm triệu đô vì thu thập thông tin trẻ em ko có đồng thuận.

Còn twillo có mỗi vụ hack 2022 còn đâu tôi chưa tìm thấy cái khác, hay là anh đếm tít báo tính vụ hack vậy?

Nguồn mở thì bug heartbleed, shellshock nổi tiếng đấy, ngoài ra tôi ko rảnh đếm thê

À mà tôi chả bảo phần mềm nào rác rưởi. Rác rưởi là từ mồm 2 3 anh tinh tướng ra (đừng xóa post, người khác còn đọc) :LOL: tôi chỉ bảo phần mềm nào cũng ko an toàn 100%, cho dù là nguồn đóng hay nguồn mở, thế nên chả có lý do đéo gì bảo authy là rác. Anh mới là loại nhét chữ vào mồm :LOL: Tôi bảo google rác là hùa theo lý lẽ của các anh thôi chứ trước đó tôi chả bao giờ nói thế :LOL:
 
Last edited:
@Fioren a cho t hỏi tí, phần backup removal này nghĩa là gì, vì thằng 2fas này đâu có sync với thiết bị khác như gg authen.
 

Attachments

  • IMG_4386.jpeg
    IMG_4386.jpeg
    148.9 KB · Views: 1
Bản thân anh cũng ăn quán cơm lề đường gần cống nhưng anh bảo người khác đừng ăn, anh có lý do của anh nhưng lý do của người khác thì ko chấp nhận. Tiêu chuẩn kép cái đéo gì cũng nói được.

Bitwarden thì mới ra mắt chưa biết tròn méo thế nào, mic authen thì chỉ restore được trên cùng loại device (ios hoặc android, vãi nhái). Hỏi thật anh có dùng cái gì ko vậy?

À, còn thằng đầu tiên lôi google vào đây nhé trí nhớ ngắn hạn



Hí hửng lôi google vào khoe, đến lúc bóc phốt google cũng bị hack thì lại bảo google liên quan gì mà lôi vào. Đầu óc bất nhất thì cứ tự vả mồm thôi :LOL:
Vì vậy anh mới cần tham gia cái thread này, nói ra nhu cầu bản thân để người ta tư vấn. Chứ đâu phải từ từ đâu phán thẳng authy đỉnh lắm bọn google còn thua cả authy. T biết anh xài cái cái gì đâu mà tư vấn cho anh, anh xài ios, android, pc kết hợp thì dùng ente đúng nhu cầu của anh, hơn hẳn con authy ghẻ của anh k có sync trên destop nhé. Opensource 100% có bên thứ 3 xác thực lại, và quan trọng chưa bao giờ bị hack cả. Mau mau chuyển thuyền đi nào đừng seeder bẩn nữa.
Tôi phải khoe chứ sync server google đẳng cấp hơn hẳn cái cty ghẻ authy gấp trăm lần, anh cứ tìm cách so sánh 2 cty đó như nhau vậy?
 
Back
Top