programing

일반적으로 신뢰할 수 있다고 여겨지는 SHA-256 자바스크립트 구현이 있습니까?

skycolor 2023. 10. 24. 21:10
반응형

일반적으로 신뢰할 수 있다고 여겨지는 SHA-256 자바스크립트 구현이 있습니까?

포럼 로그인을 작성하고 있는데 서버로 전송하기 전에 자바스크립트로 패스워드 클라이언트 쪽을 해시해야 합니다.실제로 신뢰할 수 있는 SHA-256 구현을 파악하는 데 어려움을 겪고 있습니다.모두가 사용하는 일종의 권위 있는 스크립트가 있을 것으로 기대하고 있었지만, 여러 프로젝트를 모두 자체적으로 구현하고 있습니다.

다른 사람의 암호를 사용하는 것은 당신이 직접 검토할 자격이 없는 한 항상 믿음의 도약이라는 것을 깨달았고, "신뢰할 수 있는"이라는 보편적인 정의는 없지만, 이것은 무엇을 사용해야 하는지에 대한 일종의 합의가 있어야 할 만큼 충분히 공통적이고 중요한 것으로 보입니다.제가 순진한 건가요?

댓글에 많이 뜨니 편집:네, 서버 쪽에서 좀 더 엄격한 해시를 다시 수행합니다.클라이언트 측 해싱은 데이터베이스에 저장하는 최종 결과가 아닙니다.고객측에서 해싱을 하는 것은 인간 고객이 요청하기 때문입니다.그들은 구체적인 이유를 밝히지 않았습니다. 아마도 그들은 과잉 살상을 좋아하는 것 같습니다.

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest 에서 내부 js 모듈을 사용하는 이 토막글을 찾았습니다.

async function sha256(message) {
    // encode as UTF-8
    const msgBuffer = new TextEncoder().encode(message);                    

    // hash the message
    const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);

    // convert ArrayBuffer to Array
    const hashArray = Array.from(new Uint8Array(hashBuffer));

    // convert bytes to hex string                  
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
    return hashHex;
}

:crypto.subtle에서만 이용 가능한https아니면localhost- 예를 들어, 당신의 지역 개발을 위해.python3 -m http.server당신은 이 선을 당신의 것에 추가해야 합니다./etc/hosts:0.0.0.0 localhost

재부팅 - 열 수 있습니다.localhost:8000일을 하면서crypto.subtle.

구식: 많은 최신 브라우저들이 현재 암호화 작업을 1등급으로 지원하고 있습니다.아래의 비탈리 즈다네비치의 답변을 참고하세요.


Stanford JS 크립토 라이브러리에는 SHA-256이 구현되어 있습니다.JS의 암호화는 다른 구현 플랫폼만큼 검증된 노력은 아니지만, 이 암호화는 적어도 부분적으로 Dan Boneh에 의해 개발되었으며 어느 정도는 후원을 받고 있습니다. Dan Boneh는 암호학 분야에서 잘 확립되고 신뢰받는 이름이며, 프로젝트가 실제로 그가 무엇을 하고 있는지 아는 누군가에 의해 감독을 받고 있다는 것을 의미합니다.이 프로젝트는 NSF의 지원을 받기도 합니다.

하지만 지적할 가치가 있습니다.
... 암호를 제출하기 전에 클라이언트 측에서 해시하면 해시가 암호가 되고 원래 암호는 관계가 없게 됩니다.공격자는 사용자를 가장하기 위해 해시를 가로채기만 하면 되며, 해당 해시가 서버에 수정되지 않은 상태로 저장되면 서버는 실제 암호(해시)를 일반 텍스트로 저장하고 있습니다.

따라서 이전에 신뢰할 수 있었던 계획에 자체 개선 사항을 추가하기로 결정했기 때문에 보안이 더욱 악화되었습니다.

관심있는 사람들을 위해, 이것은 SHA-256 해시를 만들기 위한 코드입니다.sjcl:

import sjcl from 'sjcl'

const myString = 'Hello'
const myBitArray = sjcl.hash.sha256.hash(myString)
const myHash = sjcl.codec.hex.fromBits(myBitArray)

포지의 SHA-256 구현은 빠르고 안정적입니다.

여러 SHA-256 JavaScript 구현에서 테스트를 실행하려면 http://brillout.github.io/test-javascript-hash-implementations/ 로 이동합니다.

제 기계의 결과는 가장 빠른 구현이 될 수 있음을 시사하며, 수락된 답변에서 언급된 Stanford Javascript Crypto Library(sjcl)보다 훨씬 빠릅니다.

Forge는 256KB이지만 SHA-256 관련 코드를 추출하면 크기가 4.5KB로 줄어듭니다. https://github.com/brillout/forge-sha256 을 참조하십시오.

아니요, 브라우저 자바스크립트를 사용하여 비밀번호 보안을 개선할 방법은 없습니다.는 당신이 이 기사를 읽는 것을 강력히 추천합니다.여러분의 경우, 가장 큰 문제는 닭-계란 문제입니다.

자바스크립트 암호를 전달하는 "닭알 문제"는 무엇입니까?

네트워크에서 암호를 전달할 것이라고 신뢰하지 않거나 더 나쁜 경우 서버에서 사용자 비밀을 유지하지 않을 것이라고 신뢰하지 않으면 보안 코드를 전달할 것이라고 신뢰할 수 없습니다.암호를 도입하기 전에 암호를 스니핑하거나 일기를 읽던 동일한 공격자가 암호를 도입한 후에 암호를 가로채는 것입니다.

[...]

왜 TLS/SSL을 사용하여 자바스크립트 암호를 전달할 수 없습니까?

넌 할 수 있다.듣기보다 어렵지만 SSL을 사용하여 브라우저에 안전하게 자바스크립트 암호를 전송할 수 있습니다.문제는 SSL과 함께 안전한 채널을 구축함에 따라 더 이상 자바스크립트 암호화가 필요 없어졌다는 것입니다. 즉, "진짜" 암호화를 가지고 있다는 것입니다.

그 결과는 다음과 같습니다.

자바스크립트에서 암호 코드를 실행할 때의 문제점은 실질적으로 암호가 의존하는 모든 기능이 호스팅 페이지를 구축하는 데 사용되는 어떤 콘텐츠에 의해서도 무시될 수 있다는 것입니다.암호 보안은 프로세스 초기에(가짜 난수를 생성하거나 알고리즘에서 사용하는 상수와 매개 변수를 조작하여), 나중에(핵심 자료를 다시 공격자에게 스피릿하여) 암호 보안을 해제할 수 있으며, 가장 가능성이 높은 시나리오에서는 암호 보안을 완전히 우회하여 해제할 수도 있습니다.

자바스크립트 코드의 어떤 부분도 실행 환경을 확인할 수 있는 신뢰할 수 있는 방법이 없습니다.자바스크립트 암호화 코드는 "내가 정말 난수 생성기를 다루고 있는가, 아니면 공격자가 제공한 어떤 팩시밀리를 다루고 있는가?"라고 물을 수 없습니다.그리고 "저자인 제가 승인하는 방법 외에는 그 누구도 이 암호 비밀을 가지고 어떤 일도 할 수 없다"고 단언할 수는 없습니다.암호를 사용하는 다른 환경에서 제공되는 두 가지 속성은 자바스크립트에서는 불가능합니다.

기본적으로 문제는 다음과 같습니다.

  • 고객이 서버를 신뢰하지 않으므로 추가 보안 코드를 추가하려고 합니다.
  • 보안 코드는 서버(신뢰할 수 없는 서버)에 의해 전달됩니다.

아니면,

  • 고객은 SSL을 신뢰하지 않으므로 추가 보안 코드를 사용하기를 원합니다.
  • 해당 보안 코드는 SSL을 통해 전달됩니다.

참고: 또한, SHA-256은 반복되지 않은 비밀번호를 강제로 사용하는 것이 매우 쉽기 때문에 이에 적합하지 않습니다.어쨌든 이 작업을 수행하기로 결정한 경우 bcrypt, scrypt 또는 PBKDF2의 구현을 찾아보십시오.

저는 이 구현이 매우 사용하기 쉽다는 것을 알았습니다.또한 넉넉한 BSD 스타일 라이센스:

jsSHA: https://github.com/Caligatio/jsSHA

SHA-256 해시의 16진 표현을 얻을 수 있는 빠른 방법이 필요했습니다.3개의 줄만 있으면 됩니다.

var sha256 = new jsSHA('SHA-256', 'TEXT');
sha256.update(some_string_variable_to_hash);
var hash = sha256.getHash("HEX");

CryptoJS - https://www.npmjs.com/package/crypto-js 를 사용할 수 있습니다.

import sha256 from 'crypto-js/sha256'

const hash = sha256('Text')

타일러가 말한 스탠포드 립 말고는.저는 jsrsign이 매우 유용하다는 것을 알았습니다(Gitubrepo here: https://github.com/kjur/jsrsasign) .정확히 얼마나 신뢰할 수 있는지는 모르겠지만, SHA256, Base64, RSA, x509 등의 API를 사용해 보았는데 꽤 잘 작동합니다.사실, 그것은 스탠포드 립도 포함합니다.

SHA256만 하고 싶다면 jsrsign은 오버킬일 수 있습니다.하지만 관련 분야에 다른 니즈가 있다면 잘 맞는다고 생각합니다.

js-sha256은 사용할 수 있는 npm 패키지이며, 일반적인 crypto와는 달리 보안 연결(localhost/https)에서만 작동하는 subtle입니다.물론 안전한 연결이 여전히 최고입니다.crypto.suble을 사용하고 있었는데 localhost를 사용하여 웹앱을 실행했는데 서버에서 시도하는 순간 실패했기 때문에 항상 작동했습니다.보안 연결이 설정될 때까지 임시 솔루션으로 js-sha256npm 패키지로 전환해야 했습니다.

ethers.js에는 SHA256(https://docs.ethers.io/v5/api/utils/hashing/) 이 있습니다.

const { ethers } = require('ethers');
ethers.utils.sha256(ethers.utils.toUtf8Bytes('txt'));

언급URL : https://stackoverflow.com/questions/18338890/are-there-any-sha-256-javascript-implementations-that-are-generally-considered-t

반응형