JavaScript Crypto — випадкові числа й хешування


Crypto (глобальний об'єкт crypto) дає криптостійку випадковість і доступ до справжньої криптографії: хешування, шифрування, підписи.

автор: NagarD

Загальний опис

Найчастіше з нього беруть дві речі, і обидві — однорядкові.

crypto.randomUUID() повертає готовий унікальний ідентифікатор. crypto.getRandomValues() заповнює масив випадковими байтами — на відміну від Math.random(), який передбачуваний і для будь-чого, пов'язаного з безпекою (токени, паролі, солі), не годиться категорично.

Глибша частина — crypto.subtle: хешування SHA-256, шифрування AES, підписи. Усі його методи асинхронні (повертають проміси) і приймають байти, а не рядки — тож у парі з ним завжди йде TextEncoder.

автор: NagarD

Нотатка

crypto.subtle доступний лише в захищеному контексті — тобто на HTTPS або на localhost. На звичайному HTTP його просто немає.

автор: NagarD

Синтаксис

crypto.randomUUID();

методи

Метод Опис
randomUUID Генерує випадковий UUID v4.
getRandomValues Заповнює типізований масив криптостійкими випадковими числами.

властивості

Властивість Опис
subtle Web Crypto API: хешування, підписи, шифрування.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
Crypto 37+ 34+ 11+ 24+ 12+ 11+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
Crypto 37+ yes yes 11+

Приклади

+ запропонувати свій приклад у пісочниці

Унікальний id, криптостійкий токен і хеш SHA-256.

// готовий унікальний id
console.log(crypto.randomUUID());

// випадкові байти — не Math.random()!
const bytes = crypto.getRandomValues(new Uint8Array(16));
const token = [...bytes].map(b => b.toString(16).padStart(2, '0')).join('');
console.log(token);

// хеш SHA-256 (лише на HTTPS або localhost)
async function sha256(text) {
    const data = new TextEncoder().encode(text);
    const hash = await crypto.subtle.digest('SHA-256', data);

    return [...new Uint8Array(hash)]
        .map(b => b.toString(16).padStart(2, '0'))
        .join('');
}

sha256('привіт').then(hash => console.log('SHA-256:', hash));
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід