Chiến lược giữ thông tin bí mật như khóa API ngoài tầm kiểm soát nguồn?


217

Tôi đang làm việc trên một trang web cho phép người dùng đăng nhập bằng thông tin đăng nhập OAuth từ Twitter, Google, v.v. Để làm điều này, tôi phải đăng ký với các nhà cung cấp khác nhau này và nhận khóa API siêu bí mật mà tôi có để bảo vệ với các cam kết chống lại các bộ phận cơ thể khác nhau. Nếu khóa của tôi bị gank, phần đó sẽ bị giật.

Khóa API phải di chuyển với nguồn của tôi, vì nó được sử dụng trong thời gian chạy để thực hiện các yêu cầu xác thực. Trong trường hợp của tôi, khóa phải tồn tại trong ứng dụng trong tệp cấu hình hoặc trong chính mã. Đó không phải là vấn đề khi tôi xây dựng và xuất bản từ một máy duy nhất. Tuy nhiên, khi chúng ta ném kiểm soát nguồn vào hỗn hợp, mọi thứ trở nên phức tạp hơn.

Vì tôi là một thằng khốn rẻ tiền, tôi rất thích sử dụng các dịch vụ kiểm soát nguồn miễn phí như TFS trên đám mây hoặc GitHub. Điều này để lại cho tôi một câu hỏi hóc búa:

Làm cách nào tôi có thể giữ cho cơ thể của mình nguyên vẹn khi các khóa API nằm trong mã của tôi và mã của tôi có sẵn trong kho lưu trữ công cộng?

Tôi có thể nghĩ ra một số cách để xử lý việc này, nhưng không có cách nào thỏa mãn.

  • Tôi có thể xóa tất cả thông tin cá nhân khỏi mã và chỉnh sửa lại sau khi triển khai. Đây sẽ là một nỗi đau nghiêm trọng để thực hiện (tôi sẽ không nêu chi tiết theo nhiều cách) và không phải là một lựa chọn.
  • Tôi có thể mã hóa nó. Nhưng khi tôi phải giải mã nó, bất kỳ ai có nguồn đều có thể tìm ra cách để làm như vậy. Vô nghĩa.
  • Tôi có thể trả tiền cho kiểm soát nguồn tư nhân. LOL j / k tiêu tiền? Xin vui lòng.
  • Tôi có thể sử dụng các tính năng ngôn ngữ để tách biệt thông tin nhạy cảm với phần còn lại của nguồn và do đó giữ nó khỏi kiểm soát nguồn. Đây là những gì tôi đang làm bây giờ, nhưng nó có thể dễ dàng bị làm hỏng bằng cách kiểm tra nhầm trong tệp bí mật.

Tôi thực sự đang tìm kiếm một cách bảo đảm để đảm bảo rằng tôi không chia sẻ thông tin cá nhân của mình với thế giới (ngoại trừ snapchat) sẽ hoạt động trơn tru thông qua phát triển, gỡ lỗi và triển khai và cũng có thể dễ dàng thực hiện. Điều này là hoàn toàn không thực tế. Vậy thực tế tôi có thể làm gì?

Chi tiết kỹ thuật: VS2012, C # 4.5, kiểm soát nguồn sẽ là dịch vụ TF hoặc GitHub. Hiện đang sử dụng một lớp một phần để tách các khóa nhạy cảm trong một tệp .cs riêng biệt sẽ không được thêm vào kiểm soát nguồn. Tôi nghĩ GitHub có thể có lợi thế vì .gitignore có thể được sử dụng để đảm bảo rằng tệp lớp một phần không được kiểm tra, nhưng tôi đã làm hỏng nó trước đó. Hy vọng cho một "ồ, vấn đề chung, đây là cách bạn làm điều đó" nhưng tôi có thể phải giải quyết cho "điều đó không hút nhiều như nó có thể có" ,: /


6
Bạn có thể chắc chắn rằng tệp cấu hình chứa khóa API của bạn không nằm trong thư mục được kiểm soát nguồn, điều này sẽ khiến bạn không thể kiểm tra nó ở vị trí đầu tiên.
David Sergey

22
BitBucket.org có kho riêng tư không giới hạn. Miễn phí. Và nhà nhập khẩu kho gitHub (lưu giữ lịch sử)
Rob van der Veer

4
@Dainius Tôi không tin tưởng các nhà phát triển của mình vì tôi biết họ. Thân mật. Trên thực tế, tôi thân mật với bản thân mình ít nhất là ... không, tôi sẽ để người đó nói dối. Nhưng tôi biết làm thế nào dễ dàng để vặn lên, và sẽ khó khăn như thế nào để xóa lịch sử của vít nói.
Sẽ

15
@Dainius: Vâng. Tôi nhìn vào mỗi nhân vật mã nhóm của tôi. Nghiêm túc. Tôi không có lựa chọn. Tôi không thể bịt mắt. Không đáng tin cậy, ít nhất. Nhưng tôi làm, bởi vì tôi là đội của tôi. Tôi là tôi trong ĐỘI. Có một nhà phát triển, và đó là tôi. Tôi là anh ấy. Đúng. Tôi là người sẽ làm hỏng việc này nếu anh ta không làm đúng. Tôi.
Sẽ

3
Tại sao bạn lại cố gắng biên dịch khóa thành mã ở vị trí đầu tiên? Thông thường để đặt loại điều đó trong một tệp cấu hình.
Donal Fellows

Câu trả lời:


128

Đừng để thông tin bí mật của bạn vào mã của bạn. Đặt nó vào một tệp cấu hình được đọc bởi mã của bạn khi khởi động. Các tệp cấu hình không nên được đặt trong kiểm soát phiên bản, trừ khi chúng là "mặc định của nhà máy", và sau đó chúng không nên có bất kỳ thông tin riêng tư nào.

Xem thêm câu hỏi Kiểm soát phiên bản và tệp cấu hình cá nhân để biết cách thực hiện tốt điều này.


8
@RobertHarvey bằng cách không đưa nó vào kiểm soát phiên bản, thêm quy tắc bỏ qua khi cần thiết. Bất cứ ai sử dụng phần mềm đều phải xây dựng tệp cấu hình của riêng họ bằng khóa API riêng.
Philipp

10
Vì vậy, khi bạn đi xây dựng và tạo một bản phân phối phần mềm của mình, làm thế nào bạn chắc chắn rằng nó có kèm theo một tệp cấu hình không? Trừ khi bạn có một số tệp với mặc định hợp lý, thường thì không hợp lý để mong đợi người dùng của bạn trải qua quá trình tạo tệp cấu hình.
Thomas Owens

4
Chà, mặc định của nhà máy là một phần, "trình cài đặt" hoặc "trình hướng dẫn chạy đầu tiên" một phần khác
johannes

6
Nếu nhiều người dùng có cài đặt riêng, họ có nên tạo và sử dụng khóa API của riêng họ không? Nhiều trang web / cài đặt sử dụng cùng một khóa có lẽ là một ý tưởng tồi. Nếu chỉ là một cài đặt, thì việc sử dụng tệp cấu hình không phải là một rắc rối lớn.
Mike Weller

10
@ Sẽ, nếu bạn không thể làm điều này vì tính không thực tế của chi tiết triển khai, thì tôi sẽ nói đơn giản là bạn không có công cụ thích hợp để triển khai. Việc triển khai bằng cách sử dụng tệp cấu hình bí mật không được lưu trữ sẽ hoàn toàn không gây đau đớn. Tôi không thể đưa ra lời khuyên cụ thể cho bạn vì tôi sống trong hệ sinh thái Ruby, không phải C #. Nhưng người Ruby có xu hướng sử dụng Capistrano cho các triển khai tự động. Tôi chắc chắn C # cũng có công cụ để triển khai tự động và điều này sẽ giúp quá trình này trở nên dễ dàng.
Ben Lee

29

Bạn có thể đặt tất cả các khóa riêng / được bảo vệ làm biến môi trường hệ thống. Tệp cấu hình của bạn sẽ trông như thế này:

private.key=#{systemEnvironment['PRIVATE_KEY']}

Đây là cách chúng tôi xử lý các trường hợp đó và không có gì đi vào mã. Nó hoạt động rất tốt kết hợp với các tập tin và hồ sơ tài sản khác nhau. Chúng tôi sử dụng các tệp thuộc tính khác nhau cho các môi trường khác nhau. Trong môi trường phát triển cục bộ của chúng tôi, chúng tôi đặt các khóa phát triển trong các tệp thuộc tính để đơn giản hóa việc thiết lập cục bộ:

private.key=A_DEVELOPMENT_LONG_KEY

Đây sẽ là một giải pháp hợp lý nếu tôi có thể làm cho nó hoạt động với tùy chọn lưu trữ của mình. Không phải là biến môi trường, nhưng có lẽ một số cặp cấu hình khóa / giá trị không bị xóa sau khi xuất bản ...
Sẽ

Làm thế nào về việc đặt các biến môi trường trong máy chủ xây dựng của bạn trước khi chuyển đến môi trường sống? Bằng cách đó, bạn sẽ sẵn sàng cho các tệp tài nguyên / cấu hình sản xuất.
Ioannis Tzikas

Máy chủ xây dựng là máy phát triển, đó là lý do tại sao tôi lo ngại về thông tin này có thể vô tình bị kiểm tra vào kiểm soát nguồn.
Sẽ

Vấn đề với điều này có thể là môi trường có thể đọc được bởi bất kỳ ai trên máy chủ.
JasonG

Người dùng hoặc người dùng chỉ có thể đọc được thông tin của người dùng. (Linux cổ đại và AIX đã không làm điều này tuy nhiên)
Neil McGuigan

27

Cách Git tinh khiết

  • .gitignore bao gồm tập tin với dữ liệu riêng tư
  • Sử dụng một chi nhánh địa phương, trong đó bạn thay thế TEMPLATEbằngDATA
  • Sử dụng bộ lọc smudge / clean, trong đó tập lệnh của bộ lọc (cục bộ) thực hiện thay thế hai chiều TEMPLATE<->DATA

Cách thủy

  • MQ-patch (es) trên đầu mã giả, thay thế TEMPLATEbằng DATA( thay đổi là công khai, bản vá là riêng tư)
  • Mở rộng từ khóa với các từ khóa được thiết kế đặc biệt (chỉ mở rộng trong thư mục làm việc của bạn )

Cách thức bất khả tri

  • Thay thế các từ khóa như là một phần của quá trình xây dựng / triển khai

Hmmm ... Lời khuyên git là tốt, và lời khuyên bất khả tri của bạn cho tôi một ý tưởng hay ... Tôi có thể sử dụng các sự kiện xây dựng để giới thiệu tệp vào quy trình xuất bản, sau đó xóa nó sau, do đó giúp đảm bảo rằng nó sẽ không vô tình được thêm vào kiểm soát nguồn ..
Will

7
Không, không và một lần nữa - không! bỏ qua các tập tin là tốt để thêm một số tùy chỉnh rất cụ thể để xây dựng quy trình hoặc một cái gì đó, nhưng nó không bao giờ được sử dụng để lưu trữ bất kỳ dữ liệu an toàn. Không lưu trữ dữ liệu an toàn trong repo, ngay cả khi bạn đang bỏ qua nó.
shabunc

11
@shabunc - RTFM! Tập tin bị bỏ qua không được lưu trữ trong repo
Lazy Badger

9
@LazyBadger - Tôi biết khá rõ nó bị bỏ qua. Tôi cũng biết rằng, khi ở trong repo, luôn luôn có cơ hội rằng ai đó sẽ không bao giờ nhầm lẫn sẽ thêm nó bằng cách nào đó để repo. Một số đường dẫn cấu hình bên ngoài là cách tốt hơn.
shabunc

4
@shabunc - Điểm tốt trong việc giữ cấu hình khỏi đường dẫn SCM. Đây là lý do tại sao, ví dụ, Postgres cho phép bạn bỏ qua kiểm tra mật khẩu bằng cách đặt mật khẩu vào một tệp. Nhưng họ yêu cầu tệp mật khẩu phải được đặt trong ~ / .pgpass - có lẽ không phải là vị trí rất thuận tiện để kiểm tra kiểm soát nguồn. Họ biết, để tự động hóa, họ phải đưa cho bạn một khẩu súng, nhưng họ làm việc chăm chỉ để ngăn bạn tự bắn vào chân mình ..
Steve Midgley

14

Tôi đặt bí mật vào (các) tệp được mã hóa mà sau đó tôi cam kết. Cụm mật khẩu được cung cấp khi hệ thống khởi chạy hoặc được lưu trong tệp nhỏ mà tôi không cam kết. Thật tuyệt khi Emacs sẽ vui vẻ quản lý các tệp được mã hóa này. Ví dụ: tệp init của emacs bao gồm: (tải "secret.el.gpg"), chỉ hoạt động - nhắc tôi nhập mật khẩu vào những lần hiếm hoi đó khi tôi khởi động trình chỉnh sửa. Tôi không lo lắng về việc ai đó phá vỡ mã hóa.


3
Đây là một giải pháp tuyệt vời - Tôi ngạc nhiên khi bạn không có nhiều phiếu bầu hơn. Tôi làm việc với một công ty liên quan đến dữ liệu sinh viên, được liên bang quy định tại Mỹ, vì vậy họ phải hết sức cẩn thận với các thông tin và bí mật. Họ cũng là một công ty lớn nên họ cần sử dụng SCM cho thông tin đăng nhập để CNTT có thể tìm / quản lý chúng sau khi engr xây dựng chúng. Giải pháp của bạn là chính xác những gì họ làm. Họ có các tệp khóa giải mã giữ các khóa giải mã cho dev / staging / prod / etc (một tệp cho mỗi tệp). Sau đó, tất cả các bí mật được mã hóa và kiểm tra vào các tập tin. Các tập tin giải mã được sử dụng để có được chúng trong mỗi môi trường.
Steve Midgley

7
Vâng, trong một số trường hợp, mã hóa bí mật (khóa API trong trường hợp này) chỉ chuyển vấn đề từ không cam kết dữ liệu bí mật sang không thực hiện cụm từ mật khẩu (hiện trở thành dữ liệu bí mật ). Nhưng tất nhiên, yêu cầu nó khởi chạy hệ thống là một lựa chọn tốt.
siegi

Tôi thích giải pháp này. Loại tệp được mã hóa mà bạn cam kết có thể là tệp KeePass. Nó sẽ có một mục nhập cho từng môi trường, sử dụng notestrường để lưu trữ nội dung của tệp .env. Vài tháng trước, tôi đã viết một công cụ có thể đọc tệp Keepass và tạo tệp .env bằng cách sử dụng notestrường của một mục nhập. Tôi đang nghĩ đến việc thêm một tính năng để tôi có thể thực hiện require('switchenv').env()ở đầu chương trình Node.js và tạo các biến process.env dựa trên mục nhập khớp với NODE_ENV hoặc đại loại như thế. -> github.com/christiaanwesterbeek/swovev
Christiaan Westerbeek

14

Điều này rất cụ thể cho Android / Gradle nhưng bạn có thể xác định các khóa trong gradle.propertiestệp toàn cầu của mình nằm trong user home/.gradle/. Điều này cũng hữu ích vì bạn có thể sử dụng các thuộc tính khác nhau tùy thuộc vào buildType hoặc hương vị tức là API cho dev và khác nhau để phát hành.

gradle.properies

MY_PRIVATE_API_KEY=12356abcefg

xây dựng. nâng cấp

buildTypes {
        debug{
            buildConfigField("String", "GOOGLE_VERIFICATION_API_KEY", "\"" + MY_PRIVATE_API_KEY +"\"")
            minifyEnabled false
            applicationIdSuffix ".debug"
            }
        }

Trong mã bạn tham khảo như thế này

String myAPI = BuildConfig.GOOGLE_VERIFICATION_API_KEY;

BuildConfig dịch sang tệp nguồn tương ứng, do đó kỹ thuật đảo ngược đơn giản trên apk của bạn sẽ tiết lộ tất cả các khóa và bí mật mà bạn đã đưa vào BuildConfig
Dmitri Livotov vào

1
Thật vậy, một điểm hợp lệ. Nhưng câu hỏi là làm thế nào để giữ các khóa api khỏi mã nguồn không phải là nhị phân.
scottyab

11

Bạn không nên phân phối khóa đó với ứng dụng của mình hoặc lưu trữ nó trong kho mã nguồn. Câu hỏi này là hỏi làm thế nào để làm điều đó, và đó không phải là những gì thường được thực hiện.

Ứng dụng web di động

Đối với Android / iPhone, thiết bị nên yêu cầu KEY từ dịch vụ web của riêng bạn khi ứng dụng được chạy lần đầu tiên. Chìa khóa sau đó được lưu trữ ở một vị trí an toàn. Nếu nhà xuất bản thay đổi hoặc thu hồi khóa. Dịch vụ web của bạn có thể xuất bản một khóa mới.

Ứng dụng web được lưu trữ

Khách hàng sử dụng giấy phép phần mềm của bạn sẽ phải nhập khóa thủ công khi lần đầu tiên định cấu hình phần mềm. Bạn có thể cung cấp cho tất cả mọi người cùng một khóa, các khóa khác nhau hoặc họ có được riêng của họ.

Mã nguồn được công bố

Bạn lưu trữ mã nguồn của bạn trong một kho lưu trữ công cộng nhưng không phải là KEY. Trong cấu hình của tệp, bạn thêm dòng * phím địa điểm ở đây * . Khi nhà phát triển sử dụng mã nguồn của bạn, họ tạo một bản sao của sample.cfgtệp và thêm khóa riêng của họ.

Bạn không giữ config.cfgtệp của bạn được sử dụng để phát triển hoặc sản xuất trong kho lưu trữ.


4
Câu hỏi này là hỏi làm thế nào để làm điều đó không, nó hoàn toàn KHÔNG. Thực tế là các khóa này cần được sử dụng bởi mã, do đó được truy cập bằng mã và điều đó thường có nghĩa là thông qua mã hoặc tệp cấu hình, nếu chúng không có trong nguồn với nhau thì ít nhất chúng sẽ ở gần nhau và có thể vô tình kết thúc nguồn. Các ứng dụng web được lưu trữ là vô nghĩa, không may. Bạn không cần phải đăng ký khóa api để đăng nhập vào StackOverflow thông qua tài khoản facebook (giả định) của mình. chìa khóa địa điểm ở đây là một sự đơn giản hóa quá lớn sẽ không hoạt động trong môi trường dev-> pub như được mô tả trong Q.
Will

Tôi đã trả lời chính xác câu hỏi, cũng như nhiều người khác. Thực tế là bạn chưa chấp nhận một trong số chúng ngụ ý rằng bạn không hiểu cách làm việc với các phím này.
Phản ứng

7
Vậy thì làm thế nào để chúng ta bảo vệ dịch vụ web xuất bản khóa? Sử dụng chìa khóa khác?
Jiangge Zhang

Ditto những gì @JianggeZhang nói - đây là lời khuyên nguy hiểm
David K. Hess

5

Sử dụng các biến môi trường cho những thứ bí mật thay đổi cho mỗi máy chủ.

http://en.wikipedia.org/wiki/En Môi_variable

Làm thế nào để sử dụng chúng là phụ thuộc ngôn ngữ.


3
Bảo mật thông qua che khuất không phải là một cách tiếp cận được khuyến nghị cho nhiều người. Bạn có quan tâm đến việc giải thích câu trả lời của bạn rõ ràng hơn không?

2
Điều đó không tối nghĩa, các biến môi trường chỉ khả dụng cho người dùng bạn đã thêm chúng, vì vậy tất cả thông tin đăng nhập của bạn có cùng sự bảo vệ đối với bối cảnh người dùng mà ứng dụng của bạn đang chạy. Tôi đã cập nhật câu trả lời để bao gồm khái niệm về các biến môi trường. Điều đó rõ ràng hơn?
Filipe Giusti

4

Tôi nghĩ rằng đây là một vấn đề mọi người đã gặp một số rắc rối tại một số điểm.

Đây là một quy trình công việc tôi đã sử dụng, có thể làm việc cho bạn. Nó sử dụng .gitignore với một twist:

  1. Tất cả các tệp cấu hình đi trong một thư mục đặc biệt (tệp cấu hình w / mẫu - tùy chọn)
  2. Tất cả các tệp cấu hình được bao gồm trong .gitignore, để chúng không bị công khai
  3. Thiết lập một máy chủ gitolite (hoặc máy chủ git yêu thích của bạn) trên một hộp riêng
  4. Thêm một repo với tất cả các tập tin cấu hình trong máy chủ riêng
  5. Thêm một tập lệnh để sao chép tập tin cấu hình vào thư mục đặc biệt trong repo chính (tùy chọn)

Bây giờ, bạn có thể sao chép repo cấu hình cho bất kỳ hệ thống phát triển và triển khai nào. Chỉ cần chạy tập lệnh để sao chép các tập tin vào đúng thư mục và bạn đã hoàn thành.

Bạn vẫn nhận được tất cả kẹo GitHub, chia sẻ mã của mình với mọi người và dữ liệu nhạy cảm không bao giờ có trong repo chính, vì vậy chúng không được công khai. Chúng vẫn chỉ là một cái kéo và một bản sao từ bất kỳ hệ thống triển khai nào.

Tôi sử dụng hộp 15 $ / năm cho máy chủ git riêng, nhưng bạn cũng có thể thiết lập một hộp tại nhà, theo yêu cầu giá rẻ ;-)

PS: Bạn cũng có thể sử dụng một mô hình con git ( http://git-scm.com/docs/git-submodule ), nhưng tôi luôn quên các lệnh, vì vậy các quy tắc nhanh và bẩn!


2

Sử dụng mã hóa, nhưng cung cấp khóa chính khi khởi động, làm mật khẩu tại bàn điều khiển, trong một tệp chỉ người dùng của quá trình có thể đọc hoặc từ kho lưu trữ khóa do hệ thống cung cấp như khóa Mac OS hoặc lưu trữ khóa Windows.

Để giao hàng liên tục, bạn sẽ muốn các khóa khác nhau được ghi ở đâu đó. Cấu hình nên được phân ranh giới từ mã, nhưng nó rất có ý nghĩa để giữ nó dưới sự kiểm soát sửa đổi.


1

3 chiến lược, chưa được đề cập (?)

Khi đăng ký hoặc trong móc kiểm tra trước VCS

  • tìm kiếm các chuỗi có entropy cao, ví dụ- phát hiện-bí mật
  • tìm kiếm regex cho các mẫu khóa API nổi tiếng. Các khóa AKIA * của AWS là một ví dụ, git- secret là một công cụ dựa trên điều đó. Ngoài ra, tên biến như 'mật khẩu' với gán liên tục.
  • tìm kiếm những bí mật đã biết - bạn biết những bí mật của mình, tìm kiếm văn bản cho chúng. Hoặc sử dụng một công cụ, tôi đã viết bằng chứng về khái niệm này .

Các chiến lược đã được đề cập

  • lưu trữ trong tập tin bên ngoài cây nguồn
  • có nó trong cây nguồn, nhưng nói với VCS bỏ qua nó
  • biến môi trường là một biến thể của việc lưu trữ dữ liệu bên ngoài cây nguồn
  • chỉ không cung cấp những bí mật có giá trị cho các nhà phát triển

0

Giữ thông tin riêng tư ngoài tầm kiểm soát nguồn của bạn. Tạo một mặc định không được tải để phân phối và để VCS của bạn bỏ qua cái thực. Quá trình cài đặt của bạn (cho dù là thủ công, cấu hình / xây dựng hoặc trình hướng dẫn) sẽ xử lý việc tạo và điền tệp mới. Tùy chọn sửa đổi quyền trên tệp để đảm bảo chỉ người dùng được yêu cầu (máy chủ web?) Có thể đọc được.

Những lợi ích:

  • Không giả định thực thể phát triển == thực thể sản xuất
  • Không cho rằng tất cả các cộng tác viên / người đánh giá mã đều đáng tin cậy
  • Ngăn chặn những lỗi dễ dàng bằng cách giữ nó ngoài tầm kiểm soát của phiên bản
  • Dễ dàng tự động cài đặt với cấu hình tùy chỉnh cho QA / bản dựng

Nếu bạn đang làm điều này và đang vô tình kiểm tra nó, hãy thêm nó vào dự án của bạn .gitignore. Điều này sẽ làm cho nó không thể làm lại.

rất nhiều vạn quân Git miễn phí xung quanh cung cấp kho tư nhân. Mặc dù bạn không bao giờ nên phiên bản thông tin đăng nhập của mình, bạn cũng có thể có giá rẻ và có repos riêng. ^ _ ^


-2

Thay vì có khóa OAuth được lưu trữ dưới dạng dữ liệu thô ở bất cứ đâu, tại sao bạn không chạy chuỗi thông qua một số thuật toán mã hóa và lưu trữ dưới dạng băm muối? Sau đó sử dụng một tập tin cấu hình để khôi phục nó trong thời gian chạy. Bằng cách đó, khóa không được lưu trữ ở bất cứ đâu, cho dù nó được lưu trữ trên hộp phát triển hay chính máy chủ.

Bạn thậm chí có thể tạo một API sao cho máy chủ của bạn tự động tạo khóa API được băm và băm mới trên cơ sở mỗi yêu cầu, theo cách đó, thậm chí nhóm của bạn không thể nhìn thấy nguồn OAuth.

Chỉnh sửa: Có thể thử Thư viện mã hóa Javascript của Stanford , nó cho phép một số mã hóa / giải mã đối xứng khá an toàn.


1
Băm nói chung là một cách tranh giành. Có những thuật toán mã hóa đối xứng sẽ làm như bạn đề xuất mặc dù.

3
Anh bạn, bạn không thể giải mã (dễ dàng) một hàm băm. Đó là toàn bộ điểm băm. Điều này là để ME tiêu thụ API của người khác, nơi họ gán cho tôi một khóa bí mật. Việc băm của tôi đảm bảo (trừ khi tôi chọn một thuật toán kém và bẻ khóa nó mỗi lần) rằng tôi không thể sử dụng API của họ.
Sẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.